第二节 价差计算与数据源

做跨期套利,说白了就两件事:算价差、拿数据。

价差算不对,策略白费。数据拿不到,巧妇难为无米之炊。

这一节,我把这两件事掰开了讲。都是实战里踩过坑才总结出来的东西。

一、价差公式:别小看这个减法

价差公式本身很简单:

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

或者反过来,看你的习惯。我个人习惯用近月减远月。为什么?因为这样价差为正时,代表近月比远月贵,也就是市场在「升水」或「backwardation」——嗯,这个后面会细讲。

但这里有个坑:价格单位要统一

我在项目中遇到过,有人拿螺纹钢的期货价格直接算价差。螺纹钢是10吨/手,价格是每吨的报价。你直接用报价减报价,没问题。但你要是做股指期货,IF合约是每点300元,你算价差时就得小心——你算的是点数差,还是金额差?

⚠️ 注意: 价差计算时,务必确认两个合约的乘数、报价单位完全一致。否则算出来的价差毫无意义。

另外,有些品种的价差需要做「复权处理」。比如有分红预期的股指期货,或者有仓储成本的大宗商品。我建议你拿到原始价差后,先画个图看看,有没有明显的跳空缺口——那往往是合约换月造成的,不是真正的套利机会。

二、主力合约与次主力合约

做跨期套利,你得知道哪个合约是「老大」,哪个是「老二」。

主力合约:成交量最大、持仓量最大的合约。流动性最好,滑点最小。

次主力合约:成交量、持仓量排第二的合约。通常和主力合约相差1-3个月。

为什么要区分它们?

  • 流动性差异:主力合约买卖价差小,次主力可能大一些
  • 换月规律:主力合约大约每1-3个月换一次,你得跟着换
  • 价差特征:主力-次主力价差通常更稳定,适合做统计套利

我自己的经验是:别死盯着「主力合约」的定义。有些软件按成交量排,有些按持仓量排。你想想看,如果某个合约成交量突然暴增,但持仓量没跟上,那可能是游资在搞事,不是真正的移仓换月。

💡 我的做法: 同时看成交量和持仓量,取两者的加权排名。如果某个合约连续3天成交量排名第一,我就把它当主力合约。

曾经有一次,我按某数据源的「主力合约」标签做策略,结果发现它换月滞后了整整两天。那两天里我用的其实是旧主力合约,流动性已经不行了,滑点吃掉了我所有利润。嗯,从那以后我再也不信单一数据源的标签了。

三、数据获取渠道:三个主流方案

数据源这块,我试过不下十种。最后常用的就三个:Wind、聚宽、Tushare。

数据源 优点 缺点 适合场景
Wind 数据最全、最准,机构标配 贵,个人用户难获取 机构实盘、回测验证
聚宽 免费,API友好,有回测平台 期货数据不如股票全 个人研究、策略原型
Tushare 开源,社区活跃,数据种类多 需要积分,部分数据有延迟 量化学习、小规模实盘

1. Wind 数据获取

Wind 的 API 叫 WindPy。用起来很简单:

from WindPy import w
w.start()

# 获取螺纹钢主力合约和次主力合约的收盘价
data = w.wsd("RB2401.SHF,RB2405.SHF", "close", "2024-01-01", "2024-03-01")
print(data.Data)

但要注意:Wind 的合约代码规则是「品种+年份+月份」。比如 RB2401 是螺纹钢2024年1月合约。你得自己判断哪个是主力、哪个是次主力。

🔑 关键点: Wind 有专门的函数可以获取主力合约连续数据,叫 w.wsi 或 w.wsd 配合 "maincon" 参数。但我建议你还是自己算,因为「主力」的定义在不同时期可能变化。

2. 聚宽数据获取

聚宽的数据获取方式更 Pythonic:

from jqdatasdk import *
auth('你的账号', '你的密码')

# 获取所有期货合约信息
futures = get_all_securities(types=['futures'])
print(futures.head())

# 获取特定合约的日线数据
df = get_price('RB2401.XSGE', start_date='2024-01-01', end_date='2024-03-01', frequency='daily')
print(df.head())

聚宽的好处是它自带「主力合约」的筛选逻辑。你直接用 get_future_contracts 函数,它会返回当前的主力合约列表。不过,我建议你交叉验证一下——聚宽的主力合约判断标准偏保守,有时候换月会慢一拍。

3. Tushare 数据获取

Tushare 是开源方案里我最喜欢的。代码也很简洁:

import tushare as ts
ts.set_token('你的token')
pro = ts.pro_api()

# 获取期货日线数据
df = pro.fut_daily(ts_code='RB2401.SHF', start_date='20240101', end_date='20240301')
print(df.head())

Tushare 的期货数据覆盖面很广,但有个问题:数据延迟。实盘交易时,Tushare 的数据可能比行情慢几秒到几分钟。做高频套利肯定不行,但做日线级别的跨期套利,完全够用。

⚠️ 注意: 无论用哪个数据源,一定要做数据清洗。我遇到过 Tushare 某天的数据出现重复行,也遇到过 Wind 的数据缺失。写个简单的校验脚本,检查数据完整性,花不了10分钟,但能省你后面几天的排查时间。

四、知识体系框架图

下面这张图,是我自己整理的数据流框架。从原始数据到最终价差,每一步都有坑,每一步都得小心。

跨期套利价差数据流 数据源 Wind / 聚宽 / Tushare 合约筛选 主力 vs 次主力 数据处理 清洗 / 对齐 / 复权 价差计算 近月 - 远月 价差序列输出 数据流方向 → 从左到右

这张图的核心逻辑是:数据源 → 合约筛选 → 数据处理 → 价差计算 → 输出。每一步都有对应的工具和方法,每一步也都有潜在的坑。

五、实战中的几个小建议

最后,分享几个我自己的习惯:

  1. 数据源至少备两个。一个主用,一个备用。万一主数据源挂了,你还能继续跑策略。我曾经因为 Wind 服务器维护,整整半天拿不到数据,幸好有 Tushare 顶着。
  2. 价差数据要存本地。每次从数据源拉下来后,存成 CSV 或者 SQLite。这样回测时不用反复请求,也方便做数据对比。
  3. 定期校验主力合约。每周跑一次脚本,检查当前的主力合约是否还是「真主力」。如果发现成交量排名变了,及时更新。
  4. 别迷信「实时数据」。做跨期套利,日线级别的数据完全够用。实时数据反而容易引入噪音,让你做出错误判断。
💡 我的小工具: 我写了一个 Python 脚本,每天收盘后自动从三个数据源拉取数据,做交叉验证。如果某个数据源的数据和其他两个偏差超过0.5%,就发邮件报警。这个脚本帮我抓出过好几次数据异常。

好了,价差计算和数据源这块就讲这么多。说白了,工具都是现成的,关键是你怎么用、怎么避坑。下一节我们会聊到价差的统计特征——嗯,那才是真正有意思的部分。

专注资料整理