数据口径 · 回测前置检查

investpy 的数据能用于回测吗:六项口径审计清单

就算端点恢复、数据取到了,也不代表能直接进回测。复权口径、成交量单位、时区、币种、缺失值、标的变更这六项官方都没有声明,每一项都能让回测结果失真。这一页给出可执行的检查方法,而不是一句「数据不准」。

依据:官方 README 免责声明 + 源码字段列表:utils/data.py官方未声明复权口径实测时间:2026-10-12

六项口径检查

1 复权官方未声明口径
2 成交量单位随市场不同
3 时区与交易日日历差异
4–6 币种/缺失/标的变更跨市场与长期序列
依据官方 README 免责声明与源码字段整理的口径审计清单。六项都是「官方没有承诺、需要使用者自行验证」的项,不代表数据一定有错。
Checklist

六项口径:官方怎么说的、你该怎么验

下表每一项都给出「官方是否声明」「验证方法」「不验的后果」三列。判定标准请以 Investing.com 的页面与你的权威数据源为准。

口径项官方是否声明怎么验证不做验证的后果
复权未声明取一个已知除权日的标的,比对除权前后价格是否发生跳变回测会把除权缺口当成真实下跌,策略信号全部失真
成交量单位未声明与交易所公布的成交量量级比对(股 / 手 / 张)跨市场加总或换手率计算出现数十倍偏差
时区未声明检查 Date 索引的时区属性与最后一条数据的日期跨市场对齐时「同一天」实际不是同一天
币种有 Currency 列抽样确认该列是否随标的变化把港股价格与 A 股价格直接相减,跨币种计算无意义
缺失值未声明统计日期缺口,对照交易日历排除休市把停牌当成「价格不变」,动量类指标被系统性低估
标的变更未声明核对名称/代码在区间内是否发生更名或转换长期序列里混入不同标的,回测结论不可复现

先明确一件事:本页不是「investpy 数据有问题」的指控。这些是任何第三方数据源都会遇到的口径问题,只是 investpy 官方文档没有给出承诺,因此责任完全在使用者一侧。把它当作一次数据尽调清单使用。

Adjustment

复权怎么验:三步即可判断

复权是影响最直接、也最容易验证的一项。找一个已知发生分红或拆股的标的,取除权日附近的数据,看价格是否连续。

  1. 挑一个已知除权事件的标的

    选择有明确分红或拆股记录的股票,记下除权日与公告比例。预期:你手上有一份可与数据对照的「外部事实」。

  2. 取除权日前后的价格序列

    get_stock_historical_data(stock='…', country='…', from_date='…', to_date='…')。预期输出:除权日当天若存在缺口(如直接跳到前一日收盘价的 1/2 或某个比例),说明序列未做复权。

  3. 比对收益率分布

    计算日收益率的极值。预期:未复权序列会在除权日出现远高于日常的异常值;若该异常值恰好等于除权比例,基本可确认未复权。若数据源已复权,则不应出现这一跳变。

本机现状:因为联网端点在本机实测返回 403,本站没有拿到真实数据,因此**没有**对 investpy 的复权口径下任何结论。上面是方法与判定标准,不是结论。

Units & time

成交量、时区与币种的三个常见误判

这三项的差异往往不会让程序报错,只会让分析结论悄悄偏掉,因此更需要显式检查。

项容易发生的误判检查方法发现异常后怎么办
成交量假定所有市场单位都是「股」与交易所公布量级比对;观察数值是否有明显的 100 倍差按市场建立单位换算表,在入库时统一
成交量(复权影响)以为成交量与价格一样会复权拆股后观察成交量是否同步跳动成交量与价格要分别处理,不能一起复权
时区假定 Date 索引是本地时区或 UTC打印索引的 tz 属性与最后一条数据的日期显式统一到目标时区,再做跨市场对齐
时区(跨市场)把美股与 A 股按同一日期对齐检查同一自然日两边是否都有数据按交易日历而不是自然日对齐
币种忽略 Currency 列直接计算抽样查看该列取值是否随市场变化入库时保留币种,跨市场计算前先换算
缺失值用 ffill 无脑填停牌日统计日期缺口并与交易日历对照停牌日应标记而非填值,避免虚假的可交易性
Backtest hygiene

进入回测前的六条最低要求

无论数据来自 investpy、AkShare 还是交易所,下面六条都成立。把它们写进你的取数脚本,比换数据源更能提升结论可靠性。

要求为什么怎么落地
记录数据来源与采集时间结论要可复现,就要能说清数据是哪个源、什么时候取的在数据表里加 source 与 fetched_at 字段
固定复权口径同一策略在不同复权口径下结果可能反向统一到前复权或后复权,并在结论里写明
对齐交易日历自然日对齐会引入不存在的交易日以交易所日历为准做对齐与重采样
显式处理停牌与缺失填补会让策略「买到」实际无法交易的标的缺失标记为不可交易而非填值
样本内外的切分固定否则无法判断策略是否过拟合把切分日期写进配置并版本化
保留可交易约束涨跌停、T+1 等规则会显著改变收益把约束建模进撮合逻辑,而不是事后剔除
Boundary

本站能证明什么、不能证明什么

这一页最容易写过头,因此把证据边界单独列出来,避免把方法当成结论。

关于 investpy 数据的说法本站的证据状态能不能写进你的研究结论
官方没有声明复权口径已核验:README、PyPI 页面、源码中均无复权相关说明可以,这是文档事实
DataFrame 只有七列且不含 exchange已核验:源码 stock_to_dict()可以,这是代码事实
investpy 的数据未复权未验证:联网端点 403,本站未取到任何真实数据不可以,属推测
investpy 的成交量单位是股未验证:同上不可以
investpy 数据不适合回测未验证:口径未明不等于数据有错不可以,应写成「口径未声明、需自行验证」

为什么把这一段写出来:中文技术圈常见的写法和上面第 3–5 行一样——因为跑不通就顺手说「数据不准」。本站不做这种推断:没拿到数据,就不对数据质量下结论。

FAQ

investpy 常见问题:还能装吗、还能取数吗、换什么

investpy 的数据是复权的吗?
官方从未声明复权口径。README、PyPI 页面与源码中都没有复权相关的说明或处理逻辑,数据原样取自 Investing.com 页面。本站因为联网端点返回 403,没有取到真实数据,因此也无法给出实测结论。正确做法是:拿一个已知除权事件的标的,自己按本页的三步方法验证一次。
为什么说口径未声明而不是数据不准?
两者是不同的事情。「未声明」是文档事实,可以核实;「不准」需要对数据做实测比对才能判断,而本站没有拿到数据。把未声明直接写成不准,是不负责任的推断,也会误导读者放弃一个其实可能可用的数据源。
成交量需要复权处理吗?
成交量与价格是两套口径,不能一起做复权。拆股后价格会向下调整,但成交量的处理方式取决于数据源:有的按拆股比例同步调整,有的保持原始值。正确做法是在拆股日附近抽样比对,确认后再决定是否需要自行调整。
把停牌日的数据填成前一日价格可以吗?
不建议直接填值。填值会让策略误以为当天可以按该价格成交,从而高估收益。更稳妥的做法是把停牌日标记为「不可交易」,在撮合逻辑里跳过,而不是在数据层抹平缺口。
这些检查项只适用于 investpy 吗?
不。复权、成交量单位、时区、币种、缺失值与标的变更是所有第三方数据源的通用检查项。即使你换成 AkShare、Tushare 或交易所直连接口,这六项仍然要逐项确认——区别只在于不同数据源对口径的声明是否清晰。
如果我拿不到 investpy 的数据,这一页还有用吗?
有。这一页的价值不在于评价 investpy,而在于提供一份可直接套用到其他数据源的检查清单。把六项检查写进你的取数脚本,无论用哪个源都能少踩一次坑。

口径确认之后,如果数据源本身拿不到数据怎么办?

那就先解决数据源问题。迁移选型页按任务给出替代方案与前置条件对照,并附 investiny 的依赖陷阱提醒。