阶段4Python 基础进阶●●●●●

ffill的危险:前向填充如何制造假数据

我的掌握程度:
q-317精讲

先掌握这个答案

ffill的正确场景:①财务数据自公告日起沿用(值本身就该保持到下次更新)②画图需要连续线(视觉需求)③指数编制中停牌股沿用旧价。危险场景:①回测撮合——用ffill价成交=虚构交易;②波动率/动量计算——冻结的零变化会低估波动/扭曲动量。正确组合拳:①标记suspended=True;②分析用列ffill;③交易层检查suspended——禁止停牌交易。这是q-066(阶段1停牌处理)的pandas实现版。

先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。

从理解到使用

本阶段实战方法 · 一条能复现的数据流水线

把接口返回的数据变成可用于因子研究的面板时,先处理时点、主键与单位。

  1. 建立数据字典:字段、单位、时区、交易日历、数据源、抓取时间、原始价与复权因子。
  2. 用(date, code)查重,区分停牌、未上市、窗口不足和真实缺失;不要用向后填充把未来值带回过去。
  3. 保存原始快照与清洗日志,固定随机种子和环境版本;接口字段变化时先核对官方文档。

使用边界

  • 报告期不等于公告可用日,盘后公告通常不能用于当天收盘前决策。
  • API输出名为“动态市盈率”时不能直接改名TTM;浏览器练习不支持任意原生库或行情抓取接口。
背景 · 从一个困惑说起
停牌股的收盘价NaN——你用ffill填充(用昨天价格填今天)——图表变连续了。但回测引擎看到这个「价格」以为今天可以按这个价卖出——实际上停牌根本无法交易。ffill在分析场景是修复、在交易场景是造假。
由此产生的问题
ffill的正确场景与危险场景?「分析口径vs交易口径」的分离原则?停牌的正确处理组合拳(标记+填充+禁交易)?
核心概念
ffill的正确场景:①财务数据自公告日起沿用(值本身就该保持到下次更新)②画图需要连续线(视觉需求)③指数编制中停牌股沿用旧价。危险场景:①回测撮合——用ffill价成交=虚构交易;②波动率/动量计算——冻结的零变化会低估波动/扭曲动量。正确组合拳:①标记suspended=True;②分析用列ffill;③交易层检查suspended——禁止停牌交易。这是q-066(阶段1停牌处理)的pandas实现版。
为什么需要它
①一个方法的双重身份:ffill在pandas里只是「填法」——它的对错取决于你在算什么(分析or交易);②回测虚高的隐形来源:停牌期间按ffill价"卖出止损"——回测看着有效、实盘根本做不到——最阴险的假信号之一;③「双口径纪律」(q-358复权同款):同一数据给不同消费者(图表/回测/风控)要有不同版本。
实际应用场景
标准代码:df['suspended']=df['volume']==0;df['close_analysis']=df['close'].ffill();回测引擎判断suspended跳过交易。
与之前知识的联系
q-316(缺失值决策树)的停牌分支专讲;q-066(阶段1)的代码版;双口径纪律与q-330(原始价+因子)同源。
⚠ 常见误解
  • ffill了就万事大吉:分析口径OK、交易口径不行——必须叠加suspended标记+禁交易规则
  • 不填充让NaN就好:面板有NaN→rolling全部变NaN(传染病)——分析口径还是需要ffill
  • 用0填充停牌价也行:0是「有含义」的值(股价不为0)——比NaN更危险(算出虚假的暴跌)

🤖 AI导师

导师会先检查你的前置知识(缺失值处理),再用案例、公式和代码帮助理解。此功能需要先启用服务。