数据获取层:行情数据源与存储
做量化交易,第一件事是什么?
不是写策略,不是回测,而是——拿到数据。
我见过太多人,策略逻辑写得天花乱坠,结果数据源一塌糊涂,回测跑出来全是幻觉。说白了,数据获取层是整个流水线的地基。地基不稳,上面盖多高都没用。
核心观点:数据获取层的质量,直接决定了策略的可靠性。数据不干净,策略再牛也是白搭。
行情数据源:从哪里拿数据?
行情数据源,主要分两类:交易所API和数据商。我个人的习惯是,能直接从交易所拿,就不走中间商。但现实往往没那么理想。
交易所API
交易所API是最直接的数据源。比如币安的WebSocket、OKX的REST接口、股票市场的CTP接口。它们提供的是第一手数据,延迟最低。
我在项目中遇到过一个问题:某交易所的API在极端行情下会限流。你想想看,行情剧烈波动的时候,你反而拿不到数据,这多要命。所以后来我做了个策略——同时接入两个交易所的数据源,一个主用,一个备用。
我的建议:优先选择WebSocket协议获取实时数据,REST接口只用来补历史数据。WebSocket是长连接,数据推送快;REST是请求-响应模式,适合拉取历史。
数据商
数据商是另一种选择。比如Wind、聚宽、Tushare、Quandl这些。它们把数据清洗、整理好了再卖给你。省事,但贵。
我记得有一次,团队为了省成本,只用免费数据源。结果回测跑得风生水起,实盘一上线就亏。后来一查,是数据商的历史数据有偏差,回测时没发现。嗯,这里要注意——免费数据往往有坑。
避坑指南:我曾经因为数据商的数据延迟,导致策略在开盘前5分钟还在用前一天的收盘价做计算。结果开盘跳空,直接穿仓。从那以后,我坚持在数据源层做延迟监控,超过阈值就报警。
数据格式:Tick和K线
数据拿到手了,但格式不一样。最常见的两种格式是Tick数据和K线数据。
Tick数据
Tick数据是逐笔成交数据。每一笔交易都会生成一条记录。包含时间、价格、成交量、买卖方向等。
说白了,Tick数据是最细粒度的数据。它能捕捉到每一笔订单的痕迹。但问题也很明显——数据量巨大。一天几百万条是常事。
我建议,做高频交易或者做市策略,必须用Tick数据。做中低频策略,用K线就够了。别为了追求精细度,把自己搞成数据存储的奴隶。
K线数据
K线数据是聚合后的数据。按时间窗口(1分钟、5分钟、1小时、1天)把Tick数据聚合成开盘价、收盘价、最高价、最低价、成交量。
K线的好处是体积小、好处理。大部分策略用K线就够了。但有个坑——K线的聚合方式会影响策略表现。比如,用收盘价做信号,和用均价做信号,结果可能完全不同。
| 对比维度 | Tick数据 | K线数据 |
|---|---|---|
| 数据粒度 | 逐笔成交 | 时间窗口聚合 |
| 数据量 | 极大(百万级/天) | 较小(千级/天) |
| 适用策略 | 高频、做市 | 中低频、趋势 |
| 存储成本 | 高 | 低 |
| 处理复杂度 | 高 | 低 |
重要提醒:如果你用K线数据做回测,一定要确认K线的生成规则。比如,1分钟K线是从00:00到00:59,还是从00:01到01:00?不同交易所的规则可能不同。
数据存储:CSV还是数据库?
数据拿到手了,格式也定了,接下来就是存起来。存储方式主要两种:CSV文件和数据库。
CSV文件
CSV是最简单的存储方式。一行一条数据,用逗号分隔。优点是轻量、可读性强、方便用Excel打开。
我刚开始做量化的时候,所有数据都存CSV。简单粗暴。但后来数据量大了,问题就来了——一个CSV文件几百兆,打开都费劲,更别说查询了。
CSV适合小规模数据、个人研究、快速验证。不适合生产环境。
数据库
数据库是更专业的方案。常用的有SQLite、MySQL、PostgreSQL、InfluxDB(时序数据库)。
我个人习惯用PostgreSQL做关系型数据存储,InfluxDB做时序数据存储。为什么?因为行情数据天然是时序数据,用时序数据库查询效率高得多。
举个例子:你要查某只股票过去30天的1分钟K线。用CSV,你得把整个文件读进来再过滤。用数据库,一条SQL就搞定,速度差几十倍。
我的经验:如果你刚开始做,先用SQLite。它不需要安装服务器,一个文件搞定。等数据量超过10GB,再考虑迁移到PostgreSQL或InfluxDB。
数据获取层的整体架构
说了这么多,我们来画一张图,把整个数据获取层的逻辑串起来。
这张图展示了数据获取层的完整流程。从数据源出发,经过格式处理,最终落地到存储。每一步都有坑,每一步都需要仔细设计。
总结一下:数据获取层不是简单的「拿数据存起来」。它涉及数据源选择、格式转换、存储策略三个核心环节。每个环节都有 trade-off,没有银弹。我的建议是——根据你的策略类型、数据量、预算,找到最适合你的组合。
好了,这一章就到这里。数据获取层讲完了,下一章我们聊聊数据清洗和预处理。嗯,那又是另一堆坑了。