<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>数据工程与因子数据 on 云栖</title><link>http://airyv.com/quant/04-data/</link><description>Recent content in 数据工程与因子数据 on 云栖</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><atom:link href="http://airyv.com/quant/04-data/index.xml" rel="self" type="application/rss+xml"/><item><title>数据类型：行情、基本面、另类与宏观数据</title><link>http://airyv.com/quant/data-types/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://airyv.com/quant/data-types/</guid><description>&lt;p&gt;数据决定了策略的「视力上限」：用日线数据做不出微观结构策略，用滞后财报做不出及时的基本面因子。本篇按四大类数据梳理其结构、用途与&lt;strong&gt;每类数据特有的陷阱&lt;/strong&gt;——陷阱清单比功能清单更有价值。&lt;/p&gt;
&lt;h2 id="行情数据粒度即世界"&gt;行情数据：粒度即世界
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;粒度&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;th&gt;适配策略&lt;/th&gt;
 &lt;th&gt;关键陷阱&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Tick/逐笔&lt;/td&gt;
 &lt;td&gt;每笔成交（价、量、方向）+ 逐档十档盘口快照&lt;/td&gt;
 &lt;td&gt;高频、做市、微观结构&lt;/td&gt;
 &lt;td&gt;数据量巨大（全市场日均百 GB 级）；A 股 tick 是快照不是真逐笔，3 秒内的先后顺序不可见&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;分钟 Bar&lt;/td&gt;
 &lt;td&gt;1/5/15/60 分钟 OHLCV&lt;/td&gt;
 &lt;td&gt;日内、短线&lt;/td&gt;
 &lt;td&gt;不同数据商的 bar 切分时点可能不同（1 分钟 bar 以左边界还是右边界命名）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;日线 Bar&lt;/td&gt;
 &lt;td&gt;OHLCV + 复权因子&lt;/td&gt;
 &lt;td&gt;中低频、多因子&lt;/td&gt;
 &lt;td&gt;复权口径（后文）；成交量是否含大宗交易、盘后固定价格&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;指数与基金&lt;/td&gt;
 &lt;td&gt;指数点位、ETF 净值与 IOPV&lt;/td&gt;
 &lt;td&gt;基准、套利&lt;/td&gt;
 &lt;td&gt;指数口径（价格/全收益）——用价格指数算超额会漏掉股息&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;复权&lt;/strong&gt;值得单独强调：分红除权会让原始价格序列「跳空」，必须复权才能算真实收益。&lt;strong&gt;后复权&lt;/strong&gt;以上市首日为基准向后调整（价格连续、适合算收益），&lt;strong&gt;前复权&lt;/strong&gt;以最新价为基准向前调整（图形直观、但历史价格随每次分红重算——&lt;strong&gt;缓存的前复权数据在分红后会与旧缓存不一致&lt;/strong&gt;，这是回测版本漂移的常见元凶）。详见&lt;a
 class="link"
 href="http://airyv.com/quant/cn-data-pitfalls/"&gt;&lt;span class="markdown-link-inner"&gt;A 股数据特有问题&lt;/span&gt;&lt;/a&gt;
。&lt;/p&gt;
&lt;h2 id="基本面数据核心是时间戳"&gt;基本面数据：核心是「时间戳」
&lt;/h2&gt;&lt;p&gt;基本面数据的困难从来不是数值，而是&lt;strong&gt;何时可知&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;财报&lt;/strong&gt;：报告期（12-31）≠ 公告期（次年 3–4 月）。任何因子计算必须以&lt;strong&gt;公告日&lt;/strong&gt;为可知时点——用报告期对齐是基本面因子最大的前视偏差来源（见&lt;a
 class="link"
 href="http://airyv.com/quant/data-cleaning/"&gt;&lt;span class="markdown-link-inner"&gt;数据清洗&lt;/span&gt;&lt;/a&gt;
）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;业绩预告/快报/正式财报&lt;/strong&gt;：同一指标有三个可知时点，PIT 数据库要区分「哪个版本在哪个日期生效」（更正公告也要处理：后来修正过的数字，当时市场看到的是旧值）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一致预期（分析师预测）&lt;/strong&gt;：滚动 12 个月的共识 EPS、预测调整方向。陷阱：分析师覆盖度随市值急剧变化——小盘股可能只有 1–2 个分析师，「共识」噪声极大，因子要对覆盖家数做过滤；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;股东户数、北向持股、大宗交易、回购进度&lt;/strong&gt;：披露频率不一（周度/日度/事件驱动），对齐时要用「最近一次披露值 + 披露日期」的双列结构。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="另类数据alpha-的富矿与合规的雷区"&gt;另类数据：alpha 的富矿与合规的雷区
&lt;/h2&gt;&lt;p&gt;广义另类数据（替代数据）的四类代表：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;类型&lt;/th&gt;
 &lt;th&gt;例子&lt;/th&gt;
 &lt;th&gt;量化用法&lt;/th&gt;
 &lt;th&gt;主要风险&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;舆情文本&lt;/td&gt;
 &lt;td&gt;新闻、社交媒体、研报情绪&lt;/td&gt;
 &lt;td&gt;情绪因子、事件识别&lt;/td&gt;
 &lt;td&gt;语义模型偏差；数据商用数据反灌（自我实现后失效）；造假刷量&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;卫星/地理&lt;/td&gt;
 &lt;td&gt;停车场车辆、油罐阴影、夜间灯光&lt;/td&gt;
 &lt;td&gt;产量与客流的高频估计&lt;/td&gt;
 &lt;td&gt;成本高；对个别公司适用面窄&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;供应链/企业图谱&lt;/td&gt;
 &lt;td&gt;招投标、上下游关系、招聘&lt;/td&gt;
 &lt;td&gt;产业链传导因子、景气验证&lt;/td&gt;
 &lt;td&gt;数据稀疏；滞后于真实业务&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;交易行为&lt;/td&gt;
 &lt;td&gt;北向资金、龙虎榜席位、大宗折价&lt;/td&gt;
 &lt;td&gt;资金流因子&lt;/td&gt;
 &lt;td&gt;披露规则变化会直接杀死因子（北向实时数据 2024 年停止披露）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;另类数据的两条纪律：&lt;strong&gt;合规先行&lt;/strong&gt;——爬虫抓取要过《数据安全法》与 robots 协议的红线（详见&lt;a
 class="link"
 href="http://airyv.com/quant/data-sources/"&gt;&lt;span class="markdown-link-inner"&gt;数据来源&lt;/span&gt;&lt;/a&gt;
）；&lt;strong&gt;检验标准不降级&lt;/strong&gt;——另类不等于免检，同样的 IC/分组/成本检验流程照走（见&lt;a
 class="link"
 href="http://airyv.com/quant/factor-testing/"&gt;&lt;span class="markdown-link-inner"&gt;因子检验&lt;/span&gt;&lt;/a&gt;
）。&lt;/p&gt;
&lt;h2 id="宏观与行业数据低频但重要"&gt;宏观与行业数据：低频但重要
&lt;/h2&gt;&lt;p&gt;月度/季度/年度的宏观序列（PMI、CPI、社融、M2、利率、汇率）与行业数据（产量、库存、开工率）。三个使用要点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;发布滞后必须建模&lt;/strong&gt;：PMI 月末发布（当月值）、社融次月中旬发布（上月值）——「用 1 月社融」最早在 2 月中旬才知道。宏观数据的前视偏差比财报更隐蔽，因为「月」的归属天然含糊；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修正是常态&lt;/strong&gt;：GDP、工业增加值几乎每年修正，PIT 存档「首次发布值」才有意义（市场当年交易的是首值）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;低频限制样本量&lt;/strong&gt;：20 年月度数据只有 240 个点——宏观因子检验天然统计功效不足，结论要格外谦逊（见&lt;a
 class="link"
 href="http://airyv.com/quant/statistical-inference/"&gt;&lt;span class="markdown-link-inner"&gt;多重检验&lt;/span&gt;&lt;/a&gt;
）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;选型的统一原则&lt;/strong&gt;：数据的粒度与频率必须匹配信号频率（日线因子不必买 tick）；每接入一类新数据，先花一天做「陷阱审计」（时间戳口径、复权口径、披露规则），再写第一行因子代码——&lt;strong&gt;审计的花费永远低于用错数据的回测误导成本&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关联阅读&lt;/strong&gt;：&lt;a
 class="link"
 href="http://airyv.com/quant/data-sources/"&gt;&lt;span class="markdown-link-inner"&gt;数据来源&lt;/span&gt;&lt;/a&gt;
 解决从哪里拿；&lt;a
 class="link"
 href="http://airyv.com/quant/data-cleaning/"&gt;&lt;span class="markdown-link-inner"&gt;数据清洗&lt;/span&gt;&lt;/a&gt;
 解决怎么处理；&lt;a
 class="link"
 href="http://airyv.com/quant/cn-data-pitfalls/"&gt;&lt;span class="markdown-link-inner"&gt;A 股数据特有问题&lt;/span&gt;&lt;/a&gt;
 是本篇的国内落地版。&lt;/p&gt;</description></item><item><title>数据来源：商业数据商、开源数据与爬虫边界</title><link>http://airyv.com/quant/data-sources/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://airyv.com/quant/data-sources/</guid><description>&lt;p&gt;数据方案的选型原则：&lt;strong&gt;与研究阶段匹配，并为升级留接口&lt;/strong&gt;。个人研究用免费数据起步完全合理，但必须知道免费数据的口径边界在哪里——用错口径的免费数据，比没有数据更危险。&lt;/p&gt;
&lt;h2 id="商业数据商"&gt;商业数据商
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;数据商&lt;/th&gt;
 &lt;th&gt;强项&lt;/th&gt;
 &lt;th&gt;量化视角备注&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Wind&lt;/td&gt;
 &lt;td&gt;国内机构标准配置；宏观数据、一致预期、快讯最全&lt;/td&gt;
 &lt;td&gt;不同终端账号的导出权限不同；API（WindPy）稳定性一般&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;聚源(GilData)&lt;/td&gt;
 &lt;td&gt;证券基础数据与财报的机构老牌口径&lt;/td&gt;
 &lt;td&gt;很多券商金工平台的底层数据源&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;同花顺 iFinD&lt;/td&gt;
 &lt;td&gt;性价比高，API 友好&lt;/td&gt;
 &lt;td&gt;增长中的选择，行业分类口径与聚源有差异&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Bloomberg/Refinitiv&lt;/td&gt;
 &lt;td&gt;全球市场、固收与外汇深度&lt;/td&gt;
 &lt;td&gt;成本高；国内 A 股口径反而不如本土商细&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;米筐 RQData/聚宽 JQData&lt;/td&gt;
 &lt;td&gt;面向个人的 A 股 API，文档友好、复权处理正确&lt;/td&gt;
 &lt;td&gt;按调用计费；适合中等规模个人研究&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;机构选型的「隐藏维度」&lt;/strong&gt;——价格表上看不见、却决定 PIT 可行性的三项，采购前应做实测样例验证：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;历史回填质量&lt;/strong&gt;：退市股票的行情与财报是否完整。测试方法：拉取乐视网（2019 退市）、康得新（2021 退市）、欣泰电气（2017 强退）三家 2015–2018 的完整日线与财报——任何一张表缺月，你的小市值/ST 研究就有洞（幸存者偏差的源头，见&lt;a
 class="link"
 href="http://airyv.com/quant/data-cleaning/"&gt;&lt;span class="markdown-link-inner"&gt;数据清洗&lt;/span&gt;&lt;/a&gt;
）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公告日字段准确性&lt;/strong&gt;：抽查 10 份年报，对照巨潮资讯网的原始公告日期——数据商把「报告期」当「公告日」填充的字段并不罕见，这一项错，所有基本面因子全错；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修正存档&lt;/strong&gt;：GDP/盈利预测被修正后，能否取到「当年首次发布值」。不能 = 宏观与一致预期因子的回测全部带前视。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="开源与免费数据"&gt;开源与免费数据
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;来源&lt;/th&gt;
 &lt;th&gt;覆盖&lt;/th&gt;
 &lt;th&gt;适用&lt;/th&gt;
 &lt;th&gt;主要边界&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;akshare&lt;/td&gt;
 &lt;td&gt;极广（股、期货、宏观、另类）&lt;/td&gt;
 &lt;td&gt;探索、原型&lt;/td&gt;
 &lt;td&gt;接口爬取公开网页，稳定性与口径一致性无保证；勿用于生产&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;tushare&lt;/td&gt;
 &lt;td&gt;A 股为主，积分制&lt;/td&gt;
 &lt;td&gt;个人日频研究&lt;/td&gt;
 &lt;td&gt;财务数据有公告日字段（可贵），高频受限&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;baostock&lt;/td&gt;
 &lt;td&gt;A 股日线&lt;/td&gt;
 &lt;td&gt;轻量入门&lt;/td&gt;
 &lt;td&gt;无财报、复权口径需验证&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;yfinance&lt;/td&gt;
 &lt;td&gt;美股/全球&lt;/td&gt;
 &lt;td&gt;海外研究&lt;/td&gt;
 &lt;td&gt;Yahoo 口径，复权与停牌处理粗糙&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;交易所官网&lt;/td&gt;
 &lt;td&gt;L2 样本、月度统计&lt;/td&gt;
 &lt;td&gt;制度研究&lt;/td&gt;
 &lt;td&gt;格式各异，需自行清洗&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;免费数据的三个必检项&lt;/strong&gt;（任何来源都要过，附具体检查动作）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;复权因子正确性&lt;/strong&gt;：挑 3 只高分红股（如工商银行、长江电力、双汇发展），对每个除息日验证：&lt;code&gt;后复权价差 ≈ 分红金额 + 除权缺口&lt;/code&gt;。对不上的来源，所有收益计算作废；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公告日字段&lt;/strong&gt;：随机抽 5 条财报记录，对照巨潮公告原文日期——有公告日的来源（tushare Pro）才配做基本面因子；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;退市样本存在性&lt;/strong&gt;：查询 2018 年前上市、现已退市的股票名单，能取到行情的占比 &amp;lt; 90% = 样本有系统性漏洞。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="爬虫能力与红线"&gt;爬虫：能力与红线
&lt;/h2&gt;&lt;p&gt;技术能力不是问题，&lt;strong&gt;合法边界才是&lt;/strong&gt;。国内框架下的三条硬红线：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;《数据安全法》/《个人信息保护法》&lt;/strong&gt;：不得爬取个人身份信息（手机号、身份证、住址）；不得大规模抓取重要数据出境；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;robots 协议与反爬对抗&lt;/strong&gt;：绕过验证码、破解加密接口、伪造 UA 高频抓取，可能触碰《反不正当竞争法》与《刑法》非法获取计算机信息系统数据罪——「技术上能爬」不等于「法律上能爬」；已有量化从业者因爬取并商用券商研报数据被追究的先例；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;授权数据的再分发&lt;/strong&gt;：用商业数据商的数据训练的因子值对外销售，通常违反授权协议——机构内部这也是审计重点。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;合规的替代路线：优先用官方公开 API（交易所、统计局、中登公司月报）；需要另类数据时采购有授权的供应商产品；爬虫仅限于对公开、非个人、低频信息的温和获取（并保留合规审查记录）。&lt;/p&gt;
&lt;h2 id="数据方案的阶段化建议"&gt;数据方案的阶段化建议
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;阶段&lt;/th&gt;
 &lt;th&gt;方案&lt;/th&gt;
 &lt;th&gt;月成本量级&lt;/th&gt;
 &lt;th&gt;升级触发点&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;学习与原型&lt;/td&gt;
 &lt;td&gt;akshare/baostock + 本地 CSV&lt;/td&gt;
 &lt;td&gt;0&lt;/td&gt;
 &lt;td&gt;因子数 &amp;gt; 3 或回测区间 &amp;gt; 5 年&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;严肃个人研究&lt;/td&gt;
 &lt;td&gt;tushare Pro 或 JQData/RQData + Parquet 本地库&lt;/td&gt;
 &lt;td&gt;几百元&lt;/td&gt;
 &lt;td&gt;涉及财报因子 / 开始模拟盘&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;小型私募/产品&lt;/td&gt;
 &lt;td&gt;iFinD/聚源 API + 自建 PIT 库 + L2 采购&lt;/td&gt;
 &lt;td&gt;数万元&lt;/td&gt;
 &lt;td&gt;产品化 / 对外披露业绩&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;机构&lt;/td&gt;
 &lt;td&gt;多源冗余（主源 + 校验源）+ 数据团队&lt;/td&gt;
 &lt;td&gt;数十万以上&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;多源校验&lt;/strong&gt;值得强调：生产级系统永远不应该只有单一数据源——每天收盘后跑一次「主源 vs 校验源」的抽查比对（收盘价、成交量、股本），差异超阈值即告警。真实案例形态：某数据商接口升级时把复权因子口径静默改掉，单一数据源的用户两周后才从「策略绩效异常」倒查出原因——而多源校验的用户当晚就收到告警（监控设计见&lt;a
 class="link"
 href="http://airyv.com/quant/factor-storage-quality/"&gt;&lt;span class="markdown-link-inner"&gt;数据质量监控&lt;/span&gt;&lt;/a&gt;
）。数据商也会出错，而你的策略没有借口。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关联阅读&lt;/strong&gt;：&lt;a
 class="link"
 href="http://airyv.com/quant/data-types/"&gt;&lt;span class="markdown-link-inner"&gt;数据类型&lt;/span&gt;&lt;/a&gt;
 决定你需要哪些字段；&lt;a
 class="link"
 href="http://airyv.com/quant/data-cleaning/"&gt;&lt;span class="markdown-link-inner"&gt;数据清洗&lt;/span&gt;&lt;/a&gt;
 是拿到数据后的第一道工序；另类数据的检验流程见&lt;a
 class="link"
 href="http://airyv.com/quant/factor-testing/"&gt;&lt;span class="markdown-link-inner"&gt;因子检验&lt;/span&gt;&lt;/a&gt;
。&lt;/p&gt;</description></item><item><title>数据清洗：缺失、异常、幸存者与 PIT</title><link>http://airyv.com/quant/data-cleaning/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://airyv.com/quant/data-cleaning/</guid><description>&lt;p&gt;「回测年化 30%，实盘 -5%」的第一嫌疑人永远不是策略，而是数据清洗。本篇四节对应四种最贵的清洗错误：缺失值处理不当（假收益）、异常值放任（假信号）、幸存者偏差（假基准）、前视偏差（假未来）。最后给出 PIT 数据库的最小设计——它是根治「时点错乱」的工程方案。&lt;/p&gt;
&lt;h2 id="缺失值先问为什么缺失再问怎么填"&gt;缺失值：先问「为什么缺失」，再问「怎么填」
&lt;/h2&gt;&lt;p&gt;缺失不是缺陷而是&lt;strong&gt;信息&lt;/strong&gt;：停牌导致的行情缺失意味着「不可交易」；财报缺失可能意味着「尚未披露」（正常）或「永久缺失」（退市）。决策树：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;行情缺失（停牌）&lt;/strong&gt;：不能 &lt;code&gt;fillna(0)&lt;/code&gt;（等于假设停牌日免费平仓）。标准做法：价格 ffill 沿用、收益置 NaN、&lt;strong&gt;回测引擎在收益为 NaN 时禁止调仓&lt;/strong&gt;——停牌股既不能买也不能卖，持仓冻结到复牌。复牌日要用&lt;strong&gt;后复权价差&lt;/strong&gt;计算真实跨停牌收益；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;财务数据缺失&lt;/strong&gt;：区分「未到披露期」（正常，用最近一期已知值）与「未披露/延期」（信号：质量警示因子可用「披露延迟天数」）；新三板与部分小盘股长期缺数据，直接纳入会污染因子；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分析师数据缺失&lt;/strong&gt;（无覆盖）：不是 0 而是缺失——「0 个分析师预测」与「预测为 0」是完全不同的两回事，pandas 的 NaN 语义恰好正确，别手贱 fillna。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;填空的通用守则&lt;/strong&gt;：任何填充操作之前，先统计缺失率与缺失的时间分布（缺失集中在某段时间 = 数据源事故，不是市场现象）。&lt;/p&gt;
&lt;h2 id="异常值是错误还是真实的市场"&gt;异常值：是错误，还是真实的市场？
&lt;/h2&gt;&lt;p&gt;清洗的第一原则：&lt;strong&gt;先怀疑数据错误，再接受极端真实&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;明确的错误&lt;/strong&gt;：价格 = 0 或负数、成交量 = 负、收盘价偏离 ±50% 而无除权记录、2020-02-03 之外的「全线跌停」日——修复或置 NaN；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;真实的极端&lt;/strong&gt;：2020-02-03（疫情后开盘 A 股 3000+ 只跌停）、2024-02 小微盘连环跌停、WTI 负油价。这些&lt;strong&gt;必须保留&lt;/strong&gt;——它们正是策略尾部风险的真实样本。把极端日「平滑掉」的回测，等于把压力测试的答案提前销毁；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;判断工具&lt;/strong&gt;：对照除权除息表（跳空是否有公司行动解释）、对照公告（停牌？重大事项？）、对照多数据源（另一家数据商同日同价吗）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因子层面的 winsorize（如 ±3MAD 截尾）是另一件事：它是&lt;strong&gt;统计稳健性处理&lt;/strong&gt;（防止一个异常值主导回归），发生在因子计算阶段；而数据层的异常值处理发生在因子之前。两层不要混淆——&lt;strong&gt;数据层修复错误，因子层控制影响&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="幸存者偏差你的股票池里有没有死人"&gt;幸存者偏差：你的股票池里有没有死人
&lt;/h2&gt;&lt;p&gt;只回测「今天还存在」的股票，等于只研究「活到决赛的选手」：退市股（往往是跌得最惨的）、长期 ST、被合并的标的全部缺席。A 股退市率历史上不高但 2020 年后显著上升，影响在小盘策略里尤其致命——&lt;strong&gt;小市值策略天然超配「即将退市」的股票&lt;/strong&gt;，不含退市股的小市值回测是量化界最经典的自我欺骗。&lt;/p&gt;
&lt;p&gt;工程解法：&lt;strong&gt;用「当时在市」的动态股票池&lt;/strong&gt;——每个月的回测截面，股票池 = 截面日所有上市交易的股票（含后来退市的），需要数据商提供完整的历史成分与退市记录。检验自己的数据：随便挑一只知名退市股（如乐视网），查它的历史日线与财报能否完整取到——取不到，你的回测全部打折（见&lt;a
 class="link"
 href="http://airyv.com/quant/data-sources/"&gt;&lt;span class="markdown-link-inner"&gt;数据来源&lt;/span&gt;&lt;/a&gt;
的采购检验项）。&lt;/p&gt;
&lt;p&gt;基金研究的同款陷阱：只统计现存基金 = 把所有清盘基金（多数业绩差）开除出样本，行业平均收益被系统性高估。&lt;/p&gt;
&lt;h2 id="前视偏差的三种形态"&gt;前视偏差的三种形态
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;数据前视&lt;/strong&gt;：用报告期而非公告日对齐财报（最常见）；用当日收盘价决定当日买入；用前复权缓存的旧版本；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参数前视&lt;/strong&gt;：用全样本优化的参数「回测」同一样本（见&lt;a
 class="link"
 href="http://airyv.com/quant/walk-forward-validation/"&gt;&lt;span class="markdown-link-inner"&gt;过拟合&lt;/span&gt;&lt;/a&gt;
）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;流程前视&lt;/strong&gt;：股票池用今天的指数成分回测十年前；行业分类用最新申万映射回历史（申万 2021 年大改版，行业因子因此漂移，见&lt;a
 class="link"
 href="http://airyv.com/quant/cn-data-pitfalls/"&gt;&lt;span class="markdown-link-inner"&gt;行业分类变更&lt;/span&gt;&lt;/a&gt;
）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;自检问题清单：&lt;strong&gt;在回测的每一天 t，这段代码读取的每一个字段，其「可知时间」是否都 ≤ t 的决策时点？&lt;/strong&gt; 能对每个字段答出「是」并指出字段来源，才算过关。&lt;/p&gt;
&lt;h2 id="pit-数据库把时点做成工程"&gt;PIT 数据库：把「时点」做成工程
&lt;/h2&gt;&lt;p&gt;PIT（point-in-time）数据库的核心设计：&lt;strong&gt;每条记录带生效区间，而非只带报告期&lt;/strong&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;code, metric, report_period, announce_date, value
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;600519.SH, net_profit, 2025Q4, 2026-04-02, 862.3亿
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;600519.SH, net_profit, 2025Q4, 2026-08-20, 858.1亿 ← 修正公告（旧值作废）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;查询接口只有一个语义：&lt;code&gt;get(code, metric, asof=t)&lt;/code&gt; 返回 &lt;strong&gt;t 时刻市场真实可见的最新值&lt;/strong&gt;。三条实现纪律：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;永不覆盖，只追加&lt;/strong&gt;：修正公告追加新行并带 announce_date，旧值保留（必要时标 deprecated）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回填即造假&lt;/strong&gt;：发现历史数据缺失时「按现在的认知补上」会让 PIT 退化成普通数据库——缺失就缺失，留空；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;行情、财报、行业、股本全部 PIT 化&lt;/strong&gt;：股本变动（送转）、行业变更（申万改版）同样有时点问题。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;个人研究的最小 PIT 方案：tushare 的财报公告日字段 + 一张自维护的「生效区间表」，配合 &lt;code&gt;asof&lt;/code&gt; 查询函数——半天工作量，换来基本面因子的第一道诚信保险（更完整方案见&lt;a
 class="link"
 href="http://airyv.com/quant/factor-storage-quality/"&gt;&lt;span class="markdown-link-inner"&gt;因子存储与版本管理&lt;/span&gt;&lt;/a&gt;
）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关联阅读&lt;/strong&gt;：&lt;a
 class="link"
 href="http://airyv.com/quant/data-types/"&gt;&lt;span class="markdown-link-inner"&gt;数据类型&lt;/span&gt;&lt;/a&gt;
 的每类数据陷阱是本篇的输入；&lt;a
 class="link"
 href="http://airyv.com/quant/cn-data-pitfalls/"&gt;&lt;span class="markdown-link-inner"&gt;公司行动处理&lt;/span&gt;&lt;/a&gt;
 是 A 股落地细节；&lt;a
 class="link"
 href="http://airyv.com/quant/backtest-biases/"&gt;&lt;span class="markdown-link-inner"&gt;回测偏差大全&lt;/span&gt;&lt;/a&gt;
 展示这些错误在回测层的最终形态。&lt;/p&gt;</description></item><item><title>因子存储与数据质量监控</title><link>http://airyv.com/quant/factor-storage-quality/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://airyv.com/quant/factor-storage-quality/</guid><description>&lt;p&gt;研究早期，因子是散落在 Notebook 里的几行代码；研究成熟后，因子必须成为&lt;strong&gt;可复用、可审计、可监控的资产&lt;/strong&gt;——因为组合模型每天都要消费几十个因子的最新值，任何一个静默出错都会污染仓位。本篇讲因子资产的工程化：存储、版本、流水线与质量监控。&lt;/p&gt;
&lt;h2 id="因子的存储模型"&gt;因子的存储模型
&lt;/h2&gt;&lt;p&gt;因子输出是统一形状的三维数据：&lt;code&gt;因子 × 日期 × 股票&lt;/code&gt;。两种主流存储：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;宽表（每因子一张 Parquet 表，index=日期，columns=股票代码）&lt;/strong&gt;：与研究代码的 DataFrame 直通、按因子读取快。适合个人与中小团队。缺点：加股票要改所有表、稀疏（停牌日）占空间——用 nullable 类型 + 压缩可解；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;长表（一张大表，列 = date, code, factor, value）&lt;/strong&gt;：按日期/股票切片灵活、新增因子零迁移、对数据库友好。适合因子数 &amp;gt; 数百的团队。可上 ClickHouse/DuckDB（见&lt;a
 class="link"
 href="http://airyv.com/quant/scheduling-databases/"&gt;&lt;span class="markdown-link-inner"&gt;调度与数据库&lt;/span&gt;&lt;/a&gt;
）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;无论哪种，&lt;strong&gt;必须与因子元数据表配套&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;factor_meta: factor_name, version, definition(公式/伪代码), universe(适用股票池),
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; frequency, window(回看窗口), depends_on(依赖字段), owner, created_at, status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;「这个动量因子用的是 20 日还是 60 日、复权了吗、含不含 ST」——半年后没有人记得，元数据表就是记忆（这与&lt;a
 class="link"
 href="http://airyv.com/quant/git-collaboration/"&gt;&lt;span class="markdown-link-inner"&gt;Git&lt;/span&gt;&lt;/a&gt;
 的 commit 纪律同构：因子定义的每次修改提交一次，version 递增）。&lt;/p&gt;
&lt;h2 id="版本管理因子值是会漂移的"&gt;版本管理：因子值是会漂移的
&lt;/h2&gt;&lt;p&gt;同一因子名的值随三件事漂移：定义修改（v1 用 20 日、v2 用 60 日）、数据回填（数据商修正历史财报）、股票池调整。不管理版本的下场：&lt;strong&gt;三个月前的回测结果无法复现，且说不清是因子变了还是数据变了&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;最小可行方案：因子表名带版本（&lt;code&gt;momentum_60d@v2&lt;/code&gt;），新版本生成时跑一次&lt;strong&gt;新旧对比报告&lt;/strong&gt;（相关性、IC 差异、差异最大的 20 个股票-日期对），人工确认后切换默认版本、旧版本只读归档。这是「数据层的 A/B 测试」（见&lt;a
 class="link"
 href="http://airyv.com/quant/experiment-ab/"&gt;&lt;span class="markdown-link-inner"&gt;实验设计&lt;/span&gt;&lt;/a&gt;
）。&lt;/p&gt;
&lt;h2 id="每日更新流水线"&gt;每日更新流水线
&lt;/h2&gt;&lt;p&gt;生产因子的更新是一条定时流水线（工程骨架见&lt;a
 class="link"
 href="http://airyv.com/quant/scheduling-databases/"&gt;&lt;span class="markdown-link-inner"&gt;任务调度&lt;/span&gt;&lt;/a&gt;
）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;17:00 行情落地 → 17:10 校验通过 → 17:15 计算增量因子 → 17:20 质量检查
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;→ 17:25 写入正式表(原子切换) → 17:30 通知策略层
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;三条工程纪律：&lt;strong&gt;先写临时表、校验通过后原子重命名&lt;/strong&gt;（绝不直接覆盖正式表——写到一半崩溃会让策略层读到半张表）；&lt;strong&gt;增量计算要定期全量重算对账&lt;/strong&gt;（每月一次全量重算，与增量结果 diff，捕捉滚动窗口类因子的累积误差）；&lt;strong&gt;依赖排序&lt;/strong&gt;（财报因子依赖财报表更新完成，用调度器声明依赖而不是猜时间）。&lt;/p&gt;
&lt;h2 id="数据质量监控六项检查"&gt;数据质量监控：六项检查
&lt;/h2&gt;&lt;p&gt;每天因子落地后自动运行，任何一项失败即告警并冻结策略信号（宁可停一天，不可带病交易）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;新鲜度&lt;/strong&gt;：最新日期 = 预期交易日；行数 vs 股票池规模的偏差 &amp;lt; 2%；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;零方差检测&lt;/strong&gt;：某因子当日全市场标准差 ≈ 0 → 计算逻辑异常（如数据没接上全为默认值）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;极值占比&lt;/strong&gt;：|z| &amp;gt; 5 的比例突变（正常 &amp;lt; 0.5%）→ 单点异常或数据源切换；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺失率突变&lt;/strong&gt;：某字段缺失率较 20 日均值跳升 &amp;gt; 3σ → 上游接口变化；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;横截面秩稳定性&lt;/strong&gt;：与昨日相比，因子排名的 Spearman 相关骤降（非调仓日）→ 排序被污染；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回溯对账&lt;/strong&gt;：随机抽 20 个股票-因子-日期三元组，用「当时的原始数据 + 当前代码」重算比对——捕捉「代码悄悄变了」的漂移。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这六项检查是「多源校验」之外的最后一道防线——数据商接口静默变更、上游口径调整、代码意外退化，都会在其中一个检查上现形（数据来源的多源方案见&lt;a
 class="link"
 href="http://airyv.com/quant/data-sources/"&gt;&lt;span class="markdown-link-inner"&gt;数据来源&lt;/span&gt;&lt;/a&gt;
）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;与策略层的契约&lt;/strong&gt;：策略代码只读「正式表 + 版本号」，并在日志中记录当日消费的每个因子版本——回撤归因时才能回答「当时组合吃的是什么版本的动量」（见&lt;a
 class="link"
 href="http://airyv.com/quant/post-trade-review/"&gt;&lt;span class="markdown-link-inner"&gt;事后风控&lt;/span&gt;&lt;/a&gt;
）。&lt;/p&gt;
&lt;h2 id="成本意识的提醒"&gt;成本意识的提醒
&lt;/h2&gt;&lt;p&gt;因子工程的复杂度要与研究规模匹配：5 个因子 + 1 个人，宽表 + Parquet + 上面这套检查的「手动脚本版」就够；别在因子数 &amp;lt; 10 时搭建分布式特征平台——&lt;strong&gt;工程应该追着研究的需求跑，而不是反过来&lt;/strong&gt;（见&lt;a
 class="link"
 href="http://airyv.com/quant/quant-system-architecture/"&gt;&lt;span class="markdown-link-inner"&gt;生产系统架构&lt;/span&gt;&lt;/a&gt;
的「何时升级」讨论）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关联阅读&lt;/strong&gt;：&lt;a
 class="link"
 href="http://airyv.com/quant/data-cleaning/"&gt;&lt;span class="markdown-link-inner"&gt;数据清洗&lt;/span&gt;&lt;/a&gt;
 是流水线中「校验」一步的依据；&lt;a
 class="link"
 href="http://airyv.com/quant/alpha-research-process/"&gt;&lt;span class="markdown-link-inner"&gt;Alpha 研究流程&lt;/span&gt;&lt;/a&gt;
 定义因子从 idea 到入库的完整路径；&lt;a
 class="link"
 href="http://airyv.com/quant/quant-devops/"&gt;&lt;span class="markdown-link-inner"&gt;生产运维&lt;/span&gt;&lt;/a&gt;
 把流水线纳入 CI/CD。&lt;/p&gt;</description></item><item><title>A 股数据特有问题：复权、停牌与行业变更</title><link>http://airyv.com/quant/cn-data-pitfalls/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://airyv.com/quant/cn-data-pitfalls/</guid><description>&lt;p&gt;A 股的数据坑是「制度性」的：不是数据质量问题，而是市场规则投射到数据上的必然形状。本篇四个主题，每一个都对应一类&lt;strong&gt;反复发生的回测事故&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="复权与除权除息算收益的命门"&gt;复权与除权除息：算收益的命门
&lt;/h2&gt;&lt;p&gt;分红送转让原始价格序列产生跳空，不复权直接算收益会把除息日当成暴跌。三种口径的取舍：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;口径&lt;/th&gt;
 &lt;th&gt;基准&lt;/th&gt;
 &lt;th&gt;用途&lt;/th&gt;
 &lt;th&gt;陷阱&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;不复权&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;td&gt;与实盘委托价对齐、盘口分析&lt;/td&gt;
 &lt;td&gt;不能跨除权日算收益&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;前复权&lt;/td&gt;
 &lt;td&gt;以最新价为锚向前调整&lt;/td&gt;
 &lt;td&gt;画图直观、技术指标&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;历史价格随每次分红整体重算&lt;/strong&gt;；技术指标的历史值漂移&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;后复权&lt;/td&gt;
 &lt;td&gt;以上市首日为锚向后调整&lt;/td&gt;
 &lt;td&gt;收益计算、回测的价格序列&lt;/td&gt;
 &lt;td&gt;价格与实际盘口价脱钩（可用于判断「能不能成交」的只有不复权价）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;回测的黄金组合&lt;/strong&gt;：收益与信号计算用&lt;strong&gt;后复权&lt;/strong&gt;（稳定、不漂移），成交与限价判断用&lt;strong&gt;不复权&lt;/strong&gt;（真实委托价），除权日单独处理（按分红方案把昨日持仓的股数与成本调整，而不是靠复权价隐含处理——组合层的送转要「股数×2、价格÷2」地显式处理）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前复权缓存漂移&lt;/strong&gt;是最隐蔽的事故，算一个具体例子：2026 年 6 月某股每股分红 0.5 元（股价 25 元，2%），前复权把 2020 年以来全部历史价格整体下调 2%——你 5 月缓存的信号值、算好的技术指标、乃至当年的回测曲线，在 6 月全部「悄悄变了」。新旧缓存混用时，回测里出现「幽灵收益」。对策：只缓存后复权 + 复权因子两张表，前复权按需实时计算；任何缓存表记录「生成时间 + 覆盖的除权事件上限」（见&lt;a
 class="link"
 href="http://airyv.com/quant/factor-storage-quality/"&gt;&lt;span class="markdown-link-inner"&gt;因子存储与版本管理&lt;/span&gt;&lt;/a&gt;
的对账思想）。&lt;/p&gt;
&lt;h2 id="停牌不可交易的建模"&gt;停牌：不可交易的建模
&lt;/h2&gt;&lt;p&gt;A 股停牌曾长期任性（2015 年千股停牌），2018 年后制度收紧但停牌仍常见。回测必须在三层显式建模：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;信号层&lt;/strong&gt;：停牌日因子值冻结（ffill）或缺失，&lt;strong&gt;该股当日不可买入&lt;/strong&gt;（挂单也成不了交）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组合层&lt;/strong&gt;：已持仓的停牌股冻结——&lt;strong&gt;既不能卖也不能调权重&lt;/strong&gt;。2015 年股灾中大量基金「停牌股撑住净值」的假象（复牌后补跌）就是这个机制的反面教材；回测里把停牌持仓按冻结处理，净值曲线才会诚实反映复牌补跌。量化其影响：若组合 8% 权重的持仓停牌 2 个月、复牌补跌 30%，回测里「冻结处理」与「假设照常交易」的净值差可达 2.4 个点——足够改变策略评级；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;成交层&lt;/strong&gt;：复牌首日波动巨大，成交假设要保守（见&lt;a
 class="link"
 href="http://airyv.com/quant/data-cleaning/"&gt;&lt;span class="markdown-link-inner"&gt;数据清洗&lt;/span&gt;&lt;/a&gt;
的「穿越成交」原则）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="涨跌停与-st价格边界的两层含义"&gt;涨跌停与 ST：价格边界的两层含义
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;涨跌停&lt;/strong&gt;（主板 ±10%、创业/科创 ±20%、北交所 ±30%、ST ±5%）对回测的三层影响：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;收益层&lt;/strong&gt;：涨停价收盘 → 次日惯性（打板策略的制度基础）；跌停封死 → 你挂在跌停价的卖单&lt;strong&gt;排在几十万手之后，大概率不成交&lt;/strong&gt;。回测里「跌停日止损成功」是最常见的乐观偏差——正确建模：跌停封死时卖单不成交，顺延次日；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可交易层&lt;/strong&gt;：涨停封死时买单同样无法成交——动量类策略「信号出现但买不进」的容量与收益都要打折。检验方法：统计信号日的涨停占比，&amp;gt;10% 就要认真处理；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;成本层&lt;/strong&gt;：接近涨跌停时的 spread 与冲击成本急剧放大，成本模型要对「距涨跌停的距离」分档（见&lt;a
 class="link"
 href="http://airyv.com/quant/transaction-costs/"&gt;&lt;span class="markdown-link-inner"&gt;交易成本分解&lt;/span&gt;&lt;/a&gt;
）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;ST&lt;/strong&gt;：风险警示股涨跌幅 5%、退市风险高、流动性差。多因子模型的常见处理：直接剔除（注意「剔除」本身要在 PIT 上做——用「当时是否 ST」而不是「现在是否 ST」）；或保留但加流动性过滤。&lt;strong&gt;小市值策略对 ST 处理最敏感&lt;/strong&gt;：剔除 ST 后历史收益通常显著下降——这个下降是真实的（你在放弃真实市场里的一类风险收益），要在报告里披露而不是当作噪音（见站内原文&lt;a
 class="link"
 href="http://airyv.com/p/%e5%b9%b4%e5%8c%96700%e5%b0%8f%e5%b8%82%e5%80%bc%e7%ad%96%e7%95%a5%e5%88%86%e4%ba%ab%e9%87%8f%e5%8c%96%e7%ad%96%e7%95%a5%e5%a6%82%e4%bd%95%e7%a2%be%e5%8e%8b%e5%a4%a7%e7%9b%98/"&gt;&lt;span class="markdown-link-inner"&gt;小市值策略实战复盘&lt;/span&gt;&lt;/a&gt;
对此的实战讨论）。&lt;/p&gt;
&lt;h2 id="行业分类变更申万改版的教训"&gt;行业分类变更：申万改版的教训
&lt;/h2&gt;&lt;p&gt;行业因子与中性化都依赖行业分类，而行业分类会改版：&lt;strong&gt;申万 2021 年大改&lt;/strong&gt;（一级 28 → 31 个，大量个股重分类）。用「最新申万分类」回测历史，等于让 2019 年的银行股被分进 2021 年的口径——中性化因子的历史表现系统性失真。&lt;/p&gt;
&lt;p&gt;工程方案：行业表做成 PIT 结构（&lt;code&gt;code, industry_sw, effective_from, effective_to&lt;/code&gt;），回测截面用「当时生效」的分类；跨口径研究（新旧对比）单独建映射表。中信、证监会、同花顺分类同理，且&lt;strong&gt;不同体系的「行业」粒度与逻辑不同&lt;/strong&gt;（申万偏投资口径、证监会偏监管口径），跨体系混用是行业轮动研究的常见翻车点（见&lt;a
 class="link"
 href="http://airyv.com/quant/industry-rotation-cn/"&gt;&lt;span class="markdown-link-inner"&gt;行业与主题&lt;/span&gt;&lt;/a&gt;
）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本篇总结成一条工程铁律&lt;/strong&gt;：A 股数据的每个「特殊处理」（复权、停牌、涨跌停、ST、行业）都应该是回测配置里的&lt;strong&gt;显式开关 + 单元测试覆盖&lt;/strong&gt;，而不是隐藏在数据预处理黑箱里的隐式行为——制度假设显式化，回测才可审计（见&lt;a
 class="link"
 href="http://airyv.com/quant/backtest-engine-design/"&gt;&lt;span class="markdown-link-inner"&gt;回测框架设计&lt;/span&gt;&lt;/a&gt;
）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关联阅读&lt;/strong&gt;：&lt;a
 class="link"
 href="http://airyv.com/quant/equities-markets/"&gt;&lt;span class="markdown-link-inner"&gt;权益类市场对比&lt;/span&gt;&lt;/a&gt;
 的制度清单是本篇的上游；&lt;a
 class="link"
 href="http://airyv.com/quant/ashare-constraints/"&gt;&lt;span class="markdown-link-inner"&gt;A 股量化约束&lt;/span&gt;&lt;/a&gt;
 从策略层量化这些约束的影响；&lt;a
 class="link"
 href="http://airyv.com/quant/data-cleaning/"&gt;&lt;span class="markdown-link-inner"&gt;数据清洗&lt;/span&gt;&lt;/a&gt;
 是通用方法论。&lt;/p&gt;</description></item></channel></rss>