`snapshot` writes each tracked model's forecast quantiles at the seven
backtest horizons from the latest price to data/forecasts/<origin>.csv. It
refuses stale data (older than two days) and duplicate dates, so snapshots
can't be reconstructed after the fact; committing them dates them.
`forward` scores every recorded forecast whose target date has passed,
reusing the backtest's scoring (now factored out as evaluate.score).
Tracked: random_walk, drift_rw, cycle, powerlaw, plus powerlaw_ou,
powerlaw_ou_param and cycle_on_powerlaw, which development data couldn't
settle. `just weekly` runs update, snapshot and forward.
First snapshot: 2026-09-23 (BTC $84.4K). The first outcomes are due
2026-10-23.
Add TrendReversionVol: deviations from the power-law trend follow a daily
AR(1), so uncertainty levels off, optionally plus trend-parameter
uncertainty with an autocorrelation-adjusted effective sample size.
Two experiments, run under the unchanged verdict rule:
- powerlaw-ou: +21% to +45% vs powerlaw at 2-4 years, but slightly negative
point estimates at 1 month make it inconclusive.
- cycle-on-powerlaw: inconclusive (+18% at 2 years, negative elsewhere).
The holdout (outcomes after 2024-11-26) was scored once, for the four
candidates fixed beforehand. powerlaw is the best long-horizon forecast
(+45% and +58% vs the random walk at 2 and 3 years); nothing beats the
random walk inside a year; cycle fails badly. Results are in the README.
Models are now a Composite of drift, volatility and (optional) shape
components, so an experiment can swap one part against a fixed control.
btcmodel/experiments.py holds seven experiments built from the ideas in the
old branches (catalogued in docs/2024-ideas.md), each with its hypothesis
and source, and a verdict rule fixed before anything ran. `just ab` runs
them on development data. Results:
- Shrinking the cycle drift, and a power-law trend (plain or reverting),
beat their controls. The power law beats the random walk by 53-63% at
3-4 years with unbiased outcomes, so it is promoted to MODELS.
- Every alternative volatility estimate (EWMA blends, other windows,
reversion to a level or trend) is worse than the trailing 365-day window.
Cycle-dependent volatility, heavy tails and stretched cycle phase show no
reliable effect.
Replace the 2024 model (model.py, ~2000 lines) with the btcmodel package, the
baseline for future work:
- Forecasts are quantiles of log price at each horizon, scored with CRPS in a
walk-forward backtest (origins every 30 days from 2014, horizons 1 month to
4 years). Skill is relative to a zero-drift random walk, with circular
block-bootstrap intervals and a count of independent windows.
- Development data stops at 2024-11-26, the last day the 2024 model saw.
Later outcomes are a holdout, scored only by `backtest --holdout`.
- Models: random_walk, drift_rw, and cycle (the 2024 model's cycle-position
drift, now kernel-smoothed and recency-weighted). On development data
nothing beats the random walk with confidence; cycle loses at every horizon.
- Prices: the Investing.com archive moves to data/ (cut at 2024-11-26; its
last row was intraday) and is extended with Coinbase daily closes by
`update`.
Also: Nix flake dev shell (Python 3.13, pandas 3), ruff in place of black,
pytest suite, and a rewritten README. NOTES.md is removed as inaccurate, and
poetry is dropped.
Implement some basic backtesting.
Switch to simpler log-based projection.
Add improved vol calculation.
Implement trend smoothing.
Add Claude's notes on current model.
Run projections and backtests in parallel.
Add market maturity projection adjustments.
Improve volume handling in market maturity calculations.
New backtest suite proposed by Claude.
Fix create_plots() output.
Merge branch 'new-backtests' into market-maturity-backtests
Add era-aware market maturity adjustments.
Add updated notes from Claude.
Add justfile to simplify organizing results for comparison.
Run more projections from various start dates.
Tuning session; removed market maturity.
The market maturity score only complicated the model with no clear
benefit. Still working on getting the various backtests tuned.
Add Claude's notes from recent session.
More helpful additions to workflow.
New systematic backtest framework.
Add notes on new backtesting framework.
Use ruff linter.
Tweak the backtests.
* Start from 2011 instead of 2013.
* Validate over two years instead of one.
Improve uncertainty estimation.
Add Claude's notes from the last revision.
Add adaptive volatility window.
New, streamlined NOTES.
Fix projection plot bugs.
Update prices.csv.
Actually use long-term vol in adaptive calculation.
Use more conservative 1e-6 to prevent division by zero.
it's an error not to provide halving dates
warn when val period shorter than projection period
Update prices.csv
Manage output files in less-janky fashion.
Use market fundamentals intsead of empirical era adjustments.
Improve CI coverage.
Use S2F metrics for trend analysis.
update prices
Merge branch 'next' into mkt-fndm
Update prices.
Merge branch 'next' into mkt-fndm
Add CDPR plot.
Merge branch 'next' into mkt-fndm
Update prices.
Slight optimization to cdpr plot gen.
Update prices.
Merge branch 'next' into mkt-fndm
Add price to CDPR plot.
Update prices.
Add .private to .gitignore.
Update prices.