Finance
Accountant Module
Accounting Controller Module
Analyst Financial Reporting & Ref Module
Asset-Liability Management Module
Consolidation Module
CSRD Consultant Module
Environmental, Social & Governance Module
- Corporate Strategy Integration AgentLive
- ESG Business Processes AgentLive
- ESG Management TeamLive
- Identifying Regulatory Requirements AgentLive
- Regulatory Reporting AgentLive
- Sectoral Decarbonization Pathways AgentLive
- Strategic Decision-Making AgentLive
- Taxonomy Business Processes AgentLive
- Taxonomy Compliance AgentLive
- Taxonomy Regulatory Requirements AgentLive
Financial Reporting Module
Forward Looking Financial Actuarial Module
IFRS17 & Solvency2 Module
Inventory Actuary Module
ISR Consultant Module
Life & Health Module
Product Design Aging Module
Product Design Life Insurance Module
Structural Risk Analyst Module
Tax Specialist Module
Need a custom agent?
Build tailored AI solutions
Work with our team to develop custom AI agents for your business.
Contact usTreasury ALM Risk Controller
The Treasury & ALM Risk Controller provides comprehensive oversight of treasury operations and ensures compliance with ALM policies and regulatory requirements. It monitors FX exposures, counterparty credit risk, and tracks key ALM metrics (liquidity ratios, interest rate exposure, capital ratios). The agent maintains financial equilibrium by balancing liquidity, interest rate, and capital considerations.
Instructions
Step 1: Treasury Risk Assessment
- Input: Cash placements, investments, FX exposures, and counterparty data.
- Tool: calculate_fx_counterparty_risk
- Action: Monitor counterparty credit risk and FX exposures, validate compliance with exposure limits per counterparty and currency.
Step 2: ALM Metrics Monitoring
- Input: Balance sheet data, liquidity ratios, interest rate exposure, and capital ratios.
- Tool: calculate_alm_metrics
- Action: Calculate and monitor key ALM metrics (LCR, NSFR, NII sensitivity, EVE sensitivity, capital ratios), identify deviations from ALM policy.
Step 3: ALM Policy Compliance Validation
- Input: Current ALM metrics, risk limits, and regulatory requirements.
- Action: Validate that all operations comply with internal ALM policy and regulatory standards, ensure balance sheet adjustments remain within defined risk appetite.
Step 4: Financial Equilibrium Assessment
- Input: Integrated view of liquidity, interest rate, and capital positions.
- Action: Evaluate trade-offs between profitability and risk exposure, provide recommendations to maintain balance between liquidity, interest rate, and capital considerations, alert senior management to any compliance issues or risk limit breaches.Knowledge Base (.md)
Business reference guide
Drag & Drop or Click
.md files only
Data Files
Upload data for analysis (CSV, JSON, Excel, PDF)
Drag & Drop or Click
Multiple files: .json, .csv, .xlsx, .pdf
Tools 4
calculate_fx_counterparty_risk
Calculate FX and counterparty credit risk exposures.
Args:
exposures: Cash placements, investments, and FX positions with counterparty details
Returns:
FX and counterparty risk assessment report
calculate_fx_counterparty_risk
Calculate FX and counterparty credit risk exposures. Args: exposures: Cash placements, investments, and FX positions with counterparty details Returns: FX and counterparty risk assessment report
def calculate_fx_counterparty_risk(exposures: str) -> str: """ Calculate FX and counterparty credit risk exposures. Args: exposures: Cash placements, investments, and FX positions with counterparty details Returns: FX and counterparty risk assessment report """ try: import json if isinstance(exposures, str): try: data = json.loads(exposures) except json.JSONDecodeError: return "Error: Invalid JSON format for exposures" else: data = exposures positions = data.get('positions', []) "color: #6b7280;"># Aggregate by counterparty and currency counterparty_exposure = {} currency_exposure = {} for pos in positions: counterparty = pos.get('counterparty', 'Unknown') currency = pos.get('currency', 'USD') amount = pos.get('amount', 0) "color: #6b7280;"># Counterparty aggregation if counterparty not in counterparty_exposure: counterparty_exposure[counterparty] = 0 counterparty_exposure[counterparty] += amount "color: #6b7280;"># Currency aggregation if currency not in currency_exposure: currency_exposure[currency] = 0 currency_exposure[currency] += amount total_exposure = sum(counterparty_exposure.values()) report = "=== FX & COUNTERPARTY RISK ASSESSMENT ===\n\n" "color: #6b7280;"># Counterparty concentration report += "COUNTERPARTY EXPOSURE:\n" report += f"{'Counterparty':<30} {'Exposure':>15} {'% of Total':>12} {'Status':>10}\n" report += "-" * 67 + "\n" for counterparty, exposure in sorted(counterparty_exposure.items(), key=lambda x: x[1], reverse=True): pct = exposure / total_exposure * 100 if total_exposure > 0 else 0 status = "⚠️" if pct > 10 else "✓" report += f"{counterparty:<30} {exposure:>15,.2f} {pct:>11.1f}% {status:>10}\n" "color: #6b7280;"># Currency exposure report += "\nFX EXPOSURE BY CURRENCY:\n" report += f"{'Currency':<15} {'Net Position':>15} {'% of Total':>12}\n" report += "-" * 42 + "\n" for currency, position in sorted(currency_exposure.items(), key=lambda x: abs(x[1]), reverse=True): pct = abs(position) / total_exposure * 100 if total_exposure > 0 else 0 report += f"{currency:<15} {position:>15,.2f} {pct:>11.1f}%\n" "color: #6b7280;"># Risk assessment report += "\n=== RISK ASSESSMENT ===\n" high_concentration = [cp for cp, exp in counterparty_exposure.items() if exp / total_exposure > 0.10] if high_concentration: report += f"\n⚠️ High counterparty concentration detected: {', '.join(high_concentration)}\n" report += "Recommendation: Diversify counterparty exposures to reduce concentration risk.\n" non_base_currency = sum(abs(exp) for curr, exp in currency_exposure.items() if curr != 'USD') fx_ratio = non_base_currency / total_exposure if total_exposure > 0 else 0 if fx_ratio > 0.20: report += f"\n⚠️ Significant FX exposure: {fx_ratio*100:.1f}% in non-base currencies.\n" report += "Recommendation: Consider FX hedging strategies(forwards, options, natural hedges).\n" if not high_concentration and fx_ratio <= 0.20: report += "\n✓ Counterparty and FX risks within acceptable limits.\n" report += "Continue monitoring exposures regularly.\n" return report except Exception as e: return f"Error calculating FX counterparty risk: {str(e)}"
calculate_alm_metrics
Calculate comprehensive ALM metrics.
Args:
balance_sheet_data: Complete balance sheet with all required data
Returns:
Comprehensive ALM metrics report
calculate_alm_metrics
Calculate comprehensive ALM metrics. Args: balance_sheet_data: Complete balance sheet with all required data Returns: Comprehensive ALM metrics report
def calculate_alm_metrics(balance_sheet_data: str) -> str: """ Calculate comprehensive ALM metrics. Args: balance_sheet_data: Complete balance sheet with all required data Returns: Comprehensive ALM metrics report """ try: import json if isinstance(balance_sheet_data, str): try: data = json.loads(balance_sheet_data) except json.JSONDecodeError: return "Error: Invalid JSON format" else: data = balance_sheet_data "color: #6b7280;"># Extract data assets = data.get('assets', []) liabilities = data.get('liabilities', []) capital = data.get('capital', {}) total_assets = sum(a.get('amount', 0) for a in assets) total_liabilities = sum(l.get('amount', 0) for l in liabilities) "color: #6b7280;"># Liquidity metrics liquid_assets = sum(a.get('amount', 0) for a in assets if a.get('liquid', False)) stable_funding = sum(l.get('amount', 0) for l in liabilities if l.get('stable', True)) lcr = liquid_assets / (total_liabilities * 0.30) if total_liabilities > 0 else 0 "color: #6b7280;"># Simplified LCR nsfr = stable_funding / total_assets if total_assets > 0 else 0 "color: #6b7280;"># Simplified NSFR "color: #6b7280;"># Capital metrics rwa = sum(a.get('amount', 0) * a.get('risk_weight', 1.0) for a in assets) total_capital = sum(capital.values()) if isinstance(capital, dict) else capital cet1_ratio = (capital.get('cet1', 0) / rwa * 100) if rwa > 0 else 0 tier1_ratio = ((capital.get('cet1', 0) + capital.get('at1', 0)) / rwa * 100) if rwa > 0 else 0 total_capital_ratio = (total_capital / rwa * 100) if rwa > 0 else 0 leverage_ratio = (total_capital / total_assets * 100) if total_assets > 0 else 0 "color: #6b7280;"># Interest rate metrics asset_duration = sum(a.get('amount', 0) * a.get('duration', 3) for a in assets) / total_assets if total_assets > 0 else 0 liability_duration = sum(l.get('amount', 0) * l.get('duration', 2) for l in liabilities) / total_liabilities if total_liabilities > 0 else 0 duration_gap = asset_duration - liability_duration report = "=== COMPREHENSIVE ALM METRICS ===\n\n" "color: #6b7280;"># Liquidity Metrics report += "LIQUIDITY METRICS:\n" report += f" Liquidity Coverage Ratio(LCR): {lcr*100:.1f}% (Minimum: 100%)\n" report += f" Net Stable Funding Ratio(NSFR): {nsfr*100:.1f}% (Minimum: 100%)\n" report += f" Liquid Assets: {liquid_assets:,.2f}\n\n" "color: #6b7280;"># Capital Metrics report += "CAPITAL METRICS:\n" report += f" CET1 Ratio: {cet1_ratio:.2f}% (Minimum: 8%)\n" report += f" Tier 1 Ratio: {tier1_ratio:.2f}% (Minimum: 10%)\n" report += f" Total Capital Ratio: {total_capital_ratio:.2f}% (Minimum: 12%)\n" report += f" Leverage Ratio: {leverage_ratio:.2f}% (Minimum: 3%)\n\n" "color: #6b7280;"># Interest Rate Risk report += "INTEREST RATE RISK METRICS:\n" report += f" Asset Duration: {asset_duration:.2f} years\n" report += f" Liability Duration: {liability_duration:.2f} years\n" report += f" Duration Gap: {duration_gap:.2f} years\n\n" "color: #6b7280;"># Compliance assessment report += "=== COMPLIANCE STATUS ===\n" issues = [] if lcr < 1.0: issues.append("⚠️ LCR below 100% minimum") if nsfr < 1.0: issues.append("⚠️ NSFR below 100% minimum") if cet1_ratio < 8: issues.append("⚠️ CET1 ratio below 8% minimum") if tier1_ratio < 10: issues.append("⚠️ Tier 1 ratio below 10% minimum") if leverage_ratio < 3: issues.append("⚠️ Leverage ratio below 3% minimum") if issues: report += "\nREGULATORY ISSUES DETECTED:\n" for issue in issues: report += f"{issue}\n" report += "\nRecommendation: Immediate action required to restore compliance.\n" else: report += "✓ All regulatory metrics within required thresholds.\n" report += "ALM position is compliant with current regulations.\n" "color: #6b7280;"># Duration gap assessment report += "\n=== INTEREST RATE POSITIONING ===\n" if abs(duration_gap) > 2: report += f"⚠️ Significant duration gap: {duration_gap:.2f} years\n" report += "Recommendation: Consider duration matching or hedging strategies.\n" else: report += f"✓ Duration gap within acceptable range: {duration_gap:.2f} years\n" return report except Exception as e: return f"Error calculating ALM metrics: {str(e)}"
file_tools
FileTools from agno framework
file_tools
FileTools from agno framework
websearch
DuckDuckGoTools is a convenience wrapper around WebSearchTools with the backend
defaulting to "duckduckgo".
Args:
enable_search (bool): Enable web search function.
enable_news (bool): Enable news search function.
modifier (Optional[str]): A modifier to be prepended to search queries.
fixed_max_results (Optional[int]): A fixed number of maximum results.
proxy (Optional[str]): Proxy to be used for requests.
timeout (Optional[int]): The maximum number of seconds to wait for a response.
verify_ssl (bool): Whether to verify SSL certificates.
timelimit (Optional[str]): Time limit for search results. Valid values:
"d" (day), "w" (week), "m" (month), "y" (year).
region (Optional[str]): Region for search results (e.g., "us-en", "uk-en", "ru-ru").
backend (Optional[str]): Backend to use for searching (e.g., "api", "html", "lite").
Defaults to "duckduckgo".
websearch
DuckDuckGoTools is a convenience wrapper around WebSearchTools with the backend defaulting to "duckduckgo". Args: enable_search (bool): Enable web search function. enable_news (bool): Enable news search function. modifier (Optional[str]): A modifier to be prepended to search queries. fixed_max_results (Optional[int]): A fixed number of maximum results. proxy (Optional[str]): Proxy to be used for requests. timeout (Optional[int]): The maximum number of seconds to wait for a response. verify_ssl (bool): Whether to verify SSL certificates. timelimit (Optional[str]): Time limit for search results. Valid values: "d" (day), "w" (week), "m" (month), "y" (year). region (Optional[str]): Region for search results (e.g., "us-en", "uk-en", "ru-ru"). backend (Optional[str]): Backend to use for searching (e.g., "api", "html", "lite"). Defaults to "duckduckgo".
Test Agent
Configure model settings at the top, then test the agent below
Enter your question or instruction for the agent