07 — Risk Management¶
1. Principle¶
Capital preservation outranks return maximisation. Where a compelling signal conflicts with a risk limit, the limit wins and the system explains that it won. This is stated as a product behaviour, not a preference: the user should see "we liked this but sized it down / skipped it because of X," because a silent limit is indistinguishable from a bug.
The reasoning is arithmetic rather than philosophical. A 50% drawdown requires a 100% gain to recover; a 20% drawdown requires 25%. Constraining the left tail is worth more than capturing the right one, and it is far more achievable.
2. Where risk runs¶
Twice, in different modes.
Pre-trade — the Risk Manager agent sizes the position and checks every limit. It holds hard veto authority: a zero size means no trade, regardless of conviction. Its output is deterministic arithmetic over portfolio state; the LLM component is confined to writing the explanation.
Continuous — a monitor evaluates portfolio state on every price update and on schedule, detecting breaches, drawdown thresholds, correlation regime shifts, and compliance drift (05 §5).
3. Position sizing¶
Three independent methods compute a size; the minimum is taken. Any single method can be gamed by an unusual input; the minimum of three is robust to one of them being wrong.
3.1 Volatility-targeted¶
Size so each position contributes a comparable risk quantum:
target_position_vol = portfolio_vol_budget / sqrt(n_target_positions)
size_vol = (target_position_vol × portfolio_equity) / (σ_annualised × price)
Equalising risk contribution rather than capital prevents the common retail failure of holding an equal dollar amount of a stable staple and a volatile small cap and calling it diversified.
3.2 Stop-distance risk budget¶
Never risk more than a fixed fraction of equity on a single idea:
risk_per_trade = equity × max_risk_pct # default 1.0%, hard cap 2.0%
stop_distance = entry_price − stop_price # from ATR-based or structural stop
size_stop = risk_per_trade / stop_distance
Stops are placed at the wider of k × ATR(14) (default k = 2.5) and the nearest structural level, then floored so the stop cannot sit inside normal daily noise — a stop that is too tight converts volatility into realised loss.
3.3 Fractional Kelly, capped¶
Using the calibrated probability from the aggregator (04 §4) — which is the only reason Kelly is admissible here, since Kelly on an uncalibrated probability is actively dangerous:
b = expected_gain / expected_loss
f_kelly = (p × b − (1 − p)) / b
size_kelly = equity × clamp(kelly_fraction × f_kelly, 0, max_position_pct)
kelly_fraction defaults to 0.25. Full Kelly is optimal only with a perfectly known edge and produces drawdowns no human tolerates; quarter-Kelly gives most of the growth with a fraction of the variance. When the aggregator is pre-calibration (04 §4), this method is disabled entirely rather than run on a meaningless p.
3.4 Final¶
size = min(size_vol, size_stop, size_kelly)
capped by: max_position_pct, sector headroom, liquidity cap, available cash
Liquidity cap: no position may exceed a configured multiple of the instrument's 20-day ADV (default: position value ≤ 5% of ADV), so exits remain feasible. A position you cannot exit is not a position, it is a commitment.
4. Exposure limits¶
Defaults; all user-configurable within hard ceilings the app will not exceed.
| Limit | Default | Hard ceiling |
|---|---|---|
| Single position | 8% of equity | 15% |
| Single sector | 25% | 35% |
| Single country | 40% (ex-home market 60%) | 70% |
| Single currency | 60% | 80% |
| Top 5 positions combined | 40% | 55% |
| Minimum cash | 5% | — |
| Maximum invested | 95% | — |
| Minimum positions when > 50% invested | 8 | — |
| Correlation cluster (ρ > 0.7) | 30% | 40% |
| Illiquid names (< $5M ADV) | 10% | 15% |
The correlation cluster limit is the one that catches real concentration. Holding eight technology companies across four countries looks diversified by sector and geography and is not; clustering positions by realised return correlation and limiting cluster weight catches what the categorical limits miss.
Correlations are computed on a rolling window with shrinkage toward a structured target (Ledoit–Wolf), because sample correlation matrices on ~250 observations and dozens of assets are badly conditioned and will otherwise produce confident nonsense.
5. Loss limits¶
Evaluated continuously; each triggers a distinct response rather than a single blunt shutdown.
| Window | Threshold | Response |
|---|---|---|
| Daily | −3% equity | No new entries for the session; existing stops remain active |
| Weekly | −6% | No new entries; position sizes halved on resumption |
| Monthly | −10% | Trading paused; mandatory review screen before resuming |
| Peak-to-trough drawdown | −15% | Risk-off: new entries blocked, gross exposure reduced toward 50% |
| Peak-to-trough drawdown | −25% | Full stop. Manual re-enablement required, with an acknowledgement step |
Two design points. First, thresholds tighten sizing before they block activity, which avoids the pattern where a system trades normally until it slams shut. Second, a loss limit never force-liquidates. Forced liquidation at the bottom is how a drawdown becomes permanent; the system stops adding risk and tells the user what it sees.
6. Circuit breakers¶
Beyond loss limits, conditions that halt new risk-taking:
- Volatility spike — instrument or market realised vol exceeding its 99th percentile over two years.
- Data quality degradation — critical feeds stale beyond tolerance, or cross-source disagreement above threshold. If the system cannot see clearly, it does not act.
- Correlation regime break — average pairwise correlation jumping sharply, the classic signature of a stress event, during which diversification assumptions fail exactly when they are needed.
- Model degradation — rolling calibration error or agent hit rate falling below a floor, detected by the monitoring in 11.
- Compliance breach in a held position — new entries in that instrument blocked immediately.
- Manual emergency stop — a single, always-reachable control that halts all automated activity, cancels open orders, and requires explicit re-enablement. It is on the dashboard, not buried in settings.
Every breaker records what fired, the values that triggered it, and what it blocked, so the history is reviewable rather than mysterious.
7. Stops and targets¶
Initial stop — the wider of ATR-based (2.5 × ATR(14)) and the nearest structural level, floored at a minimum percentage so it survives ordinary noise.
Trailing — activated once the position reaches +1R, then trailing at a configured ATR multiple. Ratchets only; never loosens.
Time stop — if the thesis horizon elapses without the expected move, the position is flagged for review. Capital tied up in a thesis that did not play out has an opportunity cost that no price-based stop captures.
Targets — derived from the expected-return distribution rather than round numbers, with partial exits at intermediate levels so a strategy is not all-or-nothing on a single price.
Thesis invalidation — the non-price condition. Every recommendation records what would falsify it (04 §5); when the monitoring layer observes that condition, the position is flagged regardless of P&L. This is the stop that matters most and the one almost no retail platform implements.
8. Portfolio risk analytics¶
Continuously computed and surfaced on the Portfolio screen:
- Value at Risk and Conditional VaR at 95/99, historical and parametric. CVaR is shown more prominently than VaR because the tail beyond the threshold is the part that actually hurts.
- Stress tests against historical scenarios (2008, March 2020, 2022 rate shock) and parametric shocks (rates +200bp, oil ±40%, USD ±10%, sector-specific drawdowns), using current holdings and estimated factor sensitivities.
- Risk contribution decomposition — marginal and component contribution to portfolio volatility per position. The frequent and useful surprise here is that one holding contributes 40% of portfolio risk at 8% of capital.
- Factor exposures — market, size, value, momentum, quality, plus sector and currency.
- Concentration — Herfindahl index, effective number of positions (typically far below the nominal count), top-N weight.
- Liquidity profile — days to liquidate the portfolio at 10% of ADV participation.
9. Risk communication¶
Risk numbers that are not understood do not change behaviour, so the app translates every metric into a consequence:
- Not "95% VaR is 2.3%" but "On a bad day — about one in twenty — you'd expect to lose around £2,300 or more."
- Not "beta 1.4" but "If the market falls 10%, this portfolio would be expected to fall around 14%."
- Not "Herfindahl 0.18" but "Your portfolio behaves like about 5 or 6 independent holdings, not 12."
The precise figure remains one tap away for analyst mode. And every blocked or reduced trade produces a visible, plain-language reason — because the limits are only trustworthy if the user can see them working.