引言:量化 = 数据 + 规则 + 执行,数据是最容易塌的地基
在个人与机构的差异里我们说过,机构最大的优势之一就是数据。个人买不起卫星图像、信用卡流水,但这不代表个人就只能在”看个K线”的水平上做量化——恰恰相反,免费和低成本的数据源,已经足够支撑一个有竞争力的个人策略,前提是你要把数据这件事当成工程来做,而不是写策略时随手调个接口。
量化的本质是 数据 + 规则 + 执行。规则和执行(程序化)我们在上一篇聊过了。这一篇专讲数据:个人能用哪些免费数据源、它们的边界在哪、怎么把数据沉淀成自己的数据库、以及如何避免数据层的”隐形杀手”——未来函数。
地基歪了,上面盖的策略再漂亮也是幻觉。这一篇就是帮你把地基打直。
一、个人量化的数据需求清单
动手找数据之前,先搞清楚自己需要什么。一个典型的个人多因子选股策略,需要这几类数据:
| 数据类别 | 用途 | 个人获取难度 |
|---|---|---|
| 交易日历 | 判断是否交易日、回测时间轴 | 易,免费 |
| 股票基础信息 | 上市/退市日期、所属行业、总股本/流通股本 | 易,免费 |
| 日线/分钟线行情 | OHLCV、复权价 | 易,免费 |
| 基本面数据 | 财报三大表、估值指标(PE/PB/ROE) | 易,免费 |
| 资金流数据 | 主力净流入、北向持仓 | 中,部分免费 |
| 龙虎榜/股东增减持 | 情绪与事件信号 | 中,需爬虫或接口 |
| 舆情/另类数据 | 搜索指数、新闻情感 | 难,受限(参考另类因子) |
| Tick/逐笔 | 高频策略 | 个人基本用不到,且延迟劣势大 |
结论先行:日线 + 基本面 + 交易日历 + 基础信息,这四样免费就能拿全,足够做中低频多因子选股。 这正是差异篇里建议个人占领的主场。
二、免费数据源全景盘点
2.1 Tushare:个人量化的主力数据源
Tushare 是目前国内最完整的免费量化数据接口,覆盖行情、基本面、资金流、龙虎榜、财报等。采用积分制:注册即有一定积分,可获取日线、基础信息;积分提升后(通过贡献、活跃等)可解锁分钟线、复权、融资融券等。
优点:接口统一、文档规范、数据质量相对可靠、社区活跃。
局限:高级接口需要积分,免费额度有限;偶有限流;部分历史数据需逐年拉取。
适用:基本面因子、日线行情、估值数据的主力来源。
2.2 AkShare:纯免费、覆盖广的备选
AkShare 是一个纯开源、完全免费的金融数据接口库,聚合了大量公开数据源(东财、新浪、同花顺等)。
优点:零门槛、接口数量极多、覆盖港股/美股/期货/宏观。
局限:稳定性依赖上游网页结构,网页改版时接口易失效;部分接口返回格式不规范,需要自己清洗。
适用:Tushare 积分不够时的补充、资金流/龙虎榜/宏观等边角数据。
2.3 QMT/MiniQMT 行情接口:实盘数据最可靠
如果你已经在用 QMT(迅投)做实盘,它自带的历史行情下载与实时行情接口是最贴近实盘的数据源——因为回测和实盘同源,能避免”回测用一套数据、实盘用另一套”的口径错位。具体用法见QMT 历史行情下载与本地缓存。
优点:与实盘同源、复权口径一致、实时行情可直接驱动策略。
局限:需要开通 QMT 账户;主要覆盖行情数据,基本面数据较弱。
适用:实盘策略的行情数据来源、回测与实盘口径对齐。
2.4 网页爬虫:龙虎榜、舆情、另类数据的补充
东方财富、同花顺、雪球等网站有大量免费的结构化数据(龙虎榜、资金流、股吧热度),但需要自己写爬虫。这是另类因子指南里提到的”个人友好另类数据源”。
优点:免费、数据丰富、独占性强(别人懒得爬)。
局限:维护成本高、有合规风险、需处理反爬与限频。
适用:情绪/事件类因子的数据补充,不建议作为行情主数据。
三、数据能力边界:个人能拿到什么、拿不到什么
诚实地说清边界,才知道策略该建在什么地基上:
- 日线/分钟线行情:充足,Tushare + QMT 双保险,免费足够。
- Tick/逐笔:QMT 可拿,但个人没有机房,做高频毫无意义,别在这上面浪费精力。
- 基本面财报:充足,三大表、估值、财务指标免费可拿。
- 资金流/北向:基本够用,AkShare 和 Tushare 都有,但精度不如付费源。
- 分析师一致预期:免费源质量差,这是个人相对机构的明显短板,要么不用,要么接受低质量。
- 另类数据(卫星、供应链、信用卡):个人基本拿不到,这恰恰是机构的主场——差异篇已经讲过,不要在这里硬刚。
一句话:在公开数据战场上,个人和机构的数据差距远比想象中小;真正的差距在另类数据,而那不是个人该去打的仗。
四、自建数据库:存储方案选型
很多新手的数据流是”写策略时实时调接口”,这有三个致命问题:网络慢、容易被限流、回测每次都重拉数据。正确做法是把数据沉淀到本地数据库,策略只读本地。
4.1 存储方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| SQLite | 单文件、零部署、几十万到几百万行毫无压力、Python 标准库自带 | 并发写入弱、不适合海量数据 | 个人量化的首选 |
| CSV/Parquet | 简单、可读、Parquet 列式存储读取快 | 查询不便、需自己管理分片 | 行情数据的批量存储 |
| MySQL/PostgreSQL | 功能强、并发好 | 部署运维成本高,个人过度设计 | 不推荐个人起步 |
| DuckDB | 列式分析型、SQL 查询、直接读 Parquet/CSV | 较新、生态小 | 数据分析的进阶选择 |
建议:不要一上来就上 MySQL/Postgres——这是新手最常见的过度设计。起步用 SQLite,行情数据量大后再引入 Parquet + DuckDB 做分析查询,足够陪伴个人量化走很远。
4.2 表结构设计要点
最简版三张表就能起步:
- 交易日历表:
trade_date、is_open,驱动所有增量更新与回测时间轴; - 日线行情表:
code、trade_date、open/high/low/close/volume/amount、adj_factor(复权因子单独存); - 基本面表:
code、report_date(报告期)、ann_date(公告日)、各财务字段——注意公告日和报告期必须分开存,这是杜绝未来函数的关键(第六节详讲)。
五、增量更新:让数据每天自动就绪
一个常被忽视的工程细节:不要每次回测都全量重拉历史数据,应该用交易日历驱动增量更新。
落地的正确姿势:
- 交易日历驱动:读取本地交易日历,找出”本地最新交易日”之后的所有交易日;
- 只拉增量:只下载这几天的日线与基本面更新,避免重复拉取;
- 去重对账:写入时按
(code, trade_date)做主键约束,重复写入自动覆盖; - 盘前自动跑:每个交易日早上用一个定时脚本(cron / 系统计划任务)跑增量更新,收盘后策略直接读本地。
这一步看起来不起眼,但它把”写策略时临时拉数据”变成了”数据随时就绪”——研究效率的差异,往往不在策略本身,而在数据是否随时可用。
六、数据清洗的必修课
垃圾进、垃圾出。下面四件事是个人最容易踩的坑。
6.1 复权:前复权 vs 后复权
- 前复权:以最新价格为基准向前调整,价格连续、适合看图与技术指标,但每次新增数据后历史价格会变。
- 后复权:以最早价格为基准向后调整,历史价格固定不变,回测推荐用后复权,因为历史数据不会因新增交易日而变化,回测结果可复现。
- 不复权:除权除息日会产生跳价,直接用于回测会产生虚假收益。
建议:回测统一用后复权,实盘看图用前复权,两者口径要清楚分开。复权因子单独存表,按需计算。
6.2 停牌与缺失
停牌期间没有行情,回测中处理方式直接影响结果:
- 持仓不动:停牌期间持仓不变、价格不变,复牌后继续——最接近真实。
- 前向填充:用停牌前价格填充,会制造虚假的平稳期。
- 直接剔除:会扭曲组合权重。
建议:停牌期间持仓冻结、不产生收益,并在因子计算时把停牌样本剔除,避免”停牌 = 收益0”的假象。
6.3 退市/摘牌与幸存者偏差
只回测”现在还存在的股票”,会把退市的亏损票排除在外,回测收益虚高。这是回测里最阴险的陷阱,因子指南里提过,下一篇回测框架会详细展开。数据层要做的,是把退市股票的完整历史也存下来,不要在入库时就过滤掉。
6.4 数据缺失插值
财务指标偶尔缺失,新手喜欢用 0 或前值填充,这会引入虚假信号。建议:缺失值在因子计算阶段显式标记为 NaN,由策略层决定如何处理,不要在数据层偷偷插值。
七、杜绝未来函数(前视偏差):数据层最致命的陷阱
未来函数是量化回测的头号杀手,而它的根源几乎全在数据层。核心原则只有一句:任何时刻 t,策略只能用到 t 时刻”已经公开”的信息。
7.1 财报数据的报告期 vs 公告日
最常见的未来函数:用某只股票 2025 年一季报数据做 2025 年 4 月 1 日的因子,但一季报可能 4 月 28 日才发布。在 4 月 1 日,这份财报是”未来信息”。
正确做法:
- 数据库里每条财报记录都必须存
report_date(报告期)和ann_date(实际公告日); - 因子计算时,按
ann_date对齐:计算 t 日的因子,只能用ann_date <= t的财报; - 这就是所谓的 point-in-time(PIT)数据,是机构数据基础设施的核心能力,个人用免费数据也能模拟——前提是
ann_date字段不能丢。
7.2 其他常见的未来函数
- 用当日收盘价做当日买入决策:收盘才能知道的价,却当成开盘就买入——回测虚高;
- 用未来才知道的退市/ST 标记做筛选;
- 用调整后的财报数据(公司事后修订了历史财报,你用了修订版);
- 复权因子用了未来信息:后复权因子在新增交易日后会变,如果每次重算会污染历史回测——所以要固定复权快照。
一句话:未来函数不是”会不会用错”的问题,而是”不刻意防御就必然用错”的问题。下一篇文章讲回测框架时会把这条作为第一陷阱展开。
八、数据质量校验:免费数据不是免检数据
免费数据最大的风险是”错了你不知道”。建立简单的校验习惯:
- 跨源比对:同一段日线行情,Tushare 和 AkShare 对一下收盘价,差异超阈值就人工核查;
- 异常值检测:涨跌幅超 20%(非涨跌停)、成交量为 0 但有价格、PE 为负等,自动标记待查;
- 完整性检查:每个交易日应有数据的股票数是否稳定,骤降说明拉取失败;
- 复权连续性:后复权序列不应出现非除权日的跳价,有跳价说明复权因子错。
这些校验不用做得多复杂,几个 SQL 查询 + 每日告警就够,但能省掉大量”策略表现异常、查了三天才发现是数据错了”的时间。
九、与实盘的数据衔接:同源是理想,同口径是底线
很多个人量化的痛苦来自:回测用 Tushare 数据,实盘用 QMT 行情,两边口径不一致,导致回测预期和实盘表现严重偏离。
- 理想:回测和实盘同源(都用 QMT 历史行情),口径天然一致;
- 底线:即使不同源,也要保证复权口径、交易时间、涨跌停/停牌处理逻辑一致;
- 对齐方法:用同一段时间,把 Tushare 和 QMT 的日线拉出来对比,确认 OHLCV 差异可接受;基本面数据口径(如总市值用收盘价 × 总股本)也要对齐。
数据衔接做不好,程序化解决情绪那篇讲的”情绪被隔离”就会变成另一种失望——程序无情绪地执行了一个”回测好看、实盘失真”的策略,亏得稳稳当当。
十、总结:把数据当工程,而非随手调接口
回顾本文的核心:
- 需求先行:日线 + 基本面 + 交易日历 + 基础信息,这四样免费就能拿全,足够做中低频多因子选股;
- 数据源分层:Tushare 为主、AkShare 补充、QMT 行情贴近实盘、爬虫做另类补充;
- 存储起步用 SQLite,不要过度设计上 MySQL;行情量大后再上 Parquet + DuckDB;
- 增量更新 + 交易日历驱动,让数据随时就绪,研究效率差异往往在这里;
- 清洗四必修:后复权回测、停牌冻结持仓、保留退市股历史、缺失值不偷偷插值;
- 未来函数是头号杀手:财报按公告日对齐(point-in-time),收盘价不能用于当日决策,复权因子要固定快照;
- 免费数据不免责:跨源比对 + 异常检测 + 完整性校验,几个 SQL 就能省下大量排查时间;
- 回测与实盘同口径:理想同源,底线是复权/时间/涨跌停处理一致。
个人量化最容易输的环节,不是策略不够聪明,而是地基歪了,上面的策略越精致塌得越惨。把数据层做扎实,后面写因子、搭回测、上实盘,才有意义。下一篇我们就接着讲回测框架与六大陷阱——数据层踩稳之后,回测层是第二道关。
⚠️ 免责声明
本文仅提供数据工程方法论与工具介绍:
- 数据接口的可用性与配额可能随时变化,请以各数据源官方说明为准
- 使用爬虫获取数据需遵守相关网站的服务条款与法律法规
- 文中内容不构成任何投资建议,因数据错误或使用本文方法造成的任何损失,由使用者自行承担
本文更新于2026年9月7日