第二节 价差计算与数据源
做跨期套利,说白了就两件事:算价差、拿数据。
价差算不对,策略白费。数据拿不到,巧妇难为无米之炊。
这一节,我把这两件事掰开了讲。都是实战里踩过坑才总结出来的东西。
一、价差公式:别小看这个减法
价差公式本身很简单:
价差 = 近月合约价格 - 远月合约价格
或者反过来,看你的习惯。我个人习惯用近月减远月。为什么?因为这样价差为正时,代表近月比远月贵,也就是市场在「升水」或「backwardation」——嗯,这个后面会细讲。
但这里有个坑:价格单位要统一。
我在项目中遇到过,有人拿螺纹钢的期货价格直接算价差。螺纹钢是10吨/手,价格是每吨的报价。你直接用报价减报价,没问题。但你要是做股指期货,IF合约是每点300元,你算价差时就得小心——你算的是点数差,还是金额差?
另外,有些品种的价差需要做「复权处理」。比如有分红预期的股指期货,或者有仓储成本的大宗商品。我建议你拿到原始价差后,先画个图看看,有没有明显的跳空缺口——那往往是合约换月造成的,不是真正的套利机会。
二、主力合约与次主力合约
做跨期套利,你得知道哪个合约是「老大」,哪个是「老二」。
主力合约:成交量最大、持仓量最大的合约。流动性最好,滑点最小。
次主力合约:成交量、持仓量排第二的合约。通常和主力合约相差1-3个月。
为什么要区分它们?
- 流动性差异:主力合约买卖价差小,次主力可能大一些
- 换月规律:主力合约大约每1-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月合约。你得自己判断哪个是主力、哪个是次主力。
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 的数据可能比行情慢几秒到几分钟。做高频套利肯定不行,但做日线级别的跨期套利,完全够用。
四、知识体系框架图
下面这张图,是我自己整理的数据流框架。从原始数据到最终价差,每一步都有坑,每一步都得小心。
这张图的核心逻辑是:数据源 → 合约筛选 → 数据处理 → 价差计算 → 输出。每一步都有对应的工具和方法,每一步也都有潜在的坑。
五、实战中的几个小建议
最后,分享几个我自己的习惯:
- 数据源至少备两个。一个主用,一个备用。万一主数据源挂了,你还能继续跑策略。我曾经因为 Wind 服务器维护,整整半天拿不到数据,幸好有 Tushare 顶着。
- 价差数据要存本地。每次从数据源拉下来后,存成 CSV 或者 SQLite。这样回测时不用反复请求,也方便做数据对比。
- 定期校验主力合约。每周跑一次脚本,检查当前的主力合约是否还是「真主力」。如果发现成交量排名变了,及时更新。
- 别迷信「实时数据」。做跨期套利,日线级别的数据完全够用。实时数据反而容易引入噪音,让你做出错误判断。
好了,价差计算和数据源这块就讲这么多。说白了,工具都是现成的,关键是你怎么用、怎么避坑。下一节我们会聊到价差的统计特征——嗯,那才是真正有意思的部分。