← Back to blog

FFT, Hurst, and Bartels: Three Tools for Cycle Analysis in Financial Data

Cycle analysis in financial markets has accumulated a toolkit over the past century that spans signal processing, statistics, and mathematical physics. Three tools, FFT spectral analysis, Hurst exponent analysis, and Bartels significance testing, address different aspects of the cycle detection problem. Used together, they give a more complete picture than any one method alone.

This guide explains what each tool measures, where it works, and where it fails.

Fast Fourier Transform: finding candidate periods

The FFT decomposes a time series into its frequency components. The output is a power spectrum: amplitude as a function of frequency (or period). Peaks in the power spectrum correspond to candidate cycles in the data.

The FFT is fast, O(N log N), and comprehensive. One pass through the data finds all significant periodicities simultaneously. This makes it the obvious first step in any cycle analysis.

How to read an FFT power spectrum: The x-axis is frequency (or equivalently, period). The y-axis is spectral power, roughly, how much of the total variance in the data is explained by each frequency. A peak at period P means the data shows oscillation at that period.

The main limitation: FFT assumes the time series is stationary, that the cycle structure doesn't change over time. Real financial data is non-stationary. A 40-week cycle that was strong from 1950 to 1980 may have weakened or shifted phase by 2000. The FFT averages over the entire sample and doesn't distinguish between stable cycles and transient patterns.

Practical example: Apply FFT to daily S&P 500 price data from 1950 to 2025. Common peaks appear near: - 5 days (weekly seasonality) - 21 days (monthly) - 252 days (annual) - 1000+ days (multi-year)

The short-period peaks are strongest and most reliable. The long-period peaks are more interesting for cycle analysts but also more ambiguous.

For code, scipy.fft.rfft works for real-valued time series. Plot np.abs(rfft(series))**2 against frequencies to get the power spectrum.

Hurst Exponent: is the series persistent or mean-reverting?

The Hurst exponent H measures long-range dependence in a time series.

  • H = 0.5: the series is a random walk (no memory, no exploitable structure)
  • H > 0.5: the series is persistent (trends tend to continue)
  • H < 0.5: the series is anti-persistent (mean-reverting)

For cycle analysis, H > 0.5 is a necessary condition for cyclicality to be exploitable. A pure random walk (H = 0.5) will show apparent cycles in any finite sample, but they won't repeat reliably.

Most financial price series have H slightly above 0.5, weakly persistent, not strongly trended. Volatility series tend to have H significantly above 0.5, which is why volatility clustering is a durable feature of financial markets.

Computing Hurst exponent: The classic method is rescaled range (R/S) analysis. Split the series into log-spaced sub-windows, compute the R/S statistic for each window size, and fit the slope in log-log space. The slope is H.

Python implementation via hurst package or manual R/S calculation. Crohamhurst.app computes Hurst exponents for uploaded series.

What H tells cycle analysts: A series with H = 0.6 has enough persistence that cycle-based methods have a statistical foundation to work with. A series with H = 0.51 is very close to random walk, the cycles FFT finds are likely noise, and trading them will destroy capital.

Bartels Significance Testing: are the cycles real?

FFT finds peaks; Bartels testing evaluates whether specific peaks are statistically significant. For a full explanation of the Bartels test, see our Bartels cycle significance testing guide.

In the context of this workflow: once FFT has identified candidate periods, Bartels testing verifies which ones survive statistical scrutiny. The procedure:

  1. FFT identifies strong peaks at periods P1, P2, P3
  2. For each candidate period, fold the data and compute row-mean variance
  3. Compare to the Bartels null distribution
  4. Accept cycles with p < 0.01; treat 0.01 < p < 0.05 as provisional

The advantage over purely threshold-based FFT analysis is that Bartels properly accounts for multiple testing. Finding 10 peaks and testing all 10 at 5% significance should produce 0.5 false positives on average, Bartels handles this correctly.

The combined workflow

Step 1, Check H first. If H < 0.52, be sceptical of all cycle findings. The persistence is too weak to sustain exploitable cycles. If H > 0.55, proceed with more confidence.

Step 2, FFT for candidate identification. Run FFT on the full series. Note peaks that are at least 2× the background spectral level. These are your candidates.

Step 3, Bartels for validation. Test each candidate period with the Bartels test. Retain only cycles significant at p < 0.05. Prioritise those below 0.01.

Step 4, Phase stability check. For cycles that survive Bartels testing, check phase stability over time using a sliding-window FFT or wavelet transform. Cycles that are significant overall but have shifting phase are less useful for prediction.

Step 5, Translate to trading signals. Construct a cycle composite from validated cycles. Check confluence with other methods, Bradley siderograph turning points, Gann time projections. See the backtesting primer for how to evaluate the resulting signals rigorously.

Limitations of all three methods

These are mathematical tools applied to market data. The assumption behind using them is that markets have structure, that prices are not pure random walks. The Hurst exponent gives you evidence on this assumption; H > 0.5 justifies proceeding, but it doesn't guarantee the cycles you find will persist into the future.

Markets change regime. Cycles that were strong before algorithmic trading became dominant (pre-2005) may be weak now. The 4-year election cycle is a structural feature that may persist; the 9.2-year cycle's physical basis is murky and its persistence is less certain.

Treat all cycle-based forecasts as probabilistic, use position sizing that reflects the uncertainty, and maintain the backtesting discipline needed to verify that historical patterns actually translate into forward-tested edge.

Try Crohamhurst for free

Crohamhurst.app runs FFT, Hurst exponent, and Bartels significance testing on any time series you upload, the full cycle analysis workflow without writing a line of code.

Create a free account →

Related: Bartels Cycle Significance Testing | Backtesting Cycle Methods: A Primer

Run this analysis yourself

Crohamhurst computes the Square of Nine, Bradley siderograph, planetary ephemeris, cycle scans and historical analogs from your own price data, in your browser. The free plan needs no card.

Create free account