Skip to content

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$:

  1. Tính trung bình $\bar{X}$ và độ lệch chuẩn $S$.
  2. Tạo chuỗi tích lũy lệch: $Y_t = \sum_{i=1}^t (X_i - \bar{X})$.
  3. Tính range $R = \max(Y_t) - \min(Y_t)$.
  4. 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:

  1. 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).
  2. 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.

  3. 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

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)

Powered by dautu.tech