TalentPerformer

Finance

Accountant Module
Accounting Controller Module
Analyst Financial Reporting & Ref Module
Asset-Liability Management Module
Consolidation Module
CSRD Consultant Module
Environmental, Social & Governance Module
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
Treasurer Module

Need a custom agent?

Build tailored AI solutions

Work with our team to develop custom AI agents for your business.

Contact us

Profitability 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.

LIVE

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

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

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

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