Hurst Exponent — Phân loại trending vs mean-reverting
Nguồn: Hurst (1951), mở rộng bởi Mandelbrot (1971) Loại: Tín hiệu phân loại regime / long-memory Tag:
moi:2026-05-16#regime#fractal#long-memory
Bản chất tín hiệu
Hurst Exponent (ký hiệu H) là một số nằm trong [0, 1] đo mức độ phụ thuộc dài hạn (long-range dependence) của chuỗi thời gian. Ý nghĩa diễn giải:
- H ≈ 0.5: chuỗi là random walk (không có nhớ) — Brownian motion.
- H > 0.5: chuỗi có persistence/trending — cú lên có xu hướng kéo theo cú lên, cú xuống kéo theo cú xuống. Trend-following thắng. H = 0.6-0.8 thường thấy ở chỉ số commodity, energy, FX major trong giai đoạn macro trend.
- H < 0.5: chuỗi có mean-reversion — cú lên thường được follow bằng cú xuống. H = 0.3-0.45 đặc trưng cho spread, pair, volatility, một số interest rate.
So với Market Regime Filter đã có (thường dựa trên MA/ADX/vol regime), Hurst Exponent có nền tảng toán học khác hẳn — đo trên scaling property của variance theo aggregation period. Nó không bị phụ thuộc vào lựa chọn lookback window cụ thể như MA, mà ước lượng trên đa thang đo (multi-scale) cùng lúc.
Công thức và phương pháp ước lượng
Cách phổ biến nhất là R/S analysis (Rescaled Range):
Cho chuỗi $X_t$ độ dài $N$:
- Tính trung bình $\bar{X}$ và độ lệch chuẩn $S$.
- Tạo chuỗi tích lũy lệch: $Y_t = \sum_{i=1}^t (X_i - \bar{X})$.
- Tính range $R = \max(Y_t) - \min(Y_t)$.
- Rescaled range $R/S$.
Lặp lại cho nhiều cửa sổ con kích thước $\tau$ khác nhau. Hurst dự đoán:
$$E[R/S]_\tau \sim c \cdot \tau^H$$
Hồi quy log-log $\log(R/S)$ theo $\log(\tau)$ → slope = H.
Phương pháp thay thế (chính xác hơn cho dữ liệu tài chính):
- Detrended Fluctuation Analysis (DFA) — Peng et al. 1994.
- Wavelet-based Hurst — Abry-Veitch.
- Variance-of-aggregated-series.
DFA được khuyến nghị vì robust với non-stationarity vốn rất phổ biến trên lợi suất tài sản.
Ứng dụng giao dịch chính
Hurst dùng như một regime classifier bậc cao cho meta-decision:
Strategy selection theo H:
- H > 0.55 → enable trend-following (breakout, MA cross, donchian channel).
- H ∈ [0.45, 0.55] → giảm gross exposure, không thiên về MR hay TF.
- H < 0.45 → enable mean-reversion (Bollinger fade, RSI extreme).
Rolling Hurst để bắt regime shift: H tính trên cửa sổ rolling 200-500 phiên. Khi H vượt threshold trong 5-10 phiên liên tiếp → confirm regime đã chuyển.
Cross-asset Hurst basket: tính H cho 10 chỉ số/forex/commodity → portfolio "long trend in trending H>0.6 assets, mean-revert in MR H<0.4 assets". Đây là một cách robust để chia ngân sách rủi ro.
Áp dụng đa thị trường
VN30F (Hợp đồng tương lai chỉ số Việt Nam)
Quan sát thực nghiệm 2017-2025:
- H daily close-to-close ~ 0.52-0.58 (yếu trending).
- H intraday 5-min ~ 0.42-0.48 (mean-revert mạnh do retail fade).
- 2020-2021 H ~ 0.65 (bull cycle structural); 2022-2023 H ~ 0.45 (chop).
- Triển khai: H_500d > 0.55 → 70% TF, 30% MR. H_intraday > 0.55 → opening range breakout; < 0.45 → opening range fade.
- Cảnh báo regime shift: |ΔH_20d| > 0.10 → review manual.
US equity futures (ES, NQ, RTY)
- ES daily H ~ 0.55-0.58 (trending nhẹ — drift up structural). NQ H ~ 0.57-0.60 (mạnh hơn ES).
- RTY H ~ 0.50-0.53 (gần random walk — small-cap chop nhiều).
- Intraday US futures: H_5min ~ 0.45-0.50. 0DTE option trading post-2022 làm H_intraday giảm (intraday mean-revert mạnh hơn).
- Use case: dùng spread H_ES - H_RTY làm dispersion proxy — khi spread tăng (ES trending mạnh hơn RTY) → cross-section long ES short RTY thường có Sharpe tốt.
- Daily vs intraday divergence: khi H_daily > 0.55 nhưng H_intraday < 0.45 → "trending up giữa noise intraday" — chiến lược: long bias + intraday fade.
Crypto spot (BTC, ETH)
- BTC daily H rất cao trong bull cycle (2020-2021: H ~ 0.70), giảm mạnh trong bear (2022: H ~ 0.42).
- ETH H thường correlate với BTC nhưng amplitude lớn hơn.
- Altcoin H cực đoan: trong bull H > 0.75 (parabolic trend); trong bear H < 0.35 (severe mean-reversion).
- Implication: chiến lược trend trên crypto chỉ work trong cycle phù hợp — H là filter cycle hiệu quả nhất.
- Intraday crypto: H ~ 0.40-0.50 do market 24/7 thiếu "stress reset" — mean-reversion intraday thường hiệu quả.
Crypto perpetual futures
- H của perp gần như identical với spot vì arbitrage giữ basis tight.
- Khác biệt: H của funding rate (treat funding như chuỗi thời gian riêng) ~ 0.65-0.75 — funding có persistence cao. Tín hiệu: long perp khi funding < 0 và H_funding cao (funding negative sẽ persist).
- Liquidation-induced H decay: sau big liquidation cascade, H thường drop xuống ~ 0.40 trong 2-4 tuần (post-trauma mean-revert) — đây là window vàng cho fade strategy.
Cân nhắc cross-market chung
- H rất nhạy với phương pháp — dùng DFA thay R/S thuần để robust với non-stationarity. Bootstrap CI để check significance (H = 0.51 chưa chắc khác 0.50).
- Cross-asset H comparison cần cùng phương pháp + cùng length data.
- H breakdown: tính H riêng cho up-days và down-days. Asymmetry này (H_down > H_up) phổ biến trên equity (downside more persistent), opposite trên crypto (upside more parabolic).
- Update frequency: H weekly đủ cho daily timeframe; H daily cần cho intraday strategy.
Minh họa Python
import numpy as np
import pandas as pd
def hurst_rs(series: np.ndarray, min_lag: int = 10, max_lag: int = None) -> float:
"""
Ước lượng Hurst Exponent bằng R/S analysis.
series: numpy array của log-returns (1D).
Trả về scalar H trong [0, 1].
"""
n = len(series)
if max_lag is None:
max_lag = n // 4
lags = np.unique(np.geomspace(min_lag, max_lag, num=20).astype(int))
rs_values = []
for lag in lags:
# Chia thành các đoạn dài lag
n_chunks = n // lag
if n_chunks < 1:
continue
rs_list = []
for i in range(n_chunks):
chunk = series[i * lag:(i + 1) * lag]
mean_chunk = chunk.mean()
y = np.cumsum(chunk - mean_chunk)
R = y.max() - y.min()
S = chunk.std(ddof=1)
if S > 0:
rs_list.append(R / S)
if rs_list:
rs_values.append((lag, np.mean(rs_list)))
if len(rs_values) < 5:
return np.nan
lags_arr, rs_arr = zip(*rs_values)
log_lags = np.log(lags_arr)
log_rs = np.log(rs_arr)
slope, _ = np.polyfit(log_lags, log_rs, 1)
return slope
def rolling_hurst(returns: pd.Series, window: int = 500) -> pd.Series:
"""Tính Hurst rolling trên log-returns."""
H = pd.Series(index=returns.index, dtype=float)
for i in range(window, len(returns) + 1):
chunk = returns.iloc[i - window:i].dropna().values
if len(chunk) == window:
H.iloc[i - 1] = hurst_rs(chunk)
return H
def hurst_regime_classifier(H_series: pd.Series,
trend_threshold: float = 0.55,
mr_threshold: float = 0.45) -> pd.Series:
regime = pd.Series('neutral', index=H_series.index)
regime[H_series > trend_threshold] = 'trending'
regime[H_series < mr_threshold] = 'mean_reverting'
return regime
# Sử dụng:
# rets = np.log(vn30f_close).diff().dropna()
# H = rolling_hurst(rets, window=500)
# regime = hurst_regime_classifier(H)