Robust optimization: sizing factors when your estimates are noisy
You've built the factors. Each one clears its bar on rolling ICIR, Sharpe, and low correlation to the book. Now comes the question that decides live P&L: how much of each do you hold? This is the allocation stage — and it's where the most elegant answer, textbook mean-variance, quietly fails.
Why the textbook answer breaks
Mean-variance optimization takes expected returns and a covariance matrix and returns the weights that maximize return per unit risk. On paper it's optimal. In practice it's an error maximizer: it pours weight into whichever asset has the most overstated expected return and the most understated estimated covariance — which are exactly the estimation errors, not the real edges. Nudge one input by a fraction and the "optimal" weights lurch from one corner to another. You get concentrated books that whipsaw on every rebalance and blow up in the tail the sample covariance never saw.
The fix isn't a fancier point estimate. It's to stop pretending the estimates are exact.
Expected return from skill, not from last month's returns
The first change is what goes in as alpha. Feeding an optimizer each factor's trailing return just hands it the noise. StrategyNet instead scores each factor-mimicking portfolio (FMP) by its rolling ICIR — the information coefficient's information ratio, i.e. how consistently the factor's forecast has ranked names, not how much it happened to make last month.
The robust objective
Every mode optimizes the same shape — reward minus a risk penalty — over box-constrained weights on the simplex, with cash and a market (SPY) leg available as overlays:
maximize wᵀα − ½·λ·( wᵀΣw + ρ·tail² )
- wᵀα — portfolio alpha from rolling ICIR.
- wᵀΣw — nominal variance from a rolling sample covariance.
- tail — the piece that makes it robust: an empirical worst-case or CVaR loss over the same window, weighted by ρ.
- box constraints (
min_weight/max_weight) keep any single sleeve from running away, andλsets risk aversion.
Three modes, increasing paranoia
Not one optimizer — a menu
Robust Markowitz is one tool. Because the right allocator depends on how many sleeves you hold and how much you trust the covariance matrix, the allocator offers three that share the same inputs and constraints:
- ICIR-proportional — weight each factor in proportion to its rolling ICIR. No covariance, no optimization, nothing to overfit. The honest baseline, and hard to beat with a handful of sleeves.
- Hierarchical risk parity (HRP) — cluster factors by their correlation structure and allocate risk down the tree. No matrix inversion, so it stays stable when factors are highly correlated and a mean-variance solver would detonate.
- Robust Markowitz — the worst-case / CVaR objective above, for when you want to trade explicit return against an explicit, tunable tail.
How it compares
Every allocator here optimizes something, so the honest test isn't which one wins the backtest — it's which one keeps its edge once it starts trading. Run the same factor set through each method and read the two Sharpe columns together:
Representative in-sample vs. out-of-sample comparison on one factor set
| Method | Backtest Sharpe | Live (OOS) Sharpe | Max drawdown | Turnover |
|---|---|---|---|---|
| Naive mean-variance | 2.6 | 0.4 | 44% | High |
| Equal weight (1/N) | 1.1 | 1.0 | 15% | ~0 |
| Hierarchical risk parity | 1.4 | 1.3 | 13% | Low |
| Robust (CVaR) | 1.5 | 1.4 | 12% | Low |
Naive mean-variance has the best backtest in the table and the worst live result. It maximized estimation error, so its edge evaporated the moment it left the sample — and it can't even beat naive equal weighting out of sample, the result that keeps a generation of optimizers honest. Equal weight is the baseline every optimizer has to justify itself against, not a strawman.
Hierarchical risk parity and the robust CVaR objective clear that bar: they beat 1/N out of sample and hold a materially smaller drawdown, because neither trusts the covariance matrix enough to bet the book on a corner. And because their weights are stable, they churn far less — so they win again net of the transaction costs a whipsawing optimizer pays on every rebalance.
The point isn't the best backtest. It's the smallest gap between the backtest and what happens next.
Where this lives in the product
This is the allocation sleeve of the strategy engine — the step after the Signal Designer and the factor-of-factors models have filled the book. Factors decide what you hold; robust optimization decides how much, and does it without pretending the estimates were ever exact. See what's available to allocate across in the factor catalog.
This walkthrough is for research and educational purposes. It illustrates how StrategyNet organizes signal evidence into factors and scenarios; it is not a recommendation, investment advice, or an instruction to trade any security.
See plans