Skip to content

Generalized Hurst Exponent

Intuição

O Generalized Hurst Exponent (GHE) generaliza o Hurst para diferentes ordens de momentos (q), capturando propriedades multi-escala e memória longa.

Definição

Para lags tau = 1..max_lag, compute:

K_q(tau) = E(|X(t+tau) - X(t)|^q)

Ajuste uma regressão em log-log:

log(K_q(tau)) = a + (q*H(q)) * log(tau)

Então:

H(q) = slope / q

Uso

from quantmaster.features.statistical import generalized_hurst_exponent

df["ghe"] = generalized_hurst_exponent(df, window=100, q=2.0, max_lag=10)

API

Source code in src/quantmaster/features/statistical.py
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
def generalized_hurst_exponent(
    data: pd.DataFrame | pd.Series,
    *,
    window: int = 100,
    q: float = 2.0,
    max_lag: int = 20,
    price_col: str = "close",
) -> pd.Series:
    window = validate_positive_int(window, name="window")
    max_lag = validate_positive_int(max_lag, name="max_lag")
    try:
        q = float(q)
    except (TypeError, ValueError) as exc:
        raise TypeError(f"q must be float, got {type(q).__name__}") from exc
    if q <= 0:
        raise ValueError(f"q must be > 0, got {q}")
    if max_lag >= window:
        raise ValueError(f"max_lag must be < window, got max_lag={max_lag} window={window}")

    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"generalized_hurst_exponent_{window}_{q:g}_{max_lag}"

    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] = _generalized_hurst_exponent_1d(windows[i], q=q, max_lag=max_lag)

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