数据获取层:行情数据源与存储

做量化交易,第一件事是什么?

不是写策略,不是回测,而是——拿到数据。

我见过太多人,策略逻辑写得天花乱坠,结果数据源一塌糊涂,回测跑出来全是幻觉。说白了,数据获取层是整个流水线的地基。地基不稳,上面盖多高都没用。

核心观点:数据获取层的质量,直接决定了策略的可靠性。数据不干净,策略再牛也是白搭。

行情数据源:从哪里拿数据?

行情数据源,主要分两类:交易所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。

数据获取层的整体架构

说了这么多,我们来画一张图,把整个数据获取层的逻辑串起来。

数据获取层架构图 交易所API 数据商 其他数据源 数据格式处理:Tick数据 → K线聚合 CSV文件存储 数据库存储 策略信号生成模块

这张图展示了数据获取层的完整流程。从数据源出发,经过格式处理,最终落地到存储。每一步都有坑,每一步都需要仔细设计。

总结一下:数据获取层不是简单的「拿数据存起来」。它涉及数据源选择、格式转换、存储策略三个核心环节。每个环节都有 trade-off,没有银弹。我的建议是——根据你的策略类型、数据量、预算,找到最适合你的组合。

好了,这一章就到这里。数据获取层讲完了,下一章我们聊聊数据清洗和预处理。嗯,那又是另一堆坑了。


专注资料整理