第六章:跨期套利策略
跨期套利,说白了就是吃「时间差」的饭。
同一个品种,近月合约和远月合约,价格不会完全同步。有时候近月涨得快,远月跟不上;有时候远月跌得狠,近月反而坚挺。这种价差波动,就是我们套利的机会。
我个人习惯把跨期套利分成三类:价差分析、统计套利、展期管理。咱们一个一个来拆。
6.1 近远月合约价差分析
先搞清楚一个概念:价差 = 近月价格 - 远月价格。
这个值可以是正数,也可以是负数。正数叫「backwardation」(现货溢价),负数叫「contango」(期货溢价)。
为什么会这样?说白了就是供需关系在时间轴上的投影。
- Backwardation:近月紧缺,远月宽松。比如豆粕,现在缺货,价格高;未来预期到货,价格低。
- Contango:近月宽松,远月有溢价。比如原油,库存高,近月便宜;远月因为存储成本,价格更高。
我在项目中遇到过一种情况:某品种明明库存很高,但近月合约突然拉涨。后来一查,是交割库出了问题,仓单注册不了。嗯,这种「伪价差」不能碰。
核心要点:价差分析不是看绝对值,而是看相对位置。你要问自己三个问题:
- 当前价差处于历史什么分位?
- 驱动价差变化的因素是什么?
- 这个驱动因素可持续吗?
6.2 日历价差的统计套利
统计套利,说白了就是赌「均值回归」。
你想想看,价差不可能永远偏离。当它偏离到极端位置时,大概率会往回拉。我们要做的,就是在偏离时入场,等回归时平仓。
具体怎么做?我一般用Z-score来判断。
import numpy as np
import pandas as pd
def zscore_calendar_spread(near_price, far_price, window=20):
spread = near_price - far_price
mean = spread.rolling(window).mean()
std = spread.rolling(window).std()
z = (spread - mean) / std
return z
# 示例:当Z-score > 2 时做空价差,< -2 时做多价差
z = zscore_calendar_spread(near, far, 20)
signal = np.where(z > 2, -1, np.where(z < -2, 1, 0))
这里有个坑,我曾经踩过:统计套利的前提是价差序列要平稳。如果不平稳,Z-score就是假的。所以入场前一定要做ADF检验。
我的经验:窗口期别选太短,20天以下噪音太大。我一般用30-60天,具体看品种的波动特性。
6.3 展期收益与滚动成本
做跨期套利,你不能只看价差,还得算展期收益和滚动成本。
展期收益,就是你从近月换到远月时,价差变化带来的收益。滚动成本,就是换仓时的手续费、滑点、冲击成本。
举个例子:
| 项目 | 数值 |
|---|---|
| 近月价格 | 5000 |
| 远月价格 | 4950 |
| 价差 | 50 |
| 展期天数 | 30 |
| 年化展期收益 | 50/4950 * 365/30 ≈ 12.3% |
看起来不错对吧?但别忘了滚动成本。如果每次换仓滑点2个点,一年换12次,就是24个点的成本。年化下来,收益可能只剩一半。
注意:展期收益不是白拿的。它本质上是对你承担「基差风险」的补偿。如果价差走势跟你预期相反,展期收益会变成展期亏损。
我建议你把展期收益和滚动成本做成一张表,每次交易前都算一遍。别嫌麻烦,这步省了,后面亏钱的就是你。
知识体系总览
下面这张图,是我自己梳理的跨期套利核心逻辑。你照着这个框架去思考,基本不会跑偏。
你看,价差分析是基础,统计套利是工具,展期管理是风控。三者缺一不可。
我见过太多人只盯着Z-score,忽略了展期成本,结果赚的还不够手续费。也见过有人只分析价差,不懂统计套利,入场点抓得稀烂。
一句话总结:跨期套利不是无风险套利,它是「有管理的风险暴露」。你赚的是信息差、执行差、耐心差。
好了,这一章就到这里。下一章咱们聊聊「跨品种套利」,那个更有意思。