Compare commits

Author SHA1 Message Date
dennisthiessen 127499eceb research: interpret prod book universe x horizon matrix; ignore candidate cache
Four-arm results: 505 stays positive (softer on deep history); liquid breadth
destroys book under current knobs. Stop tracking 1.3GB pkl cache under reports/.cache.
2026-07-19 14:25:06 +02:00
Dennis Thiessen d0c65b892c tests done 2026-07-19 14:21:05 +02:00
4 changed files with 241 additions and 9 deletions
+1
View File
@@ -46,3 +46,4 @@ backtest_snapshots/
# Rebuildable pickle caches are local accelerators, not decision evidence. # Rebuildable pickle caches are local accelerators, not decision evidence.
reports/*.pkl reports/*.pkl
reports/*.pk1 reports/*.pk1
reports/.cache/
+49 -9
View File
@@ -71,17 +71,57 @@ or depth changes the risk story.
## Results ## Results
*(filled after run)* Generated: `2026-07-19T14:07:37` · artifact
`reports/prod-book-universe-horizon-20260719-140737.json`
Snapshot: MacBook deep `research.sqlite` (506 prod + breadth prices; 2.39M raw
GTL candidates). Strategy knobs = live production (residual 80, 80/20 high-vol
rank, ATR trail 3×, hold 30, gate-reset, `fill_mode=close`).
| arm | universe | entry start | Sharpe | SE | CAGR % | max DD % | trades | notes | > Survivorship: today's constituents backfilled. **Compare arms relatively.**
|---|---|---|---:|---:|---:|---:|---:|---| > Absolute deep CAGR/Sharpe are not deployable forecasts.
| A | 505 | 2022-07-01 | | | | | | |
| B | 505+liquid | 2022-07-01 | | | | | | |
| C | 505 | 2016-07-01 | | | | | | |
| D | 505+liquid | 2016-07-01 | | | | | | |
--- | arm | universe | entries from | Sharpe | SE | CAGR % | max DD % | total ret % | trades | win % | vs SPY |
|---|---|---|---:|---:|---:|---:|---:|---:|---:|---:|
| **A** | 505 only | 2022-07-01 | **1.32** | 0.49 | **31.8** | **18.9** | +205 | 374 | 35.6 | +96.5 |
| **B** | 505 + liquid 1500 | 2022-07-01 | 0.14 | 0.50 | 1.8 | 55.3 | 7 | 706 | 29.3 | +95.0 |
| **C** | 505 only | 2016-07-01 | **0.88** | 0.31 | **16.7** | **24.4** | +369 | 763 | 36.7 | +257 |
| **D** | 505 + liquid 1500 | 2016-07-01 | 0.06 | 0.32 | 7.0 | 73.9 | 52 | 1567 | 28.0 | +254 |
Qualified longs: A 1448 · B 6587 · C 2450 · D 11551.
### Read (relative only)
1. **Same strategy, broader liquid universe kills the book** (A→B and C→D).
Sharpe collapses; DD roughly triples; win rate drops ~68pp; trade count
~doubles. This matches earlier breadth IC work: the production residual +
high-vol package is a **large-cap / prod-universe** edge, not a
“more names = better” edge.
2. **Longer history on 505 stays positive but softer** (A→C). Sharpe 1.32 → 0.88,
CAGR 32% → 17%, DD 19% → 24%. Still well above the liquid-breadth arms.
Levels are optimistic (survivorship); the useful message is “edge does not
vanish when 2018/2020 are included,” not “expect 17% CAGR forever.”
3. **Arm A vs older PhaseA / short-window controls** (~Sharpe 1.72.1): this
matrix re-ranked on deep research.sqlite with a fixed entry start; numbers
need not match prior reports row-for-row. Use **this table for AD
comparisons**, not for rewriting the production baseline number.
4. **No production change implied.** Keep the live ~505 universe. Do not broaden
the tradable set to liquid Nasdaq under current knobs without a new
pre-registered design (and almost certainly a different rank/tilt package).
## Verdict ## Verdict
**PENDING_HUMAN** after numbers land. **Descriptive matrix complete.**
| question | answer from this matrix |
|---|---|
| Prod book @ ~4y / 505 | Positive (arm A) |
| Same + liquid Nasdaq | **No** — large degradation (arm B) |
| Prod book since 2016 / 505 | Still positive, milder (arm C) |
| Same + liquid Nasdaq deep | **No** — worst arm (arm D) |
**PENDING_HUMAN** only for whether to log “universe broaden under current knobs”
as rejected in the main research index. Strategy knobs unchanged either way.
@@ -0,0 +1,137 @@
{
"generated_at": "2026-07-19T14:07:37.458454",
"snapshot": "/Users/taathde3/git/lab/signal_platform/backtest_snapshots/research.sqlite",
"snapshot_meta": {
"prod_universe_n": 506,
"price_symbols_n": 4654,
"raw_candidates": 2389258,
"liquid_top_n": 1500,
"liquid_min_price": 5.0,
"short_start": "2022-07-01",
"long_start": "2016-07-01"
},
"strategy": {
"note": "Live production knobs \u2014 no modifications",
"momentum": "residual_12_1 gate 80",
"rank": "residual_high_vol_blend_80_20",
"fill_mode": "close",
"cost_per_side": 0.001,
"exit": {
"mode": "atr_trailing",
"trailing_pct": 12.0,
"atr_multiplier": 3.0,
"hold_days": 30
},
"max_positions": 10,
"risk_per_trade": 0.01,
"reentry": "gate_reset"
},
"arms": [
{
"id": "A_prod_4y_505",
"label": "Prod book \u00b7 ~4y \u00b7 505 only",
"start": "2022-07-01",
"universe": "prod_505",
"n_candidates": 81626,
"n_qualified_longs": 1448,
"fill_mode": "close",
"ranking_key": "residual_high_vol_blend_80_20_score",
"exit_policy": "atr_trail3",
"hold_days": 30,
"sharpe": 1.32,
"sharpe_se": 0.49,
"cagr_pct": 31.8,
"max_drawdown_pct": 18.9,
"total_return_pct": 204.7,
"calmar": 1.68,
"trades": 374,
"win_rate": 35.6,
"n_returns": 1009,
"psr": 0.9965,
"start_date": "2022-07-01",
"end_date": "2026-07-13",
"spy_return_pct": 96.5,
"final_equity": 30467.86
},
{
"id": "B_prod_4y_505_liquid",
"label": "Prod book \u00b7 ~4y \u00b7 505 + liquid top-1500",
"start": "2022-07-01",
"universe": "prod_plus_liquid",
"n_candidates": 267579,
"n_qualified_longs": 6587,
"fill_mode": "close",
"ranking_key": "residual_high_vol_blend_80_20_score",
"exit_policy": "atr_trail3",
"hold_days": 30,
"sharpe": 0.14,
"sharpe_se": 0.499,
"cagr_pct": -1.8,
"max_drawdown_pct": 55.3,
"total_return_pct": -7.1,
"calmar": -0.03,
"trades": 706,
"win_rate": 29.3,
"n_returns": 1013,
"psr": 0.6107,
"start_date": "2022-07-01",
"end_date": "2026-07-17",
"spy_return_pct": 95.0,
"final_equity": 9287.52
},
{
"id": "C_prod_2016_505",
"label": "Prod book \u00b7 since 2016-07 \u00b7 505 only",
"start": "2016-07-01",
"universe": "prod_505",
"n_candidates": 190179,
"n_qualified_longs": 2450,
"fill_mode": "close",
"ranking_key": "residual_high_vol_blend_80_20_score",
"exit_policy": "atr_trail3",
"hold_days": 30,
"sharpe": 0.88,
"sharpe_se": 0.314,
"cagr_pct": 16.7,
"max_drawdown_pct": 24.4,
"total_return_pct": 369.4,
"calmar": 0.68,
"trades": 763,
"win_rate": 36.7,
"n_returns": 2519,
"psr": 0.9975,
"start_date": "2016-07-01",
"end_date": "2026-07-13",
"spy_return_pct": 256.9,
"final_equity": 46938.66
},
{
"id": "D_prod_2016_505_liquid",
"label": "Prod book \u00b7 since 2016-07 \u00b7 505 + liquid top-1500",
"start": "2016-07-01",
"universe": "prod_plus_liquid",
"n_candidates": 649305,
"n_qualified_longs": 11551,
"fill_mode": "close",
"ranking_key": "residual_high_vol_blend_80_20_score",
"exit_policy": "atr_trail3",
"hold_days": 30,
"sharpe": -0.06,
"sharpe_se": 0.316,
"cagr_pct": -7.0,
"max_drawdown_pct": 73.9,
"total_return_pct": -52.0,
"calmar": -0.1,
"trades": 1567,
"win_rate": 28.0,
"n_returns": 2523,
"psr": 0.4287,
"start_date": "2016-07-01",
"end_date": "2026-07-17",
"spy_return_pct": 254.1,
"final_equity": 4800.5
}
],
"survivorship_banner": "Today's constituents backfilled. Relative arm comparison only.",
"pending_human": true
}
@@ -0,0 +1,54 @@
# Production book × universe × horizon — results
Generated: `2026-07-19T14:07:37.458454`
> Survivorship: today's constituents backfilled. Compare arms relatively; do not treat deep CAGR/Sharpe levels as deployable forecasts.
## Arms
| arm | universe | entry start | Sharpe | SE | CAGR % | max DD % | ret % | trades | qual longs | span |
|---|---|---|---:|---:|---:|---:|---:|---:|---:|---|
| A_prod_4y_505 | prod_505 | 2022-07-01 | 1.32 | 0.49 | 31.8 | 18.9 | 204.7 | 374 | 1448 | 2022-07-01→2026-07-13 |
| B_prod_4y_505_liquid | prod_plus_liquid | 2022-07-01 | 0.14 | 0.499 | -1.8 | 55.3 | -7.1 | 706 | 6587 | 2022-07-01→2026-07-17 |
| C_prod_2016_505 | prod_505 | 2016-07-01 | 0.88 | 0.314 | 16.7 | 24.4 | 369.4 | 763 | 2450 | 2016-07-01→2026-07-13 |
| D_prod_2016_505_liquid | prod_plus_liquid | 2016-07-01 | -0.06 | 0.316 | -7.0 | 73.9 | -52.0 | 1567 | 11551 | 2016-07-01→2026-07-17 |
## Config (production, unchanged)
```json
{
"note": "Live production knobs \u2014 no modifications",
"momentum": "residual_12_1 gate 80",
"rank": "residual_high_vol_blend_80_20",
"fill_mode": "close",
"cost_per_side": 0.001,
"exit": {
"mode": "atr_trailing",
"trailing_pct": 12.0,
"atr_multiplier": 3.0,
"hold_days": 30
},
"max_positions": 10,
"risk_per_trade": 0.01,
"reentry": "gate_reset"
}
```
## Snapshot
```json
{
"prod_universe_n": 506,
"price_symbols_n": 4654,
"raw_candidates": 2389258,
"liquid_top_n": 1500,
"liquid_min_price": 5.0,
"short_start": "2022-07-01",
"long_start": "2016-07-01"
}
```
PENDING_HUMAN — descriptive matrix only; no auto promotion.
JSON: `reports/prod-book-universe-horizon-20260719-140737.json`