价差计算与图表:从公式到实战

做跨期套利,说白了就是盯着价差吃饭。但价差这东西,看不见摸不着,你得把它算出来、画出来,才能找到规律。这一节,我就带你走一遍完整的流程——从最基础的价差公式,到绘制季节性模式图。

价差公式:核心中的核心

先明确一个概念。价差,就是两个不同月份合约的价格差。公式很简单:

价差 = 近月合约价格 - 远月合约价格

或者反过来,看你的交易习惯。我个人习惯用「近月减远月」,因为这样能直观反映近强远弱还是近弱远强。

举个例子:

  • 螺纹钢 2401 合约价格:3800 元/吨
  • 螺纹钢 2405 合约价格:3750 元/吨
  • 价差 = 3800 - 3750 = 50 元/吨

价差为正,说明近月比远月贵,这叫「正向市场」或「backwardation」。价差为负,远月更贵,叫「反向市场」或「contango」。嗯,这里要注意:不同品种、不同市场环境下,价差的含义完全不同。

重要提醒: 价差公式虽然简单,但实际应用中,你得考虑合约的乘数、报价单位、最小变动价位。比如股指期货的价差是点数,而商品期货是元/吨。别搞混了。

价差序列:把时间轴拉出来

单点的价差没意义。你得看价差怎么随时间变化。这就引出了价差序列——把每个交易日的价差按时间顺序排列。

我在项目中遇到过一个问题:两个合约的交易日不完全对齐。比如近月合约快到期了,流动性变差,价差数据开始失真。这时候,我建议你只取两个合约都有足够成交量的时间段。

构建价差序列的步骤:

  1. 获取两个合约的日收盘价(或分钟收盘价)
  2. 对齐时间戳,剔除缺失值
  3. 逐日计算价差
  4. 存储为时间序列
# 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())
小技巧: 如果你用分钟数据,记得先做降噪处理。我曾经直接用原始分钟数据画图,结果全是毛刺,根本看不出趋势。后来加了5分钟移动平均,效果就好多了。

价差图绘制:一眼看出规律

数据算出来了,下一步就是画图。价差图的核心目的只有一个:让你一眼看出价差在什么位置、什么趋势、有没有异常。

我常用的价差图有三种:

  • 折线图: 最基础,看趋势和波动
  • 柱状图: 看价差分布,找极值
  • 叠加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()
核心逻辑: 季节性模式不是铁律,而是概率。它告诉你「历史上这个月份价差大概率会怎么走」,但不保证未来一定重复。我见过太多人把季节性当成圣杯,结果被一次异常行情打爆。记住:季节性只是辅助,不是决策的唯一依据。

知识体系总览

下面这张图,把价差计算与图表的整个流程串起来了。你可以把它当作一个检查清单:

价差计算与图表知识体系 合约价格数据 近月 + 远月 时间对齐 价差 = 近月 - 远月 价差时间序列 折线图 季节性模式图 叠加K线图

从数据输入到价差计算,再到序列构建和图表绘制,每一步都有坑。但只要你按这个流程走一遍,就能建立起对价差的直观理解。后面做策略设计时,这些图表就是你最得力的助手。

我的习惯: 每做一个新品种的套利策略,我都会先花一周时间画图。把过去3-5年的价差图、季节性图、波动率图全部画出来,贴在墙上。看久了,你自然就能发现一些别人看不到的规律。

专注资料整理