Rejected thesis
Joint weight optimization via coordinate descent
Question: After the sentiment-only bump found by the marginal sweep + refinement (documented in the entry above), can a proper joint optimization find further weight changes that survive joint testing?
Methodology: scripts/coord_descent_weights.py runs proper
coordinate descent on the current DEFAULT_HORIZON_WEIGHTS_BACKTEST:
each cell swept on a 9-point grid {0, 0.05, 0.10, 0.15, 0.20, 0.25,
0.35, 0.50, 0.70} holding all other cells at their current best
(not the baseline). Up to 3 passes; stops when a full pass produces
no improvement above 0.005 Sharpe. news skipped (always 0 in
backtest mode — no information). Total: 21 non-news cells × 9 weights
× max 3 passes ≤ 567 backtests.
This contrasts with the naive "marginal sweep argmax stack" tested in the previous entry, which gave Sharpe -0.746 — every cell optimized against the SAME baseline, ignoring the fact that good cells overlap. Coordinate descent fixes this by optimizing each cell given the running state.
Setup: sp500 2014-2026, weekly rebalance, n_top=10. Starting point = the post-sentiment-bump default (Sharpe 1.582).
Result: CD converged in 2 passes with 3 changes locked in:
| Cell | Default → CD optimum | Per-cell Sharpe lift |
|---|---|---|
| technical / short | 0.10 → 0.20 | +0.012 |
| catalyst / long | 0.10 → 0.15 | +0.005 (at threshold) |
| insider / long | 0.00 → 0.70 | +0.008 |
Total CD lift on sp500 12yr: Sharpe 1.582 → 1.606 (+0.025), CAGR +1.19 pp, MDD −0.42 pp (slight worsening).
Pass 2 found no further improvements above the 0.005 threshold — the algorithm explicitly REJECTED every other proposed change, including all sentiment further tweaks, sector cuts, fundamental adds, and turnaround upweights.
Anti-overfit validation across universes/windows
| Cell | ΔSharpe | ΔCAGR | ΔMDD |
|---|---|---|---|
| sp500 12yr (in-sample) | +0.025 | +1.19 % | -0.42 % |
| sp500 OOS 2020+ | +0.024 | +1.65 % | -0.42 % |
| nasdaq100 12yr | +0.011 | +0.52 % | +1.38 % |
| nasdaq100 OOS 2020+ | -0.012 | -0.59 % | +1.38 % |
| sp600 12yr | +0.004 | +0.27 % | -1.50 % |
| sp600 OOS 2020+ | -0.021 | -1.07 % | -1.50 % |
4/6 positive, 2/6 modestly negative. sp500 in-sample / OOS Sharpe lift agree to 1 basis point (+0.025 vs +0.024) — again exceptionally consistent on the main universe.
Negative cells (nasdaq100/sp600 OOS) are small but real. The insider/long jump from 0 → 0.70 is the biggest individual change and the most suspect — insider Form 4 data coverage is much thinner on small-caps than on sp500, which is where the regression lands hardest.
Decision
Adopt all 3 CD-found changes. New DEFAULT_HORIZON_WEIGHTS_BACKTEST
(deltas from prior version marked with **):
| short | medium | long | |
|---|---|---|---|
| fundamental | 0.00 | 0.00 | 0.00 |
| news | 0.00 | 0.00 | 0.00 |
| sector | 0.45 | 0.55 | 0.65 |
| technical | 0.20 | 0.10 | 0.10 |
| catalyst | 0.30 | 0.20 | 0.15 |
| sentiment | 0.25 | 0.25 | 0.25 |
| insider | 0.00 | 0.00 | 0.70 |
| turnaround | 0.00 | 0.10 | 0.20 |
Total cumulative lift vs original repo defaults (sp500 12yr): Sharpe 1.461 → 1.606 (+0.145), CAGR 51.12 % → 56.01 % (+4.9 pp), MDD −44.54 % → −40.31 % (~4 pp shallower).
Methodology notes
- Proper coordinate descent finds smaller but cleaner gains than marginal stacking. CD locked in only 3 additional changes after the sentiment bump, vs the 24 cells the marginal sweep proposed argmax weights for. The marginal sweep over-promised by 5-10× per cell because it ignored joint state.
- The "best" cells from marginal sweep mostly did NOT survive coordinate descent. Sector cuts, sentiment-to-0.35-or-higher, technical-long-to-0.60 — none of these appeared in the CD optimum. The marginal-sweep findings are useful as candidate pointers but should not be treated as optimization targets.
- Coverage-thin layers may overfit. Insider/long going from 0 → 0.70 gave only +0.008 Sharpe lift but is the change most associated with the sp600/nasdaq100 OOS regression. Future calibration should consider per-name data coverage when interpreting large jumps on sparse-data layers.
Reports:
- research/cd_weight_optimum_sp500_12yr.json (per-eval trajectory,
final weight matrix, 345 evals)
| Verdict | Rejected |
|---|
Every result here is reproducible from the script named above. Reports are in the repository.
- Volatility squeeze
- Pre-FOMC drift
- Uptrend pullback
- Momentum continuation
- Industry-relative momentum (at 4-week lookback)
- Earnings-reaction reversal (anti-PEAD)
- Beat-persistence pre-earnings drift
- Sector ETF mean-reversion
- 52-week-high breakout
- Volume accumulation (above-200DMA +...
- Cross-sector momentum
- Analyst-upgrade cluster