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小时盯着屏幕。所以我们要设定规则,让程序自动标记异常价差。
常用的方法有两种:
- 标准差法:价差超过均值±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