数据获取与清洗:行情数据获取、数据对齐与重采样、缺失值处理、异常值检测、数据存储
做套利交易,说白了就是跟数据打交道。我见过太多策略在回测时跑得飞起,一上实盘就崩,十有八九是数据环节出了问题。今天咱们就把这块硬骨头啃下来。
行情数据获取:你的数据源靠谱吗?
我个人习惯把数据源分成两类:一类是交易所直连,另一类是第三方聚合。交易所直连延迟低、数据准,但门槛高,你得有席位、有接口权限。第三方聚合方便,但要注意——不同平台对同一笔交易的撮合时间戳可能差几毫秒,这在套利里就是天壤之别。
我记得有一次做跨期套利,用A平台的数据回测年化30%,换到B平台的数据直接变负收益。查了半天,发现是B平台把最后一笔成交的时间戳记成了结算时间。嗯,这里要注意:一定要用逐笔成交数据,别用分钟线或Tick快照。
数据对齐与重采样:时间戳的战争
套利交易最怕什么?时间对不上。你这边看到A合约涨了,那边B合约还没动,结果你开仓了,B合约突然跳空——这就是数据没对齐的后果。
我常用的对齐方法是以交易所主时钟为基准,把所有数据的时间戳统一到毫秒级。具体做法:
- 获取交易所的行情快照时间戳(通常是整秒或整毫秒)
- 将各品种的Tick数据按时间戳排序
- 用前向填充法对齐到同一时间轴
重采样这块,我个人偏好用成交量加权平均价,而不是简单算术平均。为什么?因为大单成交更能反映真实市场。举个例子,1秒内成交了100手,其中90手在100元,10手在101元,算术平均是100.1,但加权平均是100.09——后者更接近真实交易成本。
缺失值处理:别让空值毁了你的策略
实盘中数据缺失太常见了。网络抖动、交易所维护、节假日……我见过最离谱的一次,某品种连续3秒没有Tick数据,结果策略直接报错,仓位暴露了5分钟才被发现。
处理缺失值,我的经验是分情况讨论:
| 缺失类型 | 处理方法 | 适用场景 |
|---|---|---|
| 单个Tick缺失 | 前向填充(用上一笔数据) | 流动性好的品种 |
| 连续多个Tick缺失 | 线性插值 | 趋势明显的行情 |
| 长时间缺失(>1秒) | 标记为无效,策略暂停 | 所有套利策略 |
我曾经踩过一个坑:用前向填充处理了连续5秒的缺失数据,结果策略在恢复交易后瞬间开仓,因为填充的价格和实际价格差了0.5%。从那以后,我规定连续缺失超过3个Tick,直接跳过该时段。
异常值检测:揪出那些离谱的数据
行情数据里经常混着一些「怪物」——比如某笔成交价比当前市价高了10倍,或者成交量突然暴增100倍。这些异常值如果不处理,策略会做出疯狂决策。
我常用的检测方法有三种:
- 阈值法: 设定价格和成交量的合理范围,超出即剔除。比如股指期货,单笔成交价偏离最新价超过1%就标记异常。
- 移动平均法: 计算过去N笔的移动平均和标准差,当前值超过3倍标准差就剔除。这个方法对趋势行情比较友好。
- 价差法: 套利交易的核心是价差,如果价差突然超出历史最大值的2倍,大概率是数据错误。
我记得有一次做跨品种套利,豆粕和菜粕的价差突然从200跳到800,策略差点开仓。我赶紧查了原始数据,发现是菜粕的一笔成交价格少了一个小数点——1000变成了10000。嗯,这种低级错误在实盘里其实很常见。
数据存储:选对工具,事半功倍
数据存得好不好,直接影响策略回测和实盘运行的效率。我试过CSV、HDF5、数据库三种方式,各有优劣。
CSV: 简单直接,适合小规模数据(百万行以内)。但读写慢,不支持压缩,而且容易损坏。我一般只用CSV做临时导出或人工查看。
HDF5: 我的主力存储格式。读写快,支持压缩,能存多维数据。一个文件就能装下所有品种的Tick数据。缺点是不支持并发写入,实盘时要注意。
数据库: 适合团队协作和复杂查询。我用过PostgreSQL和InfluxDB,前者适合结构化数据,后者适合时序数据。但数据库的维护成本高,个人做套利其实没必要。
下面是我画的一张数据流程框架图,把今天讲的内容串起来:
最后说一句:数据清洗不是一次性工作,而是持续的过程。我每周都会跑一遍数据质量检查脚本,看看有没有新的异常模式出现。你想想看,如果数据都不可靠,策略再牛有什么用?
公众号:蓝海资料掘金营,微信deep3321