4. 价差计算与可视化:让数据自己说话

做价差交易,最怕什么?

怕你盯着两个价格看了半天,脑子一团浆糊。说实话,人眼对数字的敏感度远不如对图形的敏感度。所以这一节,我们就来解决这个问题——把枯燥的价差数据,变成一眼就能看懂的图表。

4.1 价差计算:核心公式就一行

价差的计算,说白了就是现货价格减去期货价格。但这里有个细节,我刚开始做的时候踩过坑。

# 基础价差计算
spread = spot_price - futures_price

嗯,就这么简单。但为什么有人算出来是负的?

因为期货价格有时候会高于现货,这叫「升水」。反过来,期货低于现货叫「贴水」。价差的正负,其实反映了市场情绪。

我的习惯:我会同时计算绝对值价差和百分比价差。百分比价差 = (现货 - 期货) / 现货 * 100%。这样不同品种之间也能横向对比。

4.2 价差序列绘制:把数字变成线条

拿到价差数据后,第一件事就是画图。我个人习惯用 Matplotlib,轻量、灵活。

import matplotlib.pyplot as plt
import pandas as pd

# 假设 df 包含 'timestamp', 'spread' 两列
plt.figure(figsize=(12, 6))
plt.plot(df['timestamp'], df['spread'], label='价差', color='#2E86AB')
plt.title('现货与期货价差序列')
plt.xlabel('时间')
plt.ylabel('价差 (元)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

你想想看,一条线拉出来,哪里价差扩大、哪里收窄,一目了然。我在项目中遇到过,有些交易员只看数字,结果错过了明显的背离信号。画出来之后,他当场就拍桌子说「早该这么干」。

4.3 移动平均线叠加:平滑噪音,看清趋势

原始价差线太「毛躁」了,全是毛刺。这时候就需要移动平均线来帮忙。

移动平均线的作用,就是过滤掉短期噪音,让你看到真正的趋势方向。

# 计算移动平均线
df['ma_short'] = df['spread'].rolling(window=5).mean()   # 短期均线
df['ma_long'] = df['spread'].rolling(window=20).mean()    # 长期均线

# 绘制
plt.figure(figsize=(12, 6))
plt.plot(df['timestamp'], df['spread'], alpha=0.5, label='原始价差')
plt.plot(df['timestamp'], df['ma_short'], label='5期均线', linewidth=2)
plt.plot(df['timestamp'], df['ma_long'], label='20期均线', linewidth=2)
plt.legend()
plt.show()
避坑指南:我曾经把窗口设得太小(比如3期),结果均线跟原始线几乎重合,完全没起到平滑作用。后来我总结:短期均线用5-10期,长期用20-30期,具体看你的数据频率。5分钟线和日线,窗口大小肯定不一样。

4.4 异常价差标记:让系统帮你盯盘

人不可能24小时盯着屏幕。所以我们要设定规则,让程序自动标记异常价差。

常用的方法有两种:

  1. 标准差法:价差超过均值±2倍标准差,就算异常
  2. 百分位法:价差处于历史分布的5%以下或95%以上,算异常
# 标准差法标记异常
mean_spread = df['spread'].mean()
std_spread = df['spread'].std()
upper_bound = mean_spread + 2 * std_spread
lower_bound = mean_spread - 2 * std_spread

df['anomaly'] = (df['spread'] > upper_bound) | (df['spread'] < lower_bound)

# 可视化标记
plt.figure(figsize=(12, 6))
plt.plot(df['timestamp'], df['spread'], label='价差', color='gray')
plt.scatter(df[df['anomaly']]['timestamp'], 
            df[df['anomaly']]['spread'], 
            color='red', s=50, label='异常点')
plt.axhline(y=upper_bound, color='orange', linestyle='--', label='上界')
plt.axhline(y=lower_bound, color='orange', linestyle='--', label='下界')
plt.legend()
plt.show()

为什么用2倍标准差?其实这不是绝对的。我在做股指期货价差时,发现2倍标准差太宽松,异常信号太少。后来改成1.5倍,效果好了很多。这个参数,你得根据实际数据调。

4.5 知识体系总览

下面这张图,把本章的核心逻辑串起来了。你看一遍,心里就有谱了。

价差计算与可视化核心流程 现货价格 + 期货价格 价差 = 现货 - 期货 绘制价差序列 叠加移动平均线 标记异常价差点 趋势判断 + 交易信号 异常预警 + 套利机会

4.6 实战中的几个要点

环节 常见问题 我的建议
数据对齐 现货和期货时间戳不一致 用 pandas 的 resample 或 asfreq 统一到同一时间频率
异常判断 阈值设得太死板 用滚动窗口计算动态阈值,适应市场变化
可视化 图表太拥挤看不清 分开绘制子图,或者用交互式图表(Plotly)

核心要点:价差可视化不是「画个图就完事」。你要让图表帮你回答三个问题:

  • 当前价差处于什么位置?(偏高/偏低/正常)
  • 趋势是扩大还是收窄?(均线方向)
  • 有没有极端情况需要关注?(异常点)

嗯,这一节的内容就到这里。记住,工具是死的,思路是活的。你把这些代码跑通之后,可以试着改改参数、换换颜色,找到最适合自己交易习惯的展示方式。


公众号:蓝海资料掘金营,微信deep3321