A rigorous statistical analysis across 13 years of BTC-USD daily data using ADF, Autocorrelation, Runs Test, Variance Ratio, and GARCH(1,1) modelling.
Bitcoin exhibits significant momentum, serial autocorrelation at 6–30 day horizons, and long-run variance ratio deviations — all inconsistent with a pure random walk. Bitcoin is not weak-form efficient.
4,735 daily log return observations · April 2013 → April 2026
| Horizon k | VR(k) | z-statistic | Significant? | Interpretation |
|---|---|---|---|---|
| 2 | 0.9902 | -0.677 | No ✔ | Near-random at 2-day |
| 5 | 0.9990 | -0.030 | No ✔ | Near-random at 1-week |
| 10 | 1.0747 | 1.523 | No ✔ | Borderline at 2-week |
| 20 | 1.2273 | 3.147 | Yes ✘ | Momentum at 1-month |
| 30 | 1.3210 | 3.582 | Yes ✘ | Strong momentum at 6-week |
Publication-quality plots generated from the full BTC-USD dataset.
Price series, log returns, return histogram, ACF, and 30-day rolling volatility.
VR(k) from k=2 to k=50. Monotonically rising curve confirms long-run momentum.
Conditional volatility, standardised residuals, rolling ADF and Runs statistics.
Fitted on 4,735 daily BTC log return observations (×100 for numerical stability).
Step-by-step statistical workflow applied to the BTC-USD time series.
btc-usd-max.csv (CoinGecko) · 4,736 rows · 2013-04-28 → 2026-04-17 · datetime index, sorted, NaN-dropped.
r_t = ln(P_t / P_{t-1}) · 4,735 observations · Mean=0.13%/day · Kurtosis=9.38 (extreme fat tails).
Prices: p=0.7450 (non-stationary ✔) · Returns: p<0.0001 (stationary ✔) · Both support RWH structure.
Significant serial correlation from lag 6 onward (Q=16.03, p=0.0136). Medium-horizon dependence detected.
Z=3.04, p=0.0024 · Positive Z → fewer runs than expected → momentum clustering of same-sign returns.
VR rises monotonically from 0.99 (k=2) to 1.44 (k=50). Statistically significant at k=20,30.
Persistence α+β=0.969. Rolling ADF: 100% of 365-day windows stationary. Rolling Runs: 14.8% non-random.
pip install pandas numpy matplotlib statsmodels arch
python rw_btc_test.py # Core tests
python rw_extensions.py # GARCH + rolling analysis