/ / /
第53讲:期货均值回归 (Mean Reversion on Futures)
🔴
入学要求
💯
能力测试
🛣️
课程安排
🕹️
研究资源

第53讲:期货均值回归 (Mean Reversion on Futures)

💡

查看全集:💎Quantopia量化分析56讲

一、策略理论基础

1.1 均值回归与协整关系

(1)核心概念:当两个资产价格序列存在长期均衡关系时,它们的线性组合(价差)会围绕均值波动

(2)数学表达:若X和Y服从随机游走,存在系数a,b使Z=XaYbZ = X - aY - b为平稳序列

(3)经济意义:商品与加工品(如大豆与豆油)、替代品(黄金与白银)等天然存在价格关联

1.2 统计检验方法

(1)ADF检验:判断价差序列的平稳性

from statsmodels.tsa.stattools import adfuller
p_value = adfuller(spread)[1]  # p<0.05表示平稳

(2)协整检验:验证两个非平稳序列的长期均衡关系

from statsmodels.tsa.stattools import coint
score, p_value, _ = coint(series1, series2)

二、期货价差交易实战

2.1 压榨价差策略(Crush Spread)

(1)经济逻辑:大豆加工商利润 = 豆油价格 + 豆粕价格 - 大豆成本

(2)数据获取与处理:

import yfinance as yf

# 获取大豆期货数据
soybean = yf.download('ZS=F', start='2020-01-01', end='2023-01-01')['Close']
# 获取豆粕期货数据
meal = yf.download('ZM=F', start='2020-01-01', end='2023-01-01')['Close']
# 获取豆油期货数据
oil = yf.download('ZL=F', start='2020-01-01', end='2023-01-01')['Close']

# 构建压榨价差(注意合约乘数调整)
spread = soybean - (0.8*meal + 0.18*oil)  # 实际比例需根据加工技术调整

(3)可视化与检验:

plt.figure(figsize=(12,6))
plt.plot(spread)
plt.title('Crush Spread')

print(f"ADF检验p值:{adfuller(spread.dropna())[1]:.4f}")

2.2 裂解价差(Crack Spread)

(1)3:2:1策略公式:

裂解利润 = 2*汽油价格 + 1*取暖油价格 - 3*原油价格

(2)策略特点:

2.3 实践小练习

(1)下载黄金(GC=F)和白银(SI=F)期货数据

(2)计算金银价格比序列

(3)进行ADF检验判断是否存在均值回归特性

(4)[答案示例代码见附录]

三、期货-股票联动策略

3.1 基本原理

(1)传导机制示例:

原油期货↑ → 石油公司现金流预期↑ → 股价↑

利率期货↑ → 房地产融资成本↑ → REITs价格↓

3.2 黄金矿企套利

(1)策略逻辑:黄金期现价差与矿企股价存在滞后相关性

(2)数据预处理:

# 获取黄金期货和GDX(黄金矿企ETF)数据
gold = yf.download('GC=F', start='2015-01-01')['Adj Close']
gdx = yf.download('GDX', start='2015-01-01')['Adj Close']

# 计算收益率
gold_ret = np.log(gold).diff().dropna()
gdx_ret = np.log(gdx).diff().dropna()

# 滞后相关性分析
lag_corr = pd.concat([gold_ret.shift(5), gdx_ret], axis=1).corr()

3.3 航空股对冲策略

(1)操作逻辑:

(2)风险控制要点:

四、策略优化方向

4.1 参数动态调整

(1)滚动窗口协整检验

(2)Kalman Filter动态对冲比率

4.2 风险控制

(1)压力测试:极端行情下的价差发散风险

(2)止损机制:设置3σ离场阈值

4.3 进阶策略

(1)期限结构策略:利用近月-远月价差

(2)品种间曲线套利:跨商品价差(如Brent-WTI)


附录:练习答案示例

# 金银比价分析
gold = yf.download('GC=F', start='2010-01-01')['Adj Close']
silver = yf.download('SI=F', start='2010-01-01')['Adj Close']
ratio = gold/silver

plt.plot(ratio.rolling(30).mean())
plt.title('Gold/Silver Ratio')

print(f"ADF检验p值:{adfuller(ratio.dropna())[1]:.4f}")

附:练习合集