如何用 Python 计算 Hurst 指数判断「趋势还是均值回归」?R/S 分析实现
如何用 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 回归 |
关键坑与注意事项
- 短样本噪声极大:R/S 分析对长度敏感,几百个点算出的 H 置信度低,0.5±0.1 内都应视为「接近随机」而非确凿趋势。本文多股都在 0.6 附近、离 0.5 不远,不宜过度解读。
- 对收益算,不是对价格算:对价格水平(非平稳、带趋势)算 R/S 会系统性偏高,必须先转收益。
- R/S 有已知偏差:经典 R/S 对短序列估计偏高,更严谨可用 DFA(去趋势波动分析)或对 R/S 做小样本偏差校正。
- H 不预测方向:它只说「有没有惯性」,不说涨还是跌;趋势性强≠会涨。
- 区间依赖:换时间段 H 会变,市场状态本身在切换,别把一次结果当常量。
- 前复权必须:否则除权日的巨大收益跳变会扭曲极差。
常见问题(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 附近别过度解读,它只描述惯性、不预测涨跌。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。