价差与比价:构建套利分析的基础序列
做统计套利,说白了就是找两个品种之间的「亲戚关系」。
你想想看,如果两个品种走势完全独立,那还套什么利?我们要找的,是那些价格之间存在稳定关系的品种对。而价差和比价,就是量化这种关系的两个基本工具。
价差序列:最直观的套利信号
价差,就是两个品种价格的差值。公式很简单:
价差 = 品种A价格 - 品种B价格 × 乘数
这里有个关键点——乘数。为什么要乘它?因为两个品种的合约规模可能不一样。比如螺纹钢和热卷,一手都是10吨,乘数就是1。但如果是铜和铝,合约规格不同,就得调整。
核心要点:价差序列的平稳性,决定了套利策略是否有效。我一般先用ADF检验看一眼,p值小于0.05才敢往下做。
构建价差序列时,我习惯用对数价格。为什么?因为对数价格更接近正态分布,而且能消除量纲影响。举个例子:
import numpy as np
import pandas as pd
# 假设df包含两个品种的收盘价
df['log_price_A'] = np.log(df['close_A'])
df['log_price_B'] = np.log(df['close_B'])
df['spread'] = df['log_price_A'] - df['log_price_B']
嗯,这里要注意。直接用原始价格做价差,如果两个品种价格差了好几个数量级,比如黄金和螺纹钢,那价差序列基本就是高价品种的走势图,完全失去了意义。
比价序列:消除趋势的利器
比价,就是两个品种价格的比值。公式:
比价 = 品种A价格 / 品种B价格
比价的好处是什么?它能消除共同趋势。你想想,如果两个品种都受宏观经济影响,同涨同跌,价差可能越来越大,但比价可能保持稳定。
我在做股指期货套利时遇到过这种情况。IF和IC虽然都跟大盘走,但风格不同。直接用价差,你会发现序列根本不平稳。换成比价,嘿,效果就好多了。
实战技巧:比价序列更适合价格水平差异大的品种对。比如原油和沥青,一个几十美元一桶,一个几千元一吨,用比价更合理。
比价序列的构建代码:
df['ratio'] = df['close_A'] / df['close_B']
# 也可以取对数
df['log_ratio'] = np.log(df['ratio'])
我个人更倾向于用对数比价。因为对数比价的变化率,就是两个品种收益率的差。这在后续做协整检验时,统计性质更好。
数据频率选择:日线、小时线还是分钟线?
这个问题,我当年刚入行时也纠结过。后来踩过坑才明白——频率选择取决于你的策略持仓周期。
| 数据频率 | 适合场景 | 注意事项 |
|---|---|---|
| 日线 | 持仓3-10天 | 信号少,但胜率高 |
| 小时线 | 持仓数小时到1-2天 | 平衡了信号频率和噪音 |
| 分钟线 | 高频套利,持仓几分钟 | 噪音大,交易成本敏感 |
我曾经犯过一个错误。用5分钟线做螺纹钢和热卷的套利,回测曲线漂亮得不行。结果实盘一跑,手续费直接把利润吃光了。后来改成小时线,反而稳定盈利。
避坑指南:频率越高,微观结构噪音越大。比如分钟线里的买卖价差、订单流不平衡,都会干扰价差信号。我建议新手从日线开始,跑通了再降频率。
选择频率时,还要考虑品种的流动性。像螺纹钢这种成交量大的品种,小时线就够用。但如果是某些冷门品种,日线可能都嫌噪音多。
知识体系总览
下面这张图,是我做套利分析时脑子里始终绷着的一根弦:
这张图把三个核心要素串起来了。价差和比价是输入,频率选择是参数,最终都要落到平稳性检验上。
实战中的几个坑
最后分享几个我踩过的坑:
- 数据对齐问题:两个品种的交易时间可能不同。比如国内期货有夜盘,有些品种夜盘交易到凌晨,有些只到晚上11点。不对齐就做价差,结果全是错的。
- 复权处理:遇到分红、送股、合约换月,价格会跳空。我一般用后复权,或者干脆把换月那几天的数据剔除。
- 极端值处理:价差序列偶尔会出现极端值,比如某天一个品种涨停另一个跌停。我习惯用3倍标准差做截断,或者用中位数滤波。
一个小技巧:构建完价差序列后,先画个图看看。肉眼观察比任何统计检验都直观。如果价差看起来像随机游走,那基本没戏。
好了,价差和比价这部分就聊到这儿。记住一句话:序列构建的质量,决定了套利策略的天花板。数据没处理好,后面再花哨的模型都是白搭。