第四章:数据获取——你的套利策略的“原材料”质量决定一切

做量化交易,尤其是跨市场价差套利,我经常跟团队说一句话:“策略是灵魂,数据是血肉”。没有干净、对齐的数据,再牛的模型也是空中楼阁。这一章,咱们就聊聊数据获取那些事儿——从哪儿拿数据、怎么洗数据、怎么对齐时间戳,以及频率怎么选。

嗯,先别急着写代码。咱们先搞清楚几个核心问题。

4.1 数据源选择:API、数据库、CSV,各有各的脾气

我个人习惯把数据源分成三类。每一类都有它的适用场景,也有它的坑。

数据源类型 优点 缺点 我常用的场景
API(实时/历史) 实时性强,自动更新,无需本地存储 有调用频率限制,可能收费,网络依赖 实盘交易、盘中监控
数据库(本地/云端) 存储量大,查询快,支持复杂过滤 需要维护,初期搭建成本高 回测系统、历史数据仓库
CSV/Excel文件 简单直接,方便分享,适合小规模 加载慢,不适合高频,容易出错 快速验证、教学演示

我在项目中遇到过最尴尬的事:用CSV做回测,结果发现某天的数据因为Excel自动格式化,把时间戳变成了“2024-01-01 0:00”这种奇葩格式。从那以后,但凡涉及时间序列,我坚决不用Excel直接编辑数据。

核心原则:实盘用API,回测用数据库,快速验证用CSV。别混着用,除非你很清楚自己在做什么。

4.2 数据清洗与对齐——这才是真正的“脏活累活”

你想想看,从不同交易所拿到的数据,时间戳格式能一样吗?上海期货交易所用的是北京时间,CME用的是芝加哥时间,中间还有夏令时冬令时。如果不做对齐,你的价差信号全是错的。

我一般按以下步骤来清洗和对齐数据:

  1. 统一时间戳:全部转为UTC+0,或者全部转为北京时间。我个人习惯用UTC+0,因为跨市场时区转换最方便。
  2. 去除重复数据:API偶尔会推送重复的tick,用drop_duplicates()处理。
  3. 排序:按时间戳升序排列,这是所有后续操作的基础。
  4. 对齐时间轴:不同市场交易时间不同,比如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 本章知识体系总览

下面这张图是我自己梳理的数据获取流程,你可以把它当作一个检查清单:

数据获取与处理流程 数据源选择 数据清洗与对齐 缺失值处理 频率选择 干净的对齐数据 API / 数据库 / CSV 统一时区 / 去重 / 排序 核心原则:宁可缺失,不可错误 每个环节都需要验证,不要跳过任何一步

这张图把整个数据获取流程串起来了。从数据源选择开始,经过清洗对齐、缺失值处理,再到频率选择,最后输出干净的对齐数据。每一步都有坑,每一步都需要你亲自验证。

好了,数据获取这部分就聊到这儿。记住一句话:数据质量决定了你的策略天花板。花80%的时间在数据上,剩下的20%写策略,这个比例一点都不夸张。


公众号:蓝海资料掘金营,微信deep3321