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 usProfitability Optimizer
The Profitability Optimizer is responsible for maximizing the institution's profitability through yield optimization and funding cost reduction. It analyzes asset allocation strategies, evaluates funding mix, and recommends adjustments to improve net interest margin while maintaining compliance with liquidity and risk limits.
Instructions
Step 1: Yield Optimization Analysis
- Input: Current asset portfolio with yields, amounts, and risk characteristics.
- Tool: optimize_yield
- Action: Identify opportunities to increase portfolio yield by reallocating assets within risk limits and liquidity constraints.
Step 2: Funding Cost Analysis
- Input: Current liability structure with funding costs and maturity profiles.
- Tool: optimize_funding_cost
- Action: Evaluate funding mix and recommend strategies to reduce overall funding costs while maintaining diversification and regulatory compliance.
Step 3: Net Interest Margin Analysis
- Input: Projected yields and funding costs from optimization strategies.
- Action: Calculate expected net interest income and margin improvement from proposed changes.
Step 4: Risk-Adjusted Profitability Assessment
- Input: Optimization recommendations with associated risks.
- Action: Ensure all recommendations remain within risk tolerance (liquidity, credit, interest rate risk) and provide clear profitability improvement projections with risk considerations.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
optimize_yield
Optimize asset yield within risk and liquidity constraints.
Args:
asset_portfolio: Current asset portfolio with yields and amounts
constraints: Risk and liquidity constraints (JSON)
Returns:
Yield optimization recommendations
optimize_yield
Optimize asset yield within risk and liquidity constraints. Args: asset_portfolio: Current asset portfolio with yields and amounts constraints: Risk and liquidity constraints (JSON) Returns: Yield optimization recommendations
def optimize_yield(asset_portfolio: str, constraints: str = "{}") -> str: """ Optimize asset yield within risk and liquidity constraints. Args: asset_portfolio: Current asset portfolio with yields and amounts constraints: Risk and liquidity constraints(JSON) Returns: Yield optimization recommendations """ try: import json if isinstance(asset_portfolio, str): try: portfolio = json.loads(asset_portfolio) except json.JSONDecodeError: return "Error: Invalid JSON format for asset portfolio" else: portfolio = asset_portfolio if isinstance(constraints, str): try: const = json.loads(constraints) except json.JSONDecodeError: const = {} else: const = constraints assets = portfolio.get('assets', []) total_assets = sum(a.get('amount', 0) for a in assets) "color: #6b7280;"># Constraints min_liquidity_buffer = const.get('min_liquidity_buffer', 0.10) "color: #6b7280;"># 10% default max_concentration = const.get('max_concentration', 0.25) "color: #6b7280;"># 25% default "color: #6b7280;"># Calculate current metrics current_yield = sum( a.get('amount', 0) * a.get('yield', 0.05) for a in assets ) / total_assets if total_assets > 0 else 0 liquid_assets = sum( a.get('amount', 0) for a in assets if a.get('liquid', False) ) liquidity_ratio = liquid_assets / total_assets if total_assets > 0 else 0 report = "=== YIELD OPTIMIZATION ANALYSIS ===\n\n" report += f"Current Portfolio Yield: {current_yield*100:.2f}%\n" report += f"Total Assets: {total_assets:,.2f}\n" report += f"Liquidity Buffer: {liquidity_ratio*100:.2f}% (Minimum: {min_liquidity_buffer*100:.0f}%)\n\n" report += "=== OPTIMIZATION RECOMMENDATIONS ===\n\n" "color: #6b7280;"># Check liquidity buffer if liquidity_ratio < min_liquidity_buffer: report += f"⚠️ Liquidity buffer below minimum requirement({liquidity_ratio*100:.2f}% < {min_liquidity_buffer*100:.0f}%).\n" report += "Recommendation: Increase allocation to liquid assets before pursuing yield optimization.\n\n" else: excess_liquidity = (liquidity_ratio - min_liquidity_buffer) * total_assets report += f"✓ Excess liquidity available: {excess_liquidity:,.2f}\n" report += "Recommendation: Consider reallocating excess liquidity to higher-yielding assets:\n" report += " - Corporate bonds(investment grade)\n" report += " - Medium-term government securities\n" report += " - Diversified fixed-income funds\n" report += f" Potential yield improvement: +0.50% to +1.50%\n\n" "color: #6b7280;"># Check concentration for asset in assets: asset_concentration = asset.get('amount', 0) / total_assets if total_assets > 0 else 0 if asset_concentration > max_concentration: asset_name = asset.get('name', 'Unknown Asset') report += f"⚠️ Concentration risk: {asset_name} represents {asset_concentration*100:.1f}% of total assets(Max: {max_concentration*100:.0f}%).\n" report += f"Recommendation: Reduce {asset_name} allocation and diversify.\n\n" "color: #6b7280;"># Overall strategy report += "=== OVERALL STRATEGY ===\n" report += "1. Maintain minimum liquidity buffer at all times\n" report += "2. Avoid over-concentration(>25% in single asset class)\n" report += "3. Prioritize predictable cash flows aligned with liquidity needs\n" report += "4. Rebalance portfolio regularly based on market conditions\n" return report except Exception as e: return f"Error optimizing yield: {str(e)}"
optimize_funding_cost
Optimize funding cost through liability structure adjustment.
Args:
liability_structure: Current liability mix with costs and maturities
market_rates: Current market rates for different funding instruments
Returns:
Funding cost optimization recommendations
optimize_funding_cost
Optimize funding cost through liability structure adjustment. Args: liability_structure: Current liability mix with costs and maturities market_rates: Current market rates for different funding instruments Returns: Funding cost optimization recommendations
def optimize_funding_cost(liability_structure: str, market_rates: str = "{}") -> str: """ Optimize funding cost through liability structure adjustment. Args: liability_structure: Current liability mix with costs and maturities market_rates: Current market rates for different funding instruments Returns: Funding cost optimization recommendations """ try: import json if isinstance(liability_structure, str): try: liabilities = json.loads(liability_structure) except json.JSONDecodeError: return "Error: Invalid JSON format for liability structure" else: liabilities = liability_structure if isinstance(market_rates, str): try: rates = json.loads(market_rates) except json.JSONDecodeError: rates = {} else: rates = market_rates liabs = liabilities.get('liabilities', []) total_liabilities = sum(l.get('amount', 0) for l in liabs) "color: #6b7280;"># Calculate weighted average funding cost current_funding_cost = sum( l.get('amount', 0) * l.get('rate', 0.03) for l in liabs ) / total_liabilities if total_liabilities > 0 else 0 "color: #6b7280;"># Calculate structure mix short_term = sum(l.get('amount', 0) for l in liabs if l.get('maturity', '1Y+') in ['0-1M', '1-3M', '3-6M']) short_term_pct = short_term / total_liabilities * 100 if total_liabilities > 0 else 0 report = "=== FUNDING COST OPTIMIZATION ===\n\n" report += f"Current Weighted Average Funding Cost: {current_funding_cost*100:.2f}%\n" report += f"Total Liabilities: {total_liabilities:,.2f}\n" report += f"Short-term Funding(<6M): {short_term_pct:.1f}% (Recommended: <15%)\n\n" report += "Funding Structure:\n" report += f"{'Type':<25} {'Amount':>15} {'Rate':>10} {'% of Total':>12}\n" report += "-" * 62 + "\n" funding_types = {} for liab in liabs: liab_type = liab.get('type', 'Other') if liab_type not in funding_types: funding_types[liab_type] = {'amount': 0, 'cost': 0} funding_types[liab_type]['amount'] += liab.get('amount', 0) funding_types[liab_type]['cost'] += liab.get('amount', 0) * liab.get('rate', 0.03) for liab_type, data in funding_types.items(): avg_rate = data['cost'] / data['amount'] if data['amount'] > 0 else 0 pct_total = data['amount'] / total_liabilities * 100 if total_liabilities > 0 else 0 report += f"{liab_type:<25} {data['amount']:>15,.2f} {avg_rate*100:>9.2f}% {pct_total:>11.1f}%\n" report += "\n=== OPTIMIZATION RECOMMENDATIONS ===\n\n" "color: #6b7280;"># Check short-term concentration if short_term_pct > 15: report += f"⚠️ High short-term funding concentration({short_term_pct:.1f}%).\n" report += "Recommendation: Extend funding maturities to reduce refinancing risk.\n" report += " - Replace short-term wholesale with term deposits\n" report += " - Issue longer-term funding instruments\n\n" "color: #6b7280;"># Funding mix recommendations retail_deposits = funding_types.get('retail_deposits', {}).get('amount', 0) retail_pct = retail_deposits / total_liabilities * 100 if total_liabilities > 0 else 0 if retail_pct < 40: report += "💡 Opportunity: Increase retail deposit base(currently {retail_pct:.1f}%).\n" report += "Recommendation: Retail deposits typically offer lower cost and more stable funding.\n" report += " - Launch competitive deposit products\n" report += " - Enhance digital banking offerings\n\n" "color: #6b7280;"># Cost reduction potential wholesale_pct = funding_types.get('wholesale', {}).get('amount', 0) / total_liabilities * 100 if total_liabilities > 0 else 0 if wholesale_pct > 30: report += "💡 Opportunity: Reduce wholesale funding dependence.\n" report += "Recommendation: Diversify funding sources to reduce costs and concentration risk.\n\n" report += "=== EXPECTED IMPACT ===\n" report += "Potential funding cost reduction: 10-30 basis points\n" report += "Implementation: Gradual rebalancing over 6-12 months\n" report += "Monitor: Ensure changes maintain liquidity ratios and diversification\n" return report except Exception as e: return f"Error optimizing funding cost: {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