Skip to content

Fractal Dimension (MinCover)

Intuição

A Fractal Dimension (MinCover) estima a dimensão fractal local usando um método de cobertura mínima, sendo uma alternativa prática para detectar “trendiness” vs. comportamento mais próximo de random walk.

Definição

Em uma janela, para escalas k, particione a série em blocos de tamanho k e some os ranges em cada bloco. Ajuste uma regressão em log-log e derive:

D = 2 - slope

Uso

from quantmaster.features.statistical import fractal_dimension_mincover

df["fd"] = fractal_dimension_mincover(df, window=100, max_scale=10)

API

Source code in src/quantmaster/features/statistical.py
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
def fractal_dimension_mincover(
    data: pd.DataFrame | pd.Series,
    *,
    window: int = 100,
    max_scale: int = 10,
    price_col: str = "close",
) -> pd.Series:
    window = validate_positive_int(window, name="window")
    max_scale = validate_positive_int(max_scale, name="max_scale")

    price = get_price_series(data, price_col=price_col).astype(float)
    price = price.where(price > 0)
    x = np.log(price)

    out = pd.Series(np.nan, index=price.index, dtype=float)
    out.name = f"fractal_dimension_mincover_{window}_{max_scale}"

    if len(x) < window:
        return out

    arr = x.to_numpy(dtype=float)
    windows = np.lib.stride_tricks.sliding_window_view(arr, window_shape=window)
    vals = np.full(windows.shape[0], np.nan, dtype=float)
    for i in range(windows.shape[0]):
        vals[i] = _fractal_dimension_mincover_1d(windows[i], max_scale=max_scale)

    out.iloc[window - 1 :] = vals
    return out