Skip to content
← Research notes

Fractional Differentiation for Stationary, Memory-Preserving Features

Integer differencing makes prices stationary but erases memory. Fractional differentiation finds the minimum order that passes a stationarity test.

Published 2026-10-11 · Educational explainer, not investment advice

The stationarity–memory trade-off

Most models need stationary inputs, so prices are typically converted to returns (d = 1). That removes almost all long-range memory, which is often where predictive information lives.

Fixed-width window fracdiff

Fractional differentiation applies a binomial-series filter with a real-valued order d between 0 and 1. Truncating weights below a threshold gives a fixed-width window that is cheap to compute.

def frac_weights(d, thresh=1e-4):
w, k = [1.0], 1
while abs(w[-1]) > thresh:
w.append(-w[-1] * (d - k + 1) / k)
k += 1
return np.array(w[::-1])
def frac_diff(series, d, thresh=1e-4):
w = frac_weights(d, thresh)
width = len(w)
vals = series.values
out = [w @ vals[i - width + 1:i + 1] for i in range(width - 1, len(vals))]
return pd.Series(out, index=series.index[width - 1:])

Choosing d

Search d on a grid and keep the smallest value whose series passes an ADF test at your chosen confidence. Report the correlation with the original series to show how much memory was kept.

Source: López de Prado, M. (2018). Advances in Financial Machine Learning. Wiley. Chapter 5.

Run this method as part of a structured research workflow.

Open Voltacent Agent