4. 相关性研究:品种间价格相关性的度量与筛选方法
做跨品种套利,核心就一句话:找到两个会一起动的品种。但怎么定义「一起动」?靠感觉肯定不行。我见过太多交易员,看着两张K线图走势差不多,就冲进去做套利,结果被市场狠狠教育了一顿。
嗯,这一章我们就来聊聊,怎么用科学的方法度量品种间的相关性,以及如何筛选出真正有套利价值的组合。
4.1 为什么相关性这么重要?
说白了,套利交易的本质就是赌相关性会回归。如果两个品种长期走势高度一致,短期出现背离,那就是机会。但如果它们本来就不相关,那所谓的「背离」可能就是常态,进去就是送钱。
我记得2018年有一次,有人问我螺纹钢和铁矿石能不能做套利。我说你先算算相关系数。他一算,好家伙,才0.3。我说这俩虽然产业链相关,但定价逻辑差异太大,硬做套利风险很高。后来他听了我的建议,没碰这个组合,躲过了一劫。
4.2 度量相关性的常用方法
市面上度量相关性的方法不少,但真正实战中常用的,其实就那么几种。我一个个说。
4.2.1 皮尔逊相关系数
这是最经典的方法。公式我就不写了,你想想看,它就是衡量两个变量线性相关程度的指标。取值范围在-1到1之间。1代表完全正相关,-1代表完全负相关,0代表不相关。
实战中,我一般这样判断:
- 0.8以上: 强相关,适合做套利
- 0.5-0.8: 中等相关,可以做但要小心
- 0.5以下: 弱相关,不建议做套利
但这里有个坑。皮尔逊相关系数对异常值非常敏感。我曾经处理过一组数据,本来相关系数0.85,结果有一天某个品种因为突发事件暴涨,把相关系数直接拉到了0.6。如果你只看整体数据,可能会错过这个组合。
4.2.2 斯皮尔曼秩相关系数
这个方法和皮尔逊类似,但它用的是数据的排名,而不是原始数值。好处是对异常值不那么敏感。
我个人习惯,在分析农产品时更喜欢用斯皮尔曼。为什么?因为农产品经常有天气炒作,价格会出现极端波动。如果用皮尔逊,很容易被这些极端值带偏。斯皮尔曼就稳健得多。
举个实际例子:豆粕和菜粕的相关性分析。如果用皮尔逊算,可能只有0.7左右。但换成斯皮尔曼,能到0.85。为什么?因为豆粕和菜粕的价差有时会突然拉大,但排名关系其实很稳定。
4.2.3 滚动相关系数
静态相关系数有个大问题:它假设相关性是恒定的。但市场会变啊!
2015年之前,螺纹钢和铁矿石的相关性高达0.9。但供给侧改革之后,螺纹钢的定价逻辑变了,相关性一度降到0.4。如果你还用五年前的数据做套利,不亏钱才怪。
所以,我建议用滚动相关系数。就是取一个固定窗口(比如60个交易日),每天计算窗口内的相关系数。这样你能看到相关性的动态变化。
# Python代码示例:计算滚动相关系数
import pandas as pd
import numpy as np
def rolling_corr(series1, series2, window=60):
"""
计算两个时间序列的滚动相关系数
series1, series2: pandas Series,索引为日期
window: 滚动窗口大小,默认60个交易日
"""
return series1.rolling(window).corr(series2)
# 示例:计算螺纹钢和热卷的滚动相关系数
rb_price = pd.Series(...) # 螺纹钢价格数据
hr_price = pd.Series(...) # 热卷价格数据
rolling_corr_rb_hr = rolling_corr(rb_price, hr_price, window=60)
# 如果滚动相关系数持续低于0.6,就要警惕了
if rolling_corr_rb_hr.iloc[-1] < 0.6:
print("警告:相关性显著下降,建议暂停该组合的套利交易")
4.3 筛选有效组合的实战流程
光会算相关系数还不够,你得有一套筛选流程。我总结了一个四步法:
- 初筛: 用皮尔逊相关系数快速过滤,保留相关系数绝对值大于0.7的组合
- 复筛: 用斯皮尔曼相关系数验证,剔除那些因为异常值导致高相关的组合
- 动态检验: 计算滚动相关系数,确保相关性在最近一段时间内保持稳定
- 逻辑验证: 从产业链角度分析,这两个品种是否有真实的套利逻辑
第四步很多人会忽略。我见过有人算出铜和铝的相关系数高达0.85,兴冲冲要做套利。但仔细一想,铜和铝虽然都是有色金属,但下游应用完全不同,定价逻辑差异很大。这种高相关可能只是宏观因素导致的伪相关,一旦宏观环境变化,相关性就会崩塌。
4.4 知识体系框架
下面这张图,是我自己整理的相关性研究框架。你一看就明白了。
4.5 实战中的注意事项
最后,我再唠叨几点实战中容易踩的坑:
- 不要只看日线数据。 我建议至少看小时线或者30分钟线,套利交易往往在日内完成,日线级别的相关性可能滞后。
- 注意数据频率的一致性。 两个品种的交易时间可能不同,比如国内期货有夜盘,有些品种夜盘交易活跃,有些则不然。处理数据时一定要对齐时间戳。
- 相关性不等于因果关系。 两个品种相关性高,不代表一个涨另一个就一定涨。可能是共同受到某个宏观因素影响。
- 定期重新计算。 我每个月都会重新跑一遍所有组合的相关性,看看有没有变化。市场在变,你的模型也得跟着变。