第三章 农产品市场数据结构:期货合约规格、现货价格数据、天气与供需数据、数据频率与对齐问题
做量化套利,数据就是你的弹药。弹药不行,枪法再好也白搭。
这一章,咱们聊聊农产品市场的几类核心数据。我刚开始做这个领域时,踩过不少坑。比如拿错合约月份,或者把不同频率的数据硬凑在一起,结果回测曲线漂亮得像假的一样。嗯,这些教训我会一一告诉你。
3.1 期货合约规格:别小看这张“身份证”
每个期货合约都有它的规格。说白了,就是这张合约的“身份证”。你想想看,做套利时连合约规格都不清楚,那不是瞎搞吗?
我个人习惯,拿到一个新品种,第一件事就是去交易所官网查它的合约文本。重点关注这几个字段:
- 交易单位:比如豆粕是10吨/手,玉米是10吨/手。不同品种不一样,套利时要注意单位换算。
- 最小变动价位:比如豆粕是1元/吨,那每跳就是10元。这个直接影响你的滑点成本。
- 交割月份:农产品一般有1、3、5、7、9、11月合约。做跨期套利时,这个就是你的“战场”。
- 最后交易日:千万别在临近交割时还持仓,我见过有人因为忘记移仓,被逼着去拉了一车大豆回来。
核心要点:合约规格是数据清洗的第一步。如果你拿到的数据里合约代码和实际规格对不上,那后面的分析全是错的。
举个例子,我曾经在项目中处理过郑商所的苹果期货。它的交易单位是10吨/手,但最小变动价位是1元/吨。当时有个同事没注意,把苹果和红枣的合约规格搞混了,结果套利信号全乱套。嗯,从那以后我每次建新数据库,都会先写一个合约规格校验脚本。
3.2 现货价格数据:你的“锚”在哪里?
期货价格最终要向现货回归。所以现货数据是套利策略的“锚”。但现货数据有个麻烦——它不像期货那样有标准化的交易所报价。
常见的现货数据来源有:
- 产区报价:比如黑龙江的大豆收购价,山东的玉米深加工价。
- 港口报价:比如广东港的进口大豆分销价,这个对进口品种很重要。
- 批发市场价格:比如北京新发地市场的蔬菜价格,频率高但波动大。
我个人建议,做套利时至少用两个不同来源的现货数据做交叉验证。为什么?因为现货市场信息不对称,一个报价可能只是某家贸易商的“试探性报价”,不代表真实成交价。
小技巧:如果你拿到的现货数据是周度或旬度的,可以用线性插值法填充到日频。但要注意,插值会引入“伪数据”,回测时要小心过拟合。
3.3 天气与供需数据:农产品的“命门”
农产品和股票最大的区别是什么?股票看公司,农产品看天。
天气数据、供需报告,这些才是驱动农产品价格的核心变量。我做过一个豆粕的套利策略,核心因子就是美国中西部主产区的降雨量。那年干旱,豆粕价格直接起飞,我的策略也跟着吃了一口大肉。
常见的天气与供需数据包括:
- 气象数据:温度、降雨量、土壤湿度。美国农业部(USDA)有免费的全球气象数据,但频率一般是日度。
- 供需报告:USDA的月度供需报告(WASDE),国内有中国粮油信息中心的周度报告。这些报告发布时,市场波动会非常大。
- 种植面积与单产:每年6月底的种植面积报告,以及8-10月的单产预估,都是关键节点。
避坑指南:我曾经在回测时直接用USDA的月度数据,但没注意到报告发布时间是北京时间凌晨。结果策略在报告发布前就开仓了,完全没吃到报告带来的波动。后来我改成用“报告发布后第一个交易日”的数据,才解决了这个问题。
3.4 数据频率与对齐问题:最容易翻车的环节
好了,现在你手里有期货日线数据、现货周度数据、天气日度数据。怎么把它们对齐到同一个时间轴上?
这个问题,我敢说80%的新手都栽过跟头。
常见的频率对齐方式:
| 数据频率 | 对齐方式 | 注意事项 |
|---|---|---|
| 日频 vs 日频 | 直接按日期合并 | 注意节假日差异,国内期货有夜盘,但现货没有 |
| 日频 vs 周频 | 用周频数据填充到该周每个交易日 | 或者用前一周的数据作为本周的“已知信息” |
| 日频 vs 月频 | 用月频数据填充到该月每个交易日 | 注意报告发布日,不要用未来数据 |
我个人习惯,在数据对齐时一定会加一个“未来数据检查”。比如,你用USDA的月度报告数据,那报告是10号发布的,你只能用10号及之后的数据,不能把整个月的数据都当成“已知”。
下面是我常用的一个数据对齐代码片段:
import pandas as pd
# 假设期货数据是日频,现货数据是周频
futures = pd.read_csv('futures_daily.csv', index_col='date', parse_dates=True)
spot = pd.read_csv('spot_weekly.csv', index_col='date', parse_dates=True)
# 将周频数据向前填充到日频
# 注意:这里用ffill,表示本周的现货数据从本周第一个交易日开始可用
spot_daily = spot.reindex(futures.index, method='ffill')
# 合并数据
data = pd.concat([futures, spot_daily], axis=1)
data.dropna(inplace=True)
print(data.head())
核心要点:数据对齐的核心原则是“不要用未来数据”。任何填充、插值操作,都要确保在回测时不会引入未来信息。
嗯,这里还要提一个坑:不同交易所的节假日不一样。比如国内期货市场春节休市一周,但美国芝加哥商品交易所(CBOT)还在交易。如果你做内外盘套利,那数据对齐就更复杂了。我一般会先统一成“交易日历”,把两个市场的交易日都列出来,然后只取共同交易日。
3.5 知识体系结构图
下面这张图,是我自己总结的农产品数据体系。你可以把它当成一个“数据地图”,做策略时对照着看,不容易漏掉关键数据。
这张图把本章的知识点串起来了。从最底层的合约规格,到中间的现货、天气数据,再到顶层的频率对齐问题。你每次做策略前,可以对照这张图检查一下,看看自己是不是漏掉了哪个环节。
个人经验:我一般会在项目初期花30%的时间在数据清洗和对齐上。别嫌慢,这一步做好了,后面的建模和回测会顺畅很多。我曾经因为偷懒,直接用没对齐的数据跑回测,结果策略在实盘时直接亏了两个月。嗯,从那以后我再也不敢省这一步了。
好了,这一章的内容就到这里。数据是量化套利的命根子,把数据结构搞清楚了,后面的策略才能站得住脚。
公众号:蓝海数据掘金营,微信deep3321