Start Bitcoin Cycle Lab
You opened the HTML file directly. Start the local app first so it can load prices and save updates.
- Open the extracted bitcoin-cycle-lab folder, one level above this dist folder.
- On macOS, double-click Start.command. On Windows, open Start.bat. Python 3.9 or newer is required.
- Keep the terminal window open. The app opens in your browser automatically.
If it is already running: open the local app. If another port was selected, use the address printed in the terminal.
Terminal alternative: run python3 run.py from the extracted app folder (Windows: py -3 run.py).
Loading update status…
Bitcoin price and Score
Bitcoin price, coloured by the Score that day
Price at each score
The full price table uses the unsmoothed position between the floor and ceiling. The charts show its five-day smoothed Score. Grey defaults show the selected day’s price and unsmoothed position; clearing an input restores them.
| Score | Price (USD) | Vs saved price |
|---|
This date’s formula, not a forecast. The table shows boundary thresholds: score 0 also includes prices below the first threshold; score 100 includes prices above the last. Bitcoin can trade outside these thresholds.
About the Score and its data
Bitcoin Cycle Lab places Bitcoin’s daily price between an age-based floor and a ceiling built from preceding highs. Lower scores mean nearer the model’s floor; higher scores mean nearer its ceiling. Neither is a guaranteed market boundary.
Inspired by Crypto Super Hub’s Bitcoin score. This is an independently developed formula, not their proprietary score, and is not affiliated with or endorsed by Crypto Super Hub.
Prices come from the Coin Metrics Community API: BTC PriceUSD, daily UTC observations in USD. These are daily observations, not live quotes or a guaranteed exchange close. Provider dates are retained. Only completed UTC days are appended; publication can lag. Updates run while this local app’s server is open and catch up on the next launch.
Price data is supplied under CC BY-NC 4.0. Data gaps and conflicting revisions are rejected rather than interpolated.
Equations and parameters
Let A be days since 3 January 2009 plus one, T be years since the first price observation (18 July 2010), and x = ln(A / 3652.5). All logarithms are natural.
ln(F) = a + b × x
E = max over preceding days j of [ln(Pⱼ) − b × xⱼ + d × Tⱼ]
ln(C) = max[b × x + E − d × T + k, ln(F) + ln(1.05)]
Position = 100 × clip[(ln(P) − ln(F)) / (ln(C) − ln(F)), 0, 1]
Scoreₜ = Positionₜ / 3 + 2 × Scoreₜ₋₁ / 3
Parameters: a = 7.695935321127742; b = 5.701394920981048; d = 0.24852567726613145; k = 0.21073464250052515. Smoothing uses EMA span five (α = 1/3), initialized at zero and updated from the second price observation; scores are first displayed after 730 preceding daily observations. Today’s price enters the high envelope only after scoring.
For the calculator: P(s) = F × exp[(s / 100) × ln(C / F)]. It freezes the selected date’s preceding history and evaluates unsmoothed position. Keeping prior smoothed scores fixed would make many 0–100 scores unreachable by changing a single day’s price.
Parameters were calibrated retrospectively against published examples and are kept fixed during updates. Historical scores are reconstructions, not a record of a tool available at that time. Source revisions or future model changes can change results. The Score and price table have not established trading performance.