4.3 KiB
Chapter 09 — The Cost/Turnover Frontier
Status: drafting. Claim inventory: see README.md ch. 09.
This chapter is the empirical core of the book's cost argument: turnover, not signal, is the binding constraint. Ch. 03 established the gross→net collapse on the reference. Ch. 08 showed the fix. This chapter quantifies the frontier — what turnover costs at 20bp round-trips and what the trade-off looks like when you cut it.
The frontier on the clean lake
The 50-ETF panel, $1M book, 5bp open / 15bp close / $5 minimum. The same underlying signal (compact stochastic set, 5-seed ensemble, 5d label — IC 0.050, RankIC 0.066) expressed at different turnover levels:
| Construction | Turnover character | Cost drag | Net ann | Net IR | Source |
|---|---|---|---|---|---|
| daily topk10, n_drop 2 | daily forced replacement | ~9–10pp | −3.21% | −0.32 | exp 24 |
| daily topk10, n_drop 1 | daily, hold dropped name | ~5pp | +2.13% | +0.21 | exp 26 |
| weekly recompute | weekly refresh | ~1.1pp | +12.51% | +1.24 | exp 39 (Q07) |
| daily long-short top10/b10 | two-sided daily | ~9.7% of NAV | −8.38% | −0.83 | exp 41 (Q09) |
PROVEN — EVIDENCE#015 (exp 26), #028 (exp 39), #030 (exp 41).
The n_drop 2→1 step (exp 26) already showed the mechanism with byte-identical signal metrics — the entire net gain was cost relief (EVIDENCE#015). The weekly step (Q07) went further: same signal, same topk/n_drop, cadence only, and cost drag fell to ~1.1pp while net went to +12.51%.
The long-short lesson
Q09 is the cleanest demonstration that cost, not signal, is the frontier: the long-short construction had a positive pre-cost excess (+6.57%, IR 0.656) — the signal genuinely separates longs from shorts — yet cost $96,721 ≈ 9.7% of NAV in ~150 days (2485 trades, fill rate 0.40) and net was −8.38%. PROVEN — EVIDENCE#030 → exp 41. A construction that spends ~10% of the book annually on two-sided turnover cannot be rescued by signal alone.
Where the frontier bends
- Cadence (proven). Weekly recompute of a 5-day signal is the single biggest lever found: ~1.1pp drag, +12.51% net.
PROVEN — EVIDENCE#028 → exp 39. - Dropped-name policy (proven). n_drop 2→1 (hold, don't re-trade) bought ~5pp.
PROVEN — EVIDENCE#015 → exp 26. - Sizing (weak). Kelly-style sizing scaled exposure but did not change the turnover bill (Q06, +1.04% net).
PROVEN — EVIDENCE#027 → exp 38. - Label horizon (counterintuitive). Longer labels improve the signal monotonically (22d IC 0.097, RankIC 0.117) but worsen net under daily churn (Q05: −4.60%). The horizon gain is real but unmonetized.
PROVEN — EVIDENCE#026 → exp 37.— ANSWERED: Q12 (exp 44): 22d+weekly net −4.88% IR −0.566. Q21 (exp 51): 10d+weekly net +1.19% IR 0.148. Both below IR 0.5 acceptance. Weekly is a universal cost lever (~10pp improvement) but the5d label remains the sweet spot.TODO(evidence-needed: long-horizon label at weekly cadence — the combination is untested and is the book's most promising open cell)EVIDENCE#036/042.
Desk rules distilled from this chapter
- Compute cost drag as a share of NAV before believing any net number; at 20bp round-trips, 1% NAV per quarter is easy to spend.
- Rank construction changes by cost drag first: cadence > dropped-name policy > sizing > gates.
- Report gross and net side by side in every experiment; a positive-gross/negative-net run is a turnover problem, not a signal verdict.
TODO(evidence-needed: realized-cost comparison of the weekly construction against the 5bp/15bp/$5 model once it trades live)
Evidence cited in this chapter
| Tag | Source |
|---|---|
EVIDENCE#015 |
exp 26, run 21afc6af…, branch exp/26-test-whether-reducing-topkdropout-daily |
EVIDENCE#028 |
exp 39 (Q07), run eb38588c…, branch exp/39-q07-weekly-rebalance-recompute-topkdropo |
EVIDENCE#030 |
exp 41 (Q09), run 0647eadd…, branch exp/41-q09-long-short-market-neutral-long-top-1 |
EVIDENCE#026 |
exp 37 (Q05), run daad5042…, branch exp/37-q05-label22d-22d-forward-return-label-vs |
EVIDENCE#027 |
exp 38 (Q06), run afca4b80…, branch exp/38-q06-kelly-sizing-score-magnitude-fractio |
EVIDENCE#013 |
exp 24, run fe469a19…, branch exp/24-run-the-rankic-ensemble-in-mlflow-experi |