66 lines
3.2 KiB
Markdown
66 lines
3.2 KiB
Markdown
# Ideas in the 2024 model's history
|
||||
|
|
|
|||
|
|
A catalogue of the modeling ideas in the old `model.py` and its branches
|
|||
|
|
(September 2026). Labels are referenced from `btcmodel/experiments.py`.
|
|||
|
|
"Fudge" means the constant or rule existed to hit backtest coverage/MAPE
|
|||
|
|
targets rather than to express a hypothesis.
|
|||
|
|
|
|||
|
|
## Drift
|
|||
|
|
|
|||
|
|
- **D1. Mean return by halving-cycle position.** The core idea throughout
|
|||
|
|
(initial commit, `Switch to simpler log-based projection`, `Implement trend
|
|||
|
|
smoothing`, `tuning-b`). Smoothing went Savitzky-Golay → 60-day centred mean
|
|||
|
|
→ Gaussian kernel with recency weights. The old code stretched every cycle
|
|||
|
|
to 1460 days (phase = fraction of the halving interval). Bugs: simple
|
|||
|
|
returns compounded as log returns (+~25%/yr bias) in the initial commit;
|
|||
|
|
genesis date off by a year; `tuning-3` regressed log price on row index
|
|||
|
|
across cycles. The "blend ratio of 0 is best?" commit was blending the
|
|||
|
|
simple- and log-return versions of the same quantity.
|
|||
|
|
- **D2. Drift damping.** Constants everywhere (×0.6–0.9, asymmetric, era- and
|
|||
|
|
cycle-position-keyed, a 3%/day cap, the fundamentals ×0.65–0.75). Fudge as
|
|||
|
|
implemented; the hypothesis underneath (the cycle drift is overfit) is real.
|
|||
|
|
- **D3. Diminishing returns.** Initial commit decayed drift by 0.9^(t/365);
|
|||
|
|
`old/backtests-trend-enhancement-1` regressed per-cycle returns on cycle
|
|||
|
|
number, but added that on top of the cycle drift (double counting) and
|
|||
|
|
clipped paths.
|
|||
|
|
- **D4. "Skew".** `loc += sign(μ)·0.087σ`, tuned so 68% coverage hit 68.1%.
|
|||
|
|
A fudge; its honest cousin is momentum.
|
|||
|
|
- **D5. Stock-to-flow.** A 30% blend of the daily % change in S2F into the
|
|||
|
|
drift. Broken: mismatched units, and S2F "halvings" on the wrong dates
|
|||
|
|
created a large fake post-halving drift.
|
|||
|
|
|
|||
|
|
## Volatility
|
|||
|
|
|
|||
|
|
- **V1. EWMA blend.** 30/90/180-day spans, weights .5/.3/.2 then .2/.5/.3,
|
|||
|
|
times a 1.2 fudge.
|
|||
|
|
- **V2. Adaptive windows / regime weights.** Short/long vol ratio rescales
|
|||
|
|
window lengths and blend weights; over-parameterised, and after the
|
|||
|
|
fundamentals rewrite the adaptive windows were computed but unused.
|
|||
|
|
- **V3. Cycle-position volatility.** `old/backtest-vol-cycle`.
|
|||
|
|
- **V4. Market maturity.** Volume growth, inverse vol, autocorrelation and a
|
|||
|
|
post-futures dummy, min-max normalised in-sample. Removed as "complexity
|
|||
|
|
without clear benefit".
|
|||
|
|
- **V5. "Fundamentals".** Supply growth, volume/supply and "depth" combined
|
|||
|
|
and clipped to [0.65, 0.75]: effectively a constant, grid-searched to match
|
|||
|
|
the era constants it replaced.
|
|||
|
|
- **V6. Market conditions.** Vol ratio, MA50−MA200 trend strength (≈30× too
|
|||
|
|
large from a units bug) and drawdown widening uncertainty.
|
|||
|
|
|
|||
|
|
## Calibration (all fudges)
|
|||
|
|
|
|||
|
|
- **C1. Era scaling keyed to the backtest's training start date**, with stacked
|
|||
|
|
factors (net ≈0.45× vol) and hand-picked era boundaries.
|
|||
|
|
- **C2. Horizon uncertainty multipliers**, caps and floors on daily vol.
|
|||
|
|
- **C3. Changing the quantile levels**: a "95%" band read off the ~81%
|
|||
|
|
quantiles past a year.
|
|||
|
|
|
|||
|
|
## Shape
|
|||
|
|
|
|||
|
|
- **S1. Skewed innovations**, with skew set per era (`tuning-1`).
|
|||
|
|
|
|||
|
|
## Also
|
|||
|
|
|
|||
|
|
Plumbing (backtest framework, multiprocessing, output handling, cycle and
|
|||
|
|
CDPR plots). The old NOTES.md described "machine learning" and "macro
|
|||
|
|
indicator" experiments; no such code ever existed.
|