Skip to main content
Risk Budgeting goes beyond per-strategy RiskConfig and per-order compliance limits. It manages risk at the fund level, allocating a total risk budget across strategies and dynamically rebalancing as conditions change. The fund-level risk layer is fully operational.

Why It’s Needed

Per-strategy risk management has blind spots:
  • Strategy A and Strategy B might both be long on the same thesis
  • Each passes its own limits, but together they create concentrated risk
  • A fund-wide drawdown can happen even if no single strategy breaches its limits
  • Capital allocation should be proportional to expected risk-adjusted return

Risk Budget Architecture

Strategy A -- 30%

Used: 22% • Available: 8%

Strategy B -- 25%

Used: 25% (at limit) • Available: 0%

Strategy C -- 20%

Used: 10% • Available: 10%

Reserve -- 25%

Unallocated budget held for new opportunities.
The total fund VaR budget is split across strategies. Each strategy draws from its allocation as it takes positions. When a strategy hits its limit, it cannot add risk without reallocation.

Components

VaR Budget Allocation

# Configure VaR budget
risk_budget = RiskBudget(
    total_var=50_000,  # Max daily VaR for the fund
    allocation={
        "mm_strategy": 0.30,
        "arb_strategy": 0.25,
        "directional": 0.20,
    },
    reserve=0.25,  # Kept for new strategies
)

Dynamic Reallocation

ConditionAction
Strategy using < 50% of budget for 7 daysShrink allocation, expand reserve
Strategy consistently at budget limitConsider increasing if Sharpe > threshold
New high-conviction opportunityAllocate from reserve
Correlation spike between strategiesReduce combined allocation

Marginal Risk Contribution

Before adding a new strategy, compute how much risk it adds to the fund:
# Compute marginal risk contribution
marginal = risk_budget.marginal_contribution(
    new_strategy="crypto_mm",
    expected_returns=[0.01, -0.005, 0.02, ...],
    existing_correlations=fund.correlation_matrix(),
)
# {"var_increase": 2500, "diversification_benefit": -800, "net_contribution": 1700}

Fund-Wide Risk Controls

ControlDescription
Daily drawdown limitIf fund is down > X% today, halt new positions
Weekly drawdown limitReduce all exposure by 50% if weekly loss > Y%
Monthly drawdown limitActivate kill switch if monthly loss > Z%
Gross exposure limitTotal notional across all strategies < max
Net exposure limitNet directional exposure < max
Sector concentrationMax % in any one market category
Exchange concentrationMax % on any single exchange
Liquidity coverageMust be able to liquidate 80% within 4 hours

Stress Testing at Fund Level

Existing stress tests (stress_test()) work per-strategy. Fund-level stress applies scenarios across all strategies simultaneously:
# Run fund-level stress tests
results = fund_stress_test(
    fund=fund,
    scenarios=[
        AllMarketsDown(magnitude=0.20),
        CorrelationSpike(rho=0.90),
        ExchangeOutage(exchange="polymarket", duration_hours=4),
        LiquidityCrisis(depth_reduction=0.80),
    ],
)

MCP Tools

ToolDescription
risk_dashboardCurrent VaR usage, limits, stress results
risk_budget_statusPer-strategy budget utilization
stress_test_fundRun fund-level stress scenarios
correlation_matrixCross-strategy correlation heatmap