Hey WOers. I had some free time today, and thought of doing some analysis of BTC/USD historical price data, to help shed some light on the hot question of the year: do cycles exist? Yes, I had to go there again!
| Source: | Bitstamp BTC/USD Historical Price Data |
| Sample Time: | Day (High) |
| From: | 28 November 2014 |
| To: | 5 April 2026 |
| Data: | Spot, 50-WMA, 200-WMA, 200-WMA (d/dx) |
| Method: | Normalized Autocorrelation |
Here's the source data, as a standard chart:

A useful tool for detecting cycles in time-series data is autocorrelation, which basically compares the data with a copy of itself, time-shifted in multiples of the sample time (which is one day in our case). The results are normalized in the interval [-1, 1], with 1 indicating a perfect match, 0 indicating a complete mismatch, and -1 indicating a perfect opposite match (one rising, the other falling). By definition, a time shift of 0 results in a perfect match (a coefficient of 1), because we are comparing the data with an exact copy of itself. As the two data sets are gradually shifted apart in time, their correlation coefficient is expected to gradually fall to a low value close to 0, unless there are cyclic patterns (periodicities) in the data, in which case there will be one or more peaks at the periods of those cycles. In our case, we're interested in positive peak values. Any such peak indicates a distinct cycle periodicity, and the value of that periodicity can be found by looking at the corresponding time shift. There is a symmetry at time shift = 0, so everything is mirrored around the center of the graph.
Here are the autocorrelation results:

I'm performing autocorrelation on 4 different data sets:
spot price,
50-WMA,
200-WMA, and
200-WMA (d/dx). The reason for taking the derivative of 200-WMA is because 200-WMA is heavily averaged and, as things currently stand, it is monotonically increasing (going up forever, Laura), which throws off autocorrelation. By differentiating it, we are essentially removing the slow-moving components, while leaving the dynamic components intact. This is a kind of high-pass filtering if you like.
We can clearly see that there is one and only one cycle periodicity detected. Yes, you've guessed it, this is the all-too-familiar (and hated by many) 4-year Halving cycle. The correlation coefficient peaks are indicated by the circles near the ±4-year time shifts, for the different types of data. To be precise, the detected cycle periodicity is slightly less than 4 years, as shown in the graph. This almost perfectly matches the past Halving timestamps:
| 1st Halving: | 28 November 2012 | |
| 2nd Halving: | 9 July 2016 | (after 3.61 years) |
| 3rd Halving: | 11 May 2020 | (after 3.84 years) |
| 4th Halving: | 20 April 2024 | (after 3.95 years) |
| Average time between past Halvings: | 3.80 years |
| Spot price autocorrelation result: | 3.72 years (a near-perfect match) |
So, there you have it. Some math & science for you to think about. 4-year cycles do exist. How significant will they be in the near and far future? My guess is that their effect will gradually be diminished, as the mining reward gets halved. Are cycles still relevant today? Yes, I think they are, and can still be used to our advantage. Can they predict the future with absolute certainty? No, and neither can anyone. These are just methods that help us get a tiny glimpse of a general direction, nothing more.
I hope you've found this interesting and useful in some way. Since Sparkle Fairy can only read graphs, and seeing how sad she's been feeling lately, I just had to oblige. And, please, no cyclist/anti-cyclist fighting over this post. This was made with ❤️ and is provided for entertainment purposes only.
Have fun, stack sats, HODL, stay safe out there.