价差计算与图表:从公式到实战
做跨期套利,说白了就是盯着价差吃饭。但价差这东西,看不见摸不着,你得把它算出来、画出来,才能找到规律。这一节,我就带你走一遍完整的流程——从最基础的价差公式,到绘制季节性模式图。
价差公式:核心中的核心
先明确一个概念。价差,就是两个不同月份合约的价格差。公式很简单:
价差 = 近月合约价格 - 远月合约价格
或者反过来,看你的交易习惯。我个人习惯用「近月减远月」,因为这样能直观反映近强远弱还是近弱远强。
举个例子:
- 螺纹钢 2401 合约价格:3800 元/吨
- 螺纹钢 2405 合约价格:3750 元/吨
- 价差 = 3800 - 3750 = 50 元/吨
价差为正,说明近月比远月贵,这叫「正向市场」或「backwardation」。价差为负,远月更贵,叫「反向市场」或「contango」。嗯,这里要注意:不同品种、不同市场环境下,价差的含义完全不同。
价差序列:把时间轴拉出来
单点的价差没意义。你得看价差怎么随时间变化。这就引出了价差序列——把每个交易日的价差按时间顺序排列。
我在项目中遇到过一个问题:两个合约的交易日不完全对齐。比如近月合约快到期了,流动性变差,价差数据开始失真。这时候,我建议你只取两个合约都有足够成交量的时间段。
构建价差序列的步骤:
- 获取两个合约的日收盘价(或分钟收盘价)
- 对齐时间戳,剔除缺失值
- 逐日计算价差
- 存储为时间序列
# Python 示例:构建价差序列
import pandas as pd
# 假设 df_near 和 df_far 是近月和远月合约的日数据
df_near = pd.read_csv('rb2401.csv', index_col='date', parse_dates=True)
df_far = pd.read_csv('rb2405.csv', index_col='date', parse_dates=True)
# 合并两个数据框,只取共同交易日
df = pd.concat([df_near['close'], df_far['close']], axis=1, keys=['near', 'far'])
df.dropna(inplace=True)
# 计算价差
df['spread'] = df['near'] - df['far']
print(df.head())
价差图绘制:一眼看出规律
数据算出来了,下一步就是画图。价差图的核心目的只有一个:让你一眼看出价差在什么位置、什么趋势、有没有异常。
我常用的价差图有三种:
- 折线图: 最基础,看趋势和波动
- 柱状图: 看价差分布,找极值
- 叠加K线图: 把价差和两个合约的价格放在一起,看联动关系
# 绘制价差折线图
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['spread'], color='blue', linewidth=1.5)
plt.axhline(y=0, color='red', linestyle='--', alpha=0.5)
plt.title('螺纹钢 2401-2405 价差序列')
plt.xlabel('日期')
plt.ylabel('价差 (元/吨)')
plt.grid(True, alpha=0.3)
plt.show()
你想想看,如果价差一直在正负50之间来回震荡,那说明市场比较理性。但如果突然冲到200以上,或者跌到-200以下,那大概率是出了什么事件——比如交割月临近、政策突变、或者大户在搞事情。
季节性模式:藏在日历里的规律
很多商品都有季节性。比如农产品,收获季节供应大,价格低;消费旺季需求旺,价格高。这种规律会直接反映在价差上。
我做过一个统计:把过去5年的价差数据按月份分组,计算每个月的均值、标准差、最大值、最小值。结果发现,有些品种的价差在特定月份有非常明显的规律。
举个例子:
| 月份 | 平均价差 | 标准差 | 最大值 | 最小值 |
|---|---|---|---|---|
| 1月 | 45 | 12 | 68 | 22 |
| 2月 | 38 | 15 | 60 | 15 |
| 3月 | 25 | 18 | 55 | -5 |
| 4月 | 10 | 20 | 40 | -20 |
你看,从1月到4月,平均价差从45一路降到10。这说明什么?说明近月合约相对于远月合约在走弱。如果你知道这个规律,就可以在1月价差偏高时做空价差(卖近买远),等4月价差回归再平仓。
绘制季节性模式图,我一般用箱线图或者带状图:
# 季节性箱线图示例
import seaborn as sns
# 假设 df 包含多年价差数据,且有一列 'month'
sns.boxplot(x='month', y='spread', data=df)
plt.title('价差季节性模式')
plt.xlabel('月份')
plt.ylabel('价差')
plt.show()
知识体系总览
下面这张图,把价差计算与图表的整个流程串起来了。你可以把它当作一个检查清单:
从数据输入到价差计算,再到序列构建和图表绘制,每一步都有坑。但只要你按这个流程走一遍,就能建立起对价差的直观理解。后面做策略设计时,这些图表就是你最得力的助手。