关于 mean-reversion
mean-reversion 是用于分析加密资产均值回归特征并设计交易信号的 Skill,面向量化研究人员和策略开发者。它结合平稳性检验、半衰期估算、z-score 信号及配对交易分析,并提供扫描脚本。
主要功能
- 01ADF、Hurst 与方差比检验
- 02均值回归半衰期估算
- 03基于 z-score 的信号框架
- 04OU 模型参数估算
- 05均值回归配对扫描
适用场景
- 01检验价格序列是否具有均值回归特征
- 02按半衰期设置观察和持仓期限
- 03为单一资产或价差生成交易信号
- 04筛选并分析均值回归资产对
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ agiprolabs/ claude-trading-skills --skill mean-reversion安装后在 Claude Code 中输入/mean-reversion确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/statistical_tests.mdstrategy_design.mdscripts/mean_reversion_test.pypairs_scanner.py详细介绍
均值回归
均值回归是指价格、价差或其他金融变量在偏离长期平均值后,倾向于回归该平均值的统计特性。均值回归序列会超出均值,然后回调回来——形成可预测的振荡,可供交易。
均值回归有效的情况
- 区间震荡市场:价格横盘,且有明确的支撑位和阻力位
- 配对价差:协整资产之间的价差回归均衡水平
- 超卖/超买极端情况:平稳序列中的 RSI、布林带或 z 分数极端值
- 资金费率套利:永续合约资金费率回归基准水平
- 稳定币脱锚:典型的均值回归机会(锚定价 = 已知均值)
- 暴跌后的反弹:PumpFun 初始暴跌后的短暂均值回归窗口
均值回归失效的情况
- 强趋势市场(大多数时候的加密货币市场)
- 状态变化:原本平稳的序列变成非平稳序列
- 结构性变化:代币迁移、协议升级、下架
- 流动性低:宽幅价差会吞噬均值回归收益
检验均值回归
在交易均值回归之前,必须通过统计检验确认序列具有均值回归特性。以下是三种互补的检验:
1. 增广迪基-富勒(ADF)检验
检验序列存在单位根(非平稳)的原假设。
from scipy import stats
import numpy as np
def adf_test(series: np.ndarray, max_lag: int = 0) -> dict:
"""Run ADF test. Reject null (p < 0.05) → stationary → mean-reverting."""
# See references/statistical_tests.md for full implementation
# Use statsmodels.tsa.stattools.adfuller for production
pass
- p < 0.01:有力证据表明序列平稳
- p < 0.05:有证据表明序列平稳
- p > 0.10:无法拒绝单位根假设——序列可能非平稳
2. Hurst 指数
衡量时间序列的长期依赖性。
| Hurst 值 | 解释 | 交易含义 |
|---|---|---|
| H < 0.5 | 均值回归 | 交易均值回归 |
| H = 0.5 | 随机游走 | 无优势 |
| H > 0.5 | 趋势 | 交易动量 |
def hurst_exponent(series: np.ndarray) -> float:
"""Compute Hurst exponent via R/S method. H < 0.5 → mean-reverting."""
# See references/statistical_tests.md for full R/S algorithm
pass
3. 方差比检验
比较多期收益的方差与单期方差。
- VR < 1:负自相关(均值回归)
- VR = 1:随机游走
- VR > 1:正自相关(趋势)
def variance_ratio(series: np.ndarray, q: int = 5) -> float:
"""Compute variance ratio at horizon q. VR < 1 → mean-reverting."""
returns = np.diff(np.log(series))
var_1 = np.var(returns)
returns_q = np.diff(np.log(series[::q]))
var_q = np.var(returns_q)
return var_q / (q * var_1)
完整实现和解读指南请参见 references/statistical_tests.md。
半衰期估算
半衰期表示偏差衰减至原来一半所需的期数。这是均值回归交易中最重要的参数。
AR(1) 回归法
拟合自回归模型:delta_X_t = alpha + beta * X_{t-1} + epsilon
def half_life(series: np.ndarray) -> float:
"""Estimate mean-reversion half-life from AR(1) regression.
Returns:
Half-life in periods. Negative means non-mean-reverting.
"""
y = np.diff(series)
x = series[:-1]
x = np.column_stack([np.ones(len(x)), x])
beta = np.linalg.lstsq(x, y, rcond=None)[0][1]
if beta >= 0:
return -1.0 # Not mean-reverting
return -np.log(2) / np.log(1 + beta)
半衰期的用法
| 参数 | 经验法则 |
|---|---|
| 回溯窗口 | 半衰期的 2 倍 |
| 持仓时间 | 半衰期的 1 倍 |
| 最大持仓时间 | 半衰期的 3 倍(止损) |
| 信号重算 | 半衰期的 0.5 倍 |
Z 分数信号框架
z 分数可对偏离均值的程度进行标准化,从而提供标准化的入场/出场信号。
z = (price - rolling_mean) / rolling_std
信号规则
| 条件 | 信号 | 操作 |
|---|---|---|
| z < -2.0 | 买入 | 做多(价格低于均值) |
| z > +2.0 | 卖出 | 做空(价格高于均值) |
| z crosses 0 | 退出 | 平仓(回归均值) |
| abs(z) > 3.0 | 止损 | 平仓(均值回归失败) |
回溯窗口
将滚动窗口设为约 半衰期的 2 倍:
def z_score_signals(
prices: np.ndarray,
lookback: int,
entry_z: float = 2.0,
exit_z: float = 0.0,
stop_z: float = 3.0,
) -> np.ndarray:
"""Generate z-score-based mean-reversion signals.
Returns:
Array of signals: 1 (long), -1 (short), 0 (flat).
"""
rolling_mean = pd.Series(prices).rolling(lookback).mean().values
rolling_std = pd.Series(prices).rolling(lookback).std().values
z = (prices - rolling_mean) / rolling_std
# See scripts/mean_reversion_test.py for full signal generation
...
根据 Z 分数调整仓位
根据 z 分数的绝对值调整仓位大小,以获得更好的风险调整后收益:
size = base_size * min(abs(z) / entry_threshold, max_scale)
完整的入场/出场框架和仓位配置请参见 references/strategy_design.md。
Ornstein-Uhlenbeck(OU)过程
OU 过程是均值回归的连续时间模型:
dX = theta * (mu - X) * dt + sigma * dW
| 参数 | 含义 | 估算方法 |
|---|---|---|
| theta | 均值回归速度 | 根据 AR(1) beta 计算:theta = -ln(1+beta)/dt |
| mu | 长期均值 | 根据 AR(1) 截距计算:mu = -alpha/beta |
| sigma | 创新项波动率 | AR(1) 残差标准差 |
参数估算
def estimate_ou_params(series: np.ndarray, dt: float = 1.0) -> dict:
"""Estimate OU process parameters from observed series.
Returns:
Dict with keys: theta, mu, sigma, half_life.
"""
y = np.diff(series)
x = series[:-1]
x_with_const = np.column_stack([np.ones(len(x)), x])
params = np.linalg.lstsq(x_with_const, y, rcond=None)[0]
alpha, beta = params[0], params[1]
theta = -np.log(1 + beta) / dt
mu = -alpha / beta if beta != 0 else np.mean(series)
residuals = y - (alpha + beta * x)
sigma = np.std(residuals) * np.sqrt(2 * theta / (1 - np.exp(-2 * theta * dt)))
return {
"theta": theta,
"mu": mu,
"sigma": sigma,
"half_life": np.log(2) / theta if theta > 0 else -1,
}
策略类型
单资产均值回归
直接将 z-score 框架应用于代币价格序列。最适用于:
- 稳定币(USDC/USDT 价差)
- 处于既定区间内的代币
- 使用 ADF 检验确认平稳性后
配对交易
交易两个协整资产之间的价差:
- 确认协整关系(参见
cointegration-analysis技能) - 计算价差:
S = Y - beta * X - 将 z-score 框架应用于价差
- 当 z < -2 时做多价差(买入 Y,卖出 X)
- 当 z > +2 时做空价差(卖出 Y,买入 X)
统计套利
配对交易的多资产扩展:
- 从相关资产的 PCA 中构建特征投资组合
- 交易最小特征值对应的投资组合(均值回归性最强)
- 需要更大的资产池(10+ 个资产)
加密货币专属注意事项
- 大多数加密货币都呈趋势:BTC、ETH、SOL 的 Hurst 指数通常为 0.55–0.70。原始价格很少出现均值回归。
- 均值回归可能出现的地方:
- 配对价差(SOL/ETH 比率、BTC 市占率)
- 永续合约的资金费率
- 现货与期货之间的基差
- 稳定币脱锚
- 不同 DEX 之间的手续费等级价差
- 较短的回看窗口:加密货币均值回归的半衰期较短(几小时到几天,而非几周)
- 交易成本:DEX 兑换手续费(0.25–1%)可能吞噬均值回归利润。应将滑点纳入考量。
- 关注市场状态:使用
regime-detection技能,仅在区间震荡状态下进行均值回归交易。
与其他技能的集成
| 技能 | 集成方式 |
|---|---|
cointegration-analysis | 寻找协整配对,用于配对交易 |
pandas-ta | 使用 RSI、布林带作为均值回归指标 |
regime-detection | 筛选:仅在区间震荡状态下进行均值回归交易 |
vectorbt | 回测均值回归策略 |
volatility-modeling | 估算 OU 模型的 sigma |
slippage-modeling | 将执行成本纳入盈亏估算 |
position-sizing | 使用 Kelly + z-score 缩放来确定仓位 |
文件
参考资料
references/statistical_tests.md-- ADF、Hurst 指数、方差比和半衰期估算,包含完整实现与解读references/strategy_design.md-- Z-score 框架、仓位规模、配对交易设置、风险管理和回测注意事项
脚本
scripts/mean_reversion_test.py-- 全面的均值回归分析:ADF、Hurst、方差比、半衰期、OU 估算、z-score 信号scripts/pairs_scanner.py-- 扫描多个资产以寻找均值回归配对:相关性、协整、价差分析、排序
快速开始
# Run mean-reversion analysis on synthetic data
python scripts/mean_reversion_test.py --demo
# Scan for mean-reverting pairs
python scripts/pairs_scanner.py --demo
# Analyze a specific token (requires BIRDEYE_API_KEY)
BIRDEYE_API_KEY=your_key TOKEN_MINT=So11...1 python scripts/mean_reversion_test.py
此技能仅提供分析工具和信息,不构成财务建议或交易推荐。
评论
支持 Markdown