跳到主内容
研究主线期货与跨资产研究 · 第51–54讲3/4模块导览 →
讲义

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

用协整与平稳性检验分析期货价差,按合约单位构造压榨价差,并说明换月、基差和对冲方向限制。

完成状态保存在当前浏览器,可随时取消。

一、策略理论基础#

1.1 均值回归与协整关系#

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

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

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

1.2 统计检验方法#

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

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

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

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

二、期货价差交易实战#

2.1 压榨价差策略(Crush Spread)#

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

(2)数据获取与处理:

code
import yfinance as yf

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

# 先把不同报价单位换成近似合约美元价值:
# ZS: 美分/蒲式耳×5,000;ZM: 美元/短吨×100;ZL: 美分/磅×60,000。
# 约 5,000 蒲式耳大豆产出 110 短吨豆粕和 55,000 磅豆油。
soybean_value = soybean / 100 * 5_000
meal_value = 1.10 * meal * 100
oil_value = (55_000 / 60_000) * oil / 100 * 60_000
spread = meal_value + oil_value - soybean_value

Yahoo 的 =F 数据是便于展示的连续序列,不是可直接成交的单一合约。正式回测还必须定义换月规则、合约到期日、展期收益和交易成本。

(3)可视化与检验:

code
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策略公式:

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

(2)策略特点:

  • 反映炼油厂盈利能力

  • 季节性波动明显(夏季汽油需求高,冬季取暖油需求高)

2.3 实践小练习#

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

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

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

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

三、期货-股票联动策略#

3.1 基本原理#

(1)传导机制示例:

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

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

3.2 黄金矿企套利#

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

(2)数据预处理:

code
# 获取黄金期货和GDX(黄金矿企ETF)数据
gold = yf.download(
    'GC=F', start='2015-01-01', auto_adjust=True, multi_level_index=False,
)['Close']
gdx = yf.download(
    'GDX', start='2015-01-01', auto_adjust=True, multi_level_index=False,
)['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)操作逻辑:

  • 航空公司的经营利润通常对油价上涨敏感,天然带有负油价敞口;若目标是对冲燃油成本,应按估计的油价 Beta 配置原油多头

  • “做多或做空航空股”属于收益观点;燃油对冲方向和规模应独立由组合的油价暴露决定,不能把同向押注称为对冲

(2)风险控制要点:

  • 监控航司燃油成本占比

  • 关注外汇对冲政策变化

四、策略优化方向#

4.1 参数动态调整#

(1)滚动窗口协整检验

(2)Kalman Filter动态对冲比率

4.2 风险控制#

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

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

4.3 进阶策略#

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

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


附录:练习答案示例

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

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

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