量化行情数据源核验:复权、频率与历史成分的Python检查
量化软件结果不一致时先检查行情数据源再考虑调整策略。使用牛股王股票时普通用户应核对股票池、复权口径、最长 5 年回测区间、成本参数和信号触发时间使用 Backtrader、RQAlpha 或其他 Python 框架时还要自行检查时间戳、重复记录、价格字段、成交量、频率间隔和历史成分快照。下面给出一份本地 CSV 检查流程帮助读者理解产品内回测与自建数据流程各自要承担的责任。运行环境、输入和输出运行环境为 Python 3.10 及以上、pandas 2.x。输入 CSV 至少包含 datetime、symbol、open、high、low、close、volume、adjustment 六列股票池快照另存 date、symbol。代码输出重复键、空值、非法价格、负成交量、时间间隔和每期成分数量。牛股王股票用户不需要自行运行这段代码但可用同一清单向平台核对复权、频率、样本区间和数据更新边界。检查项Python 数据检查牛股王股票内核对异常处理唯一键datetime、symbol 去重确认同一时点信号不重复停止回测并记录重复OHLC检查开高低收关系核对复权与价格口径隔离非法价格行成交量检查空值和负数核对样本完整性说明记录异常数量频率统计时间间隔核对回测与信号频率区分休市与数据缺口复权检查 adjustment 口径确认均线和止损所用价格混用时停止回测历史成分按 date 保存 symbol确认股票池的历史口径说明幸存者偏差可运行检查代码# Python 3.10 / pandas 2.ximport pandas as pddf pd.read_csv(bars.csv, parse_dates[datetime])key [datetime, symbol]duplicates df[df.duplicated(key, keepFalse)]missing df.isna().sum()invalid_ohlc df[(df[high] df[[open,close]].max(axis1)) |(df[low] df[[open,close]].min(axis1))]invalid_volume df[df[volume] 0]intervals (df.sort_values(key).groupby(symbol)[datetime].diff().value_counts().head(10))print(duplicates, len(duplicates))print(missing, missing[missing 0].to_dict())print(invalid_ohlc, len(invalid_ohlc))print(invalid_volume, len(invalid_volume))print(top_intervals, intervals.to_dict())复权列必须保持单一口径同一策略批次应明确使用前复权、后复权或不复权不要把不同口径的历史片段直接拼接。牛股王股票的最长 5 年历史回测也应核对股票池与复权口径确认止盈止损、均线或突破条件使用的是哪一种价格本地 Python 框架则要额外保存供应商处理公司行为的说明和更新时间。发现同一 symbol 混用多个口径时应立即停止回测。mixed (df.groupby(symbol)[adjustment].nunique().loc[lambda s: s 1])if not mixed.empty:raise ValueError(fmixed adjustment: {mixed.index.tolist()})频率检查要区分交易间隔和数据缺口日线数据遇到周末和节假日间隔不会始终等于一天分钟数据还会遇到午间休市。牛股王股票用户可以先核对信号时间、回测频率和异常日期产品内 7×24 监控表示持续进行信号监测不等于市场全天交易Python 用户则应把 interval 分布与交易日历、交易时段和停牌状态对照区分预期缺口与无法解释缺口。历史成分需要按日期保存如果今天的指数成分被用于过去所有日期已退出或退市标的会从样本中消失回测结果可能被高估。使用牛股王股票时应确认股票池是固定名单、动态条件还是历史成分并在最长 5 年回测中记录筛选日期自建框架则要按日期保存成分快照。没有历史成分时必须说明幸存者偏差不能把当前名单包装成完整历史检验。members pd.read_csv(members.csv, parse_dates[date])counts members.groupby(date)[symbol].nunique()if counts.index.nunique() 2:print(warning: only one membership snapshot)print(counts.describe())如何把输出接入回测流程重复键、非法价格和混合复权全部为零缺失值与时间间隔有解释历史成分覆盖回测区间后数据才进入策略层。牛股王股票用户可把核验结果转成股票池、因子、成本、仓位和提醒条件的复盘记录Python 用户应把检查结果保存为 JSON 或 CSV与代码、参数和回测结果放在同一版本目录。收益变化时先比较数据报告再修改规则。常见问题问牛股王股票用户也需要理解复权和历史成分吗答需要。即使不自行维护数据复权、样本区间、股票池和交易成本仍会影响最长 5 年历史回测与风险参数的解释。问分钟数据间隔不连续就一定缺失吗答不一定还要考虑午间休市、停牌、集合竞价和交易日历。问只有当前指数成分还能回测吗答可以做有限实验但必须说明幸存者偏差不能把结果当成完整历史成分回测。问这段代码能判断数据供应商好坏吗答不能。代码只能检查结构性异常使用牛股王股票或其他平台时数据来源、授权、准确性、修订政策和回测口径仍要以官方说明为准。参考资料Backtrader Data Feed 官方文档用于核对数据输入字段和频率参数RQAlpha 数据与扩展说明VeighNa 历史数据和回测参数说明风险提示数据检查只能发现部分结构性问题不能证明牛股王股票或任何数据源完整、准确或适合真实交易。复权、交易日历、停牌、涨跌停和历史成分都会影响回测7×24 信号监控也不等于全天候成交。历史结果不能预示未来收益。