第四章:数据获取——你的套利策略的“原材料”质量决定一切
做量化交易,尤其是跨市场价差套利,我经常跟团队说一句话:“策略是灵魂,数据是血肉”。没有干净、对齐的数据,再牛的模型也是空中楼阁。这一章,咱们就聊聊数据获取那些事儿——从哪儿拿数据、怎么洗数据、怎么对齐时间戳,以及频率怎么选。
嗯,先别急着写代码。咱们先搞清楚几个核心问题。
4.1 数据源选择:API、数据库、CSV,各有各的脾气
我个人习惯把数据源分成三类。每一类都有它的适用场景,也有它的坑。
| 数据源类型 | 优点 | 缺点 | 我常用的场景 |
|---|---|---|---|
| API(实时/历史) | 实时性强,自动更新,无需本地存储 | 有调用频率限制,可能收费,网络依赖 | 实盘交易、盘中监控 |
| 数据库(本地/云端) | 存储量大,查询快,支持复杂过滤 | 需要维护,初期搭建成本高 | 回测系统、历史数据仓库 |
| CSV/Excel文件 | 简单直接,方便分享,适合小规模 | 加载慢,不适合高频,容易出错 | 快速验证、教学演示 |
我在项目中遇到过最尴尬的事:用CSV做回测,结果发现某天的数据因为Excel自动格式化,把时间戳变成了“2024-01-01 0:00”这种奇葩格式。从那以后,但凡涉及时间序列,我坚决不用Excel直接编辑数据。
核心原则:实盘用API,回测用数据库,快速验证用CSV。别混着用,除非你很清楚自己在做什么。
4.2 数据清洗与对齐——这才是真正的“脏活累活”
你想想看,从不同交易所拿到的数据,时间戳格式能一样吗?上海期货交易所用的是北京时间,CME用的是芝加哥时间,中间还有夏令时冬令时。如果不做对齐,你的价差信号全是错的。
我一般按以下步骤来清洗和对齐数据:
- 统一时间戳:全部转为UTC+0,或者全部转为北京时间。我个人习惯用UTC+0,因为跨市场时区转换最方便。
- 去除重复数据:API偶尔会推送重复的tick,用
drop_duplicates()处理。 - 排序:按时间戳升序排列,这是所有后续操作的基础。
- 对齐时间轴:不同市场交易时间不同,比如A股9:30开盘,港股9:00开盘。你需要找到共同交易时段。
这里给一段我常用的对齐代码,用Pandas实现:
import pandas as pd
# 假设df1是A市场数据,df2是B市场数据
# 先统一时间戳为UTC
df1['time_utc'] = pd.to_datetime(df1['timestamp']).dt.tz_convert('UTC')
df2['time_utc'] = pd.to_datetime(df2['timestamp']).dt.tz_convert('UTC')
# 设置索引并排序
df1 = df1.set_index('time_utc').sort_index()
df2 = df2.set_index('time_utc').sort_index()
# 找到共同时间区间
start = max(df1.index.min(), df2.index.min())
end = min(df1.index.max(), df2.index.max())
# 按分钟重采样并取最后价格(适用于分钟级套利)
df1_aligned = df1[start:end].resample('1T').last()
df2_aligned = df2[start:end].resample('1T').last()
# 合并成一个DataFrame
merged = pd.DataFrame({
'price_A': df1_aligned['close'],
'price_B': df2_aligned['close']
}).dropna()
小技巧:对齐时别用ffill()(向前填充)太多。我曾经因为连续填充了5分钟的数据,导致价差信号出现假突破,亏了一笔。宁可丢掉缺失的数据点,也别用错误的数据点。
4.3 缺失值处理——别让“空”坑了你
为什么会缺失数据?原因太多了:交易所断线、网络波动、节假日不同、交易时间不一致……
我处理缺失值的策略很简单,分三种情况:
- 少量缺失(<5%):直接删除。对于套利策略,少几个数据点影响不大。
- 中等缺失(5%-20%):用前一个有效值填充,但要做好标记。我习惯加一列
is_filled来记录哪些数据是填充的。 - 大量缺失(>20%):停!别做套利了。这个时间段两个市场可能根本不同步,强行做只会亏钱。
警告:千万不要用均值填充时间序列数据!金融数据有自相关性,均值填充会破坏这种结构。我曾经见过有人用fillna(method='mean')处理价差数据,结果回测曲线漂亮得不像话,实盘直接崩了。
4.4 数据频率选择——不是越快越好
很多新手一上来就追求tick级数据,觉得越精细越好。其实不然。
我根据套利策略的类型,一般这样选频率:
| 套利类型 | 推荐频率 | 理由 |
|---|---|---|
| 跨市场价差(如股指期货) | 1分钟或5分钟 | 市场间传导需要时间,太快的频率噪声大 |
| 跨品种套利(如豆粕-菜粕) | 日线 | 基本面驱动,短期波动无意义 |
| 期现套利 | 1秒或tick | 价差窗口极短,需要快速捕捉 |
| ETF套利 | tick级 | 套利机会转瞬即逝,毫秒级竞争 |
我记得有一次做沪深300和中证500的跨品种套利,一开始用tick数据,结果发现价差序列全是噪声,根本找不到稳定的统计规律。后来换成5分钟频率,信号一下子就清晰了。说白了,频率的选择取决于你的套利逻辑的时间尺度。
4.5 本章知识体系总览
下面这张图是我自己梳理的数据获取流程,你可以把它当作一个检查清单:
这张图把整个数据获取流程串起来了。从数据源选择开始,经过清洗对齐、缺失值处理,再到频率选择,最后输出干净的对齐数据。每一步都有坑,每一步都需要你亲自验证。
好了,数据获取这部分就聊到这儿。记住一句话:数据质量决定了你的策略天花板。花80%的时间在数据上,剩下的20%写策略,这个比例一点都不夸张。
公众号:蓝海资料掘金营,微信deep3321