脏数据图鉴:缺失、为零、跳变、重复
我的掌握程度:
先掌握这个答案
脏数据图鉴:①缺失值(NaN):停牌、未披露的财务字段——原则:先想缺失原因(可能本身是信号,如「无分析师覆盖」),行情缺失标记停牌而非删除;②价格为0:接口错误或未上市——必须剔除(0参与计算会污染一切);③异常跳变:未复权的除权(q-013)或数据错误——用复权+常识检查(日收益>±21%必查);④重复行:多次抓取拼接——drop_duplicates;⑤单位不一致:手vs股、元vs万元——统一时显式转换并注释。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
填充前先解释为什么缺失
停牌、未披露、窗口不足、接口失败应分别标记。沿用上一值不等于当日可交易;bfill可能把未来信息带回过去。中位数填充也会改变分布,需在训练范围内估计并做敏感性比较。
本阶段实战方法 · 把行情数字变成可比较的收益
看股票、基金或策略业绩时,先对齐本金、起止日期、现金流与费用。
- 选一个固定区间,记录期初价值、期末价值、分红、出入金和交易费用。
- 没有中途出入金时,用(期末价值+已取出分红-期初价值-费用)÷期初价值计算收益;有出入金时先区分时间加权与资金加权。
- 用相同区间的基准作比较,同时记录最大亏损;不要单凭一次盈利评价能力。
使用边界
- 不同期限的收益不可直接排名;年化只是换算,不是未来收益承诺。
- 模拟价格不是实时行情。普通股票交易手数、T+1和费用应按具体市场规则核对。
背景 · 从一个困惑说起
新手想象的数据:整齐的表格,每行一个交易日。真实的数据:停牌日整行消失、某些行成交量为0、价格莫名跳变30%、同一日期出现两次、财务数据大片NaN——脏是常态,干净才是例外。
由此产生的问题
脏数据有哪些典型形态?各自的来源和处理原则是什么?
核心概念
脏数据图鉴:①缺失值(NaN):停牌、未披露的财务字段——原则:先想缺失原因(可能本身是信号,如「无分析师覆盖」),行情缺失标记停牌而非删除;②价格为0:接口错误或未上市——必须剔除(0参与计算会污染一切);③异常跳变:未复权的除权(q-013)或数据错误——用复权+常识检查(日收益>±21%必查);④重复行:多次抓取拼接——drop_duplicates;⑤单位不一致:手vs股、元vs万元——统一时显式转换并注释。
为什么需要它
①垃圾进垃圾出:一个价格为0的行能让整列均值/因子全废;②清洗即理解:处理脏数据的过程强迫你理解市场机制(为什么停牌、为什么缺失),这是最好的学习;③职业占比真相:量化研究员70%时间在数据上——本组题目就是那70%的预演。
实际应用场景
标准清洗函数顺序:去重→剔价格为0→标记停牌→前向填充(限价类)→异常值检查(日收益超界报告)→统一单位。把清洗日志(剔除了什么、为什么)写进数据管道。
与之前知识的联系
q-060字段、q-066停牌、q-064复权都是本图鉴的具体条目。q-071的数据校验是脏数据的系统性防线。
⚠ 常见误解
- dropna一把梭:删除行会引入偏差(停牌股系统性消失);先理解缺失机制再决定删/填/标记
- fillna(0)简单有效:0在很多字段有真实含义(如换手率为0),填0=制造假数据
- 数据源会给干净数据:商业数据也不干净,清洗是不可外包的核心能力
🛠 本题实践任务
对你下载的3只股票数据运行体检:有无重复行?有无NaN?日收益最大值多少(>21%必查原因)?写一份微型清洗日志。
💡 提示(先自己想5分钟再看)
用df.duplicated().sum()、df.isna().sum()、pct_change().max()三连。
✅ 验收标准
一份三行的体检报告(重复/缺失/最大单日收益)。从此「拿到数据先体检」成为仪式。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
Python · 独立工作线程 · 执行限时10秒
🤖 AI导师
导师会先检查你的前置知识(日线字段),再用案例、公式和代码帮助理解。此功能需要先启用服务。