Research note · full experiment log
Can Monte Carlo policy iteration time the market? — No
Published 2026-10-24 · out-of-sample 2010–2026, 202 months walk-forward · verdict: MCPI loses to static 50/50 on every metric — not shipped.
Method
- <b>MDP:</b> state = SPY trend × 21d vol bucket × momentum breadth (12 cells); action = momentum weight {30,40,50,60}%; reward = next-month net portfolio return.
- <b>Learning:</b> each month builds the empirical MDP on history only (Laplace-smoothed transitions + per-cell reward pools), Monte-Carlo policy evaluation γ=0.95, 300 episodes × 12 steps × 40 iterations + greedy improvement — strictly no look-ahead.
- <b>Accounting:</b> independent leg drift, monthly reset, fees identical to the production engine (equities 0.1% / ETFs 0.02%).
Results · 202 OOS months
| Strategy | CAGR | MaxDD | Sharpe | Vol |
|---|---|---|---|---|
| static50 · current | 12.88% | −16.64% | 0.91 | 14.43% |
| static60 | 14.37% | −20.42% | 0.87 | 17.08% |
| voltarget | 11.22% | −16.07% | 0.87 | 13.05% |
| MCPI learned | 12.78% | −20.36% | 0.87 | 14.89% |
The learned policy nearly degenerates: 11 of 12 states pick mom_w=60%; the single "risk-off cell" (post-crash rebound) has too few samples to pay off out-of-sample.
Interpretation
- The momentum leg's risk-adjusted return is strong enough that <b>conditional timing carries no alpha at 12-cell granularity</b> — momentum's worst drawdowns come in fast signal-flip windows a monthly state cannot catch.
- vol_target remains the only variant that durably lowers vol/drawdown (cost ~1.7pt CAGR) — kept as a possible conservative tier.
- Reproduce: balanced_mcpi.py → balanced_mcpi_policy.csv / balanced_mcpi_oos.csv. Corroborates the <a href="/research/drl-allocation">RL allocation experiment</a>: no alpha in timing the split.
Research note, not investment advice; simulated results are not indicative of future performance. · ← Research index