实战案例二:商品期货跨期套利(螺纹钢、铁矿石、原油)

跨期套利,说白了就是吃同一品种不同月份合约之间的价差。我做了这么多年,发现这是最稳的套利方式之一。为什么?因为同一个品种的基本面是一样的,价差主要受持仓成本、资金情绪和季节性因素影响。

今天咱们就拿螺纹钢、铁矿石、原油这三个品种开刀。这三个品种各有各的脾气,套利逻辑也不一样。我个人习惯把跨期套利分成两类:一类是「仓储成本型」,另一类是「供需预期型」。螺纹钢和铁矿石偏前者,原油偏后者。

核心逻辑:跨期价差 = 仓储成本 + 资金成本 + 便利收益 + 预期溢价

当价差偏离这个理论值时,就出现了套利机会。

一、螺纹钢跨期套利:盯住库存周期

螺纹钢有个特点——它是建筑用材,有明显的淡旺季。每年春节后和秋季是旺季,夏季和冬季是淡季。这导致近月合约和远月合约的价差波动很大。

我记得2021年做过一次螺纹钢的跨期套利。当时RB2105和RB2110的价差拉到了350元/吨,而正常仓储成本加资金成本也就150元左右。这就是典型的价差高估。

具体怎么操作?我一般用以下步骤:

  1. 计算理论价差区间:仓储费(约0.5元/吨/天)+ 资金成本(按年化5%算)+ 交割费用
  2. 观察历史价差分布:用过去3年的数据做分位数分析
  3. 设定入场阈值:当价差超过历史90%分位数时入场
  4. 设置止损:价差继续扩大10%时止损

下面是我常用的一个价差分析代码框架:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 加载螺纹钢近月和远月合约数据
df = pd.read_csv('rb_spot_future.csv', parse_dates=['date'])
df['spread'] = df['near_month'] - df['far_month']

# 计算滚动统计量
df['spread_ma20'] = df['spread'].rolling(20).mean()
df['spread_std20'] = df['spread'].rolling(20).std()
df['z_score'] = (df['spread'] - df['spread_ma20']) / df['spread_std20']

# 设定交易信号
df['signal'] = 0
df.loc[df['z_score'] > 2, 'signal'] = -1  # 价差过高,做空价差
df.loc[df['z_score'] < -2, 'signal'] = 1  # 价差过低,做多价差

# 回测
df['pnl'] = df['signal'].shift(1) * df['spread'].diff()
cum_pnl = df['pnl'].cumsum()
print(f"累计收益: {cum_pnl.iloc[-1]:.2f}")

实战技巧:螺纹钢跨期套利最好在交割月前1-2个月平仓。因为临近交割,流动性会下降,滑点成本会吃掉利润。我曾经吃过这个亏,价差判断对了,但平仓时滑了5个点,利润直接砍半。

二、铁矿石跨期套利:盯住到港量与库存

铁矿石和螺纹钢不一样。铁矿石是进口依赖型品种,受海运周期影响很大。近月合约反映的是当前到港量,远月合约反映的是未来供需预期。

我做过一个统计:铁矿石跨期价差与港口库存的相关系数在0.6左右。库存高的时候,近月合约承压,价差容易走弱;库存低的时候,近月合约坚挺,价差容易走强。

具体策略框架如下:

市场状态 库存水平 价差特征 操作建议
供过于求 高库存(>1.4亿吨) 近月贴水远月 做空价差(空近多远)
供需平衡 中等库存(1.2-1.4亿吨) 价差窄幅震荡 观望或做区间
供不应求 低库存(<1.2亿吨) 近月升水远月 做多价差(多近空远)

嗯,这里要注意。铁矿石的跨期套利不能只看库存,还要看海运费。我记得2022年有一次,库存明明在下降,但价差却在走弱。后来一查,原来是海运费暴涨,导致远月合约的到港成本预期上升,远月反而更强。

三、原油跨期套利:盯住期限结构

原油的跨期套利最有意思。它不像黑色系那样受仓储成本主导,更多是受市场情绪和供需预期影响。原油的期限结构有两种形态:

  • Backwardation(现货升水):近月高于远月,说明当前供应紧张
  • Contango(期货升水):远月高于近月,说明当前供应过剩

我一般用「展期收益率」来衡量原油跨期套利的价值:

# 计算原油展期收益率
def calc_roll_yield(near_price, far_price, days_to_expiry):
    """
    计算年化展期收益率
    """
    roll_yield = (far_price - near_price) / near_price
    annualized = roll_yield * (365 / days_to_expiry)
    return annualized

# 示例:WTI原油近月80美元,远月82美元,距离交割30天
roll = calc_roll_yield(80, 82, 30)
print(f"年化展期收益率: {roll*100:.2f}%")
# 输出: 年化展期收益率: 30.42%

为什么会这样?因为原油的仓储成本很高,而且有便利收益。当市场处于Contango结构时,理论上你可以买入近月、卖出远月,然后到期交割拿货,再存着等远月交割。但实际操作中,仓储容量是有限的,这就是为什么价差不会无限扩大。

避坑指南:我曾经在原油跨期套利上栽过跟头。当时WTI的Contango结构很深,年化展期收益率超过40%,我重仓做了多近空远的套利。结果呢?库欣地区的库存爆满,仓储费暴涨,我的持仓成本远超预期。最后虽然价差回归了,但扣除仓储费后基本没赚钱。

所以做原油跨期套利,一定要关注库存容量和仓储费率的变化。

四、三个品种的对比总结

说了这么多,咱们来做个对比。这三个品种的跨期套利逻辑各有侧重:

品种 核心驱动 主要风险 持仓周期 适合资金量
螺纹钢 库存周期、季节性 政策干预、交割规则 1-3个月 中小资金
铁矿石 到港量、港口库存 海运费波动、汇率 2-4周 中等资金
原油 期限结构、库存容量 仓储费变化、逼仓 1-2周 大资金

我个人建议,刚开始做跨期套利的朋友,先从螺纹钢入手。它的逻辑最清晰,数据也最透明。等积累了经验,再去做铁矿石和原油。原油的波动最大,但风险也最高,不适合新手。

最后说一句:跨期套利不是无风险套利。它只是把方向性风险换成了价差风险。你想想看,如果价差持续不回归,或者出现了极端行情,照样会亏钱。所以仓位管理永远是第一位的。

核心要点回顾:

  • 螺纹钢跨期:盯库存周期,用历史分位数定阈值
  • 铁矿石跨期:盯港口库存,结合海运费判断
  • 原油跨期:盯期限结构,注意仓储容量限制
  • 三个品种都要做回测,别信感觉信数据
商品期货跨期套利实战框架 螺纹钢 铁矿石 原油 核心驱动 库存周期 + 季节性 核心驱动 到港量 + 港口库存 核心驱动 期限结构 + 库存容量 通用策略方法 计算理论价差区间 历史分位数分析 Z-score信号生成 ⚠ 主要风险 政策干预 / 交割规则 海运费波动 / 汇率风险 仓储费变化 / 逼仓风险 仓位管理永远是第一位

这张图把三个品种的跨期套利框架串起来了。你可以看到,虽然每个品种的驱动因素不同,但策略方法是一致的:计算理论价差、做历史分析、生成交易信号。最后别忘了,风险控制是底线。

好了,这一章的内容就到这里。代码和数据我已经整理好了,你可以直接拿去跑回测。记住,纸上得来终觉浅,绝知此事要躬行。

公众号:蓝海资料掘金营,微信deep3321