第四节:价差计算与标准化
价差交易的核心,说白了就是两腿之间的价格差。但这里有个坑——不同合约的乘数不一样,数据频率也不一样。我刚开始做价差时,就吃过这个亏。
今天咱们就把这三个问题彻底讲透:价差怎么算、合约乘数怎么调、数据怎么对齐。
4.1 价差计算公式
先看最基础的价差公式。我个人习惯用这个:
价差 = 近月合约价格 - 远月合约价格
但实际交易中,价差有几种常见形态:
- 跨期价差:同一品种,不同月份。比如螺纹钢RB2305 - RB2310
- 跨品种价差:不同品种,但相关。比如豆油 - 棕榈油
- 跨市场价差:同一品种,不同交易所。比如沪铜 - 伦铜
每种价差的计算方式略有不同。举个例子:
# 跨期价差(简单减法)
spread = price_near - price_far
# 跨品种价差(需要系数调整)
spread = price_A - ratio * price_B
# 跨市场价差(考虑汇率)
spread = price_domestic - price_foreign * exchange_rate
核心要点:价差公式不是死的。你得根据交易逻辑来定。我见过有人把价差写成对数比,也有人用百分比。关键是要稳定、可解释。
4.2 合约乘数调整
这里是个大坑。不同合约的乘数不一样,直接减会出问题。
举个例子:
- 螺纹钢:10吨/手
- 热卷:10吨/手
- 铁矿石:100吨/手
- 原油:1000桶/手
如果你做螺纹钢和热卷的价差,乘数都是10,直接减没问题。但如果你做铁矿石和螺纹钢的价差呢?
铁矿石一手100吨,螺纹钢一手10吨。直接减价差,相当于用10吨的价格去对比100吨的价格——这不对。
我建议的做法是:统一换算成每吨的价格。
# 错误做法
spread_raw = iron_ore_price - rebar_price
# 正确做法:统一到每吨
spread_per_ton = iron_ore_price / 100 - rebar_price / 10
# 或者更直观:用名义价值
spread_notional = iron_ore_price * 100 - rebar_price * 10
避坑指南:我曾经在跨品种价差上栽过跟头。当时做豆油和棕榈油的价差,没注意豆油是10吨/手,棕榈油是5吨/手。结果回测曲线漂亮得很,实盘一跑就亏。后来才发现是乘数没对齐。
乘数调整的通用公式:
调整后价差 = (价格A * 乘数A) - (价格B * 乘数B * 配比系数)
配比系数怎么定?看你的资金管理策略。一般用1:1,但也可以根据波动率调整。
4.3 数据对齐方法
数据对齐,说白了就是让两条腿的数据在同一个时间点上。但实际数据往往不是完美对齐的。
常见的问题:
- 不同品种的交易时间不同(比如股指期货和商品期货)
- 不同交易所的撮合频率不同
- 数据源有缺失值
我常用的对齐方法有三种:
| 方法 | 适用场景 | 优缺点 |
|---|---|---|
| 时间戳对齐 | 高频数据 | 精度高,但计算量大 |
| K线对齐 | 中低频数据 | 简单实用,但会损失细节 |
| 插值对齐 | 缺失值较多 | 灵活,但可能引入误差 |
具体实现:
# 方法1:时间戳对齐(用pandas)
import pandas as pd
# 假设df1和df2是两个合约的tick数据
df1['timestamp'] = pd.to_datetime(df1['timestamp'])
df2['timestamp'] = pd.to_datetime(df2['timestamp'])
# 合并并向前填充
merged = pd.merge_asof(df1, df2, on='timestamp', direction='forward')
# 方法2:K线对齐(重采样)
df1_resampled = df1.resample('1min').last()
df2_resampled = df2.resample('1min').last()
# 方法3:插值对齐
df1_interp = df1.set_index('timestamp').reindex(common_index).interpolate()
个人经验:我一般用K线对齐做回测,用时间戳对齐做实盘。回测时精度要求没那么高,但实盘时差几毫秒可能就滑点严重。
4.4 知识体系总览
下面这张图把价差计算与标准化的核心逻辑串起来了:
嗯,这张图把今天的内容都串起来了。你想想看,价差计算不是简单的减法,它背后涉及合约设计、数据质量、交易逻辑等多个维度。
总结一下:
- 价差公式要根据交易逻辑定制,别死套模板
- 合约乘数必须统一到同一基准,否则回测全是假象
- 数据对齐要根据频率选方法,高频用时间戳,低频用K线
我个人习惯在实盘前,先用历史数据跑一遍价差序列,看看有没有异常跳点。如果有,八成是数据对齐出了问题。别问我怎么知道的——都是踩坑踩出来的经验。
公众号:蓝海数据掘金营,微信deep3321