AlphaFeed Blog

如何用 Python 计算 Hurst 指数判断「趋势还是均值回归」?R/S 分析实现

分析与指标 · 代码验证于 2026-10-10

如何用 Python 计算 Hurst 指数判断「趋势还是均值回归」?

一句话回答: Hurst 指数(赫斯特指数 H)用 R/S 重标极差分析衡量一段序列的「长期记忆」:H>0.5 偏趋势(持续性,追涨更可能有效)、H≈0.5 近随机游走(无规律)、H<0.5 偏均值回归(反转,抄底/高抛更可能有效)。用 AlphaFeed 取前复权日线算日收益,再对不同时间窗口拟合 log(R/S)~log(n) 的斜率即可得 H——它帮你在「上趋势策略还是回归策略」之间先做个方向判断。

为什么会有这个问题 / 传统做法的痛点

同一套均线/突破策略,在趋势品种上赚钱、在震荡品种上来回打脸;而网格/均值回归策略正好相反。问题是「这只票、这段时间到底是趋势还是震荡」常凭感觉。Hurst 指数给了一个量化口径:它不预测涨跌,而是刻画序列有没有”惯性”。痛点在于算 Hurst 要有干净、足够长、复权正确的收益序列——除权缺口或样本太短都会让 R/S 分析失真。

分步骤解决(每步配可运行代码)

第 1 步:取前复权日线,转成日收益序列

from alphafeed import AlphaFeed
import numpy as np, pandas as pd

af = AlphaFeed(api_key="your-api-key")  # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()

df = af.klines.get("600519.SH", period="1d", count=1000,
                   adjust="forward", to_dataframe=True)
df = df.sort_values("trade_date").reset_index(drop=True)
ret = df["close"].pct_change().dropna().values     # 对「收益」算 Hurst,衡量收益的持续性

对收益序列而非价格水平算 Hurst,才是衡量「涨跌有没有惯性」。前复权与足够长(这里 ~1000 根)是前提。

第 2 步:R/S 重标极差分析,拟合斜率得 H

def hurst_rs(ts, min_n=8, max_n=128):
    ts = np.asarray(ts, float); N = len(ts)
    ns, rss = [], []
    n = min_n
    while n <= min(max_n, N // 2):
        chunks = N // n
        rs = []
        for i in range(chunks):
            seg = ts[i*n:(i+1)*n]
            dev = np.cumsum(seg - seg.mean())        # 累计离差
            R = dev.max() - dev.min()                # 极差
            S = seg.std(ddof=0)                       # 标准差
            if S > 0: rs.append(R / S)               # 重标极差 R/S
        if rs: ns.append(n); rss.append(np.mean(rs))
        n *= 2
    # log(R/S) 对 log(n) 的斜率即 Hurst
    return float(np.polyfit(np.log(ns), np.log(rss), 1)[0])

print("Hurst =", round(hurst_rs(ret), 3))

实测(tools/verify_new_2026-10-10.py,SDK 0.1.4):贵州茅台近 999 个日收益 Hurst ≈ 0.611,略大于 0.5,判为「偏趋势/持续」。

第 3 步:多只股票横向对比

syms = ["600519.SH", "000001.SZ", "601318.SH"]
data = af.klines.batch(syms, period="1d", count=1000, adjust="forward", to_dataframe=True)
for s, k in data.items():
    r = k.sort_values("trade_date")["close"].pct_change().dropna().values
    print(s, round(hurst_rs(r), 3))

实测:000001.SZ 0.607、601318.SH 0.616,三只都在 0.60~0.62——同期日收益都略偏持续,但都离 0.5 不远,解读需谨慎(见下)。

参数与字段说明

参数/概念含义备注
adjust="forward"前复权必须,除权缺口会污染收益序列
ret日收益序列对收益算 Hurst,衡量涨跌惯性
min_n/max_n子窗口大小范围需 ≤ N/2,太大则样本不足
R累计离差的极差Rescaled Range 的 R
S子段标准差做”重标”
Hurst (H)log(R/S)~log(n) 斜率>0.5 趋势 / ≈0.5 随机 / <0.5 回归

关键坑与注意事项

常见问题(FAQ)

Q:Hurst 和自相关、方差比检验什么关系? A:都在测「序列有没有记忆」。收益自相关看一阶线性相关;方差比(VR)检验看多期方差是否偏离随机游走;Hurst 用 R/S 看跨尺度的长期记忆。三者互为印证,建议结合看。

Q:H=0.6 就能上趋势策略吗? A:不建议。0.6 且样本只有几百点时统计上离随机游走不远;应结合更长样本、DFA 复核、以及实际回测再决定,Hurst 只是方向性参考。

Q:需要付费吗? A:单只股票长周期日线在免费额度内即可;若要对全市场批量算 Hurst 找「最具趋势性/最具回归性」的票,需要 klines.batch + universes(Starter 及以上),详见官网定价页。

小结

Hurst 指数用 R/S 分析把序列归为趋势、随机或均值回归,帮你在「追趋势还是做回归」之间先定方向。用 AlphaFeed 的前复权日线转成收益序列、几行拟合即可——但务必记住:对收益而非价格算、短样本噪声大、0.5 附近别过度解读,它只描述惯性、不预测涨跌。

相关链接:


免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。