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
|