预处理三件套:去极值、标准化、中性化的完整流水线
我的掌握程度:
先掌握这个答案
三件套流水线(按序执行):①去极值:每日横截面按MAD法(中位数±3×1.4826×MAD)或分位数法(1%/99%)截断——防止极端值绑架后面两步;②标准化:Z-score(减均值除标准差)或Rank(换成分位)——统一量纲可比较可加权;③中性化:对ln(市值)+行业哑变量回归取残差——剥离风格暴露。顺序原理:极值会污染均值方差(必须先去),中性化的回归系数同样怕极值;Rank法可部分替代①②但损失幅度信息。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
预处理也是研究的一部分
记录截面日期、股票池、行业版本与缺失规则。用于预测的统计量只能由当时可得样本或训练集估计;标准化不自动消除行业、市值暴露,中性化也不证明剩余信号有Alpha。
本阶段实战方法 · 一条能复现的数据流水线
把接口返回的数据变成可用于因子研究的面板时,先处理时点、主键与单位。
- 建立数据字典:字段、单位、时区、交易日历、数据源、抓取时间、原始价与复权因子。
- 用(date, code)查重,区分停牌、未上市、窗口不足和真实缺失;不要用向后填充把未来值带回过去。
- 保存原始快照与清洗日志,固定随机种子和环境版本;接口字段变化时先核对官方文档。
使用边界
- 报告期不等于公告可用日,盘后公告通常不能用于当天收盘前决策。
- API输出名为“动态市盈率”时不能直接改名TTM;浏览器练习不支持任意原生库或行情抓取接口。
不懂的术语:方差 / 标准差(Variance / Std)
背景 · 从一个困惑说起
原始因子值是不能直接用的:PE列里躺着负数和9999、市值横跨1亿到2万亿、不同量纲没法相加比较、小市值暴露伪装成Alpha。机构的标准解法是一条固定的预处理流水线——三件套,几乎所有因子入库前都要过一遍。
由此产生的问题
三件套的每一步具体怎么做(代码级)?顺序为什么不能乱?每一步的代价是什么?
核心概念
三件套流水线(按序执行):①去极值:每日横截面按MAD法(中位数±3×1.4826×MAD)或分位数法(1%/99%)截断——防止极端值绑架后面两步;②标准化:Z-score(减均值除标准差)或Rank(换成分位)——统一量纲可比较可加权;③中性化:对ln(市值)+行业哑变量回归取残差——剥离风格暴露。顺序原理:极值会污染均值方差(必须先去),中性化的回归系数同样怕极值;Rank法可部分替代①②但损失幅度信息。
为什么需要它
①可比性:三件套之后,任何两只股票的因子值在同一把尺上;②防风格伪装:不中性化的「因子」很可能只是市值/行业暴露(q-456讲代价);③工业标准:Barra体系、各私募因子平台的入库前处理与这三步高度一致——这是「行话级」技能。
实际应用场景
代码模板(本题code)应写进你的因子库作为公共函数preprocess(factor_df);敏感性检查:比较中性化前后的IC——骤降说明原IC大半来自风格暴露(重要诊断信号!)。
与之前知识的联系
q-346给单步方法,本题组装成线并讲透顺序与代价;q-431(阶段5)的分层检验建立在三件套之后的数据上;q-456专门讨论「中性化掉的就是Alpha吗」的哲学问题。
⚠ 常见误解
- 三件套每步都无脑做:每步都有代价(去极值损信息、Rank损幅度、中性化可能消灭真Alpha)——明白代价才能决定取舍
- 顺序可以调换:先标准化再不去极值=被极值污染的均值方差传播到全列;先中性化再去极值=回归系数已被极端值扭曲
- 测试集要用训练集的参数:横截面场景每天独立计算三件套,无此问题;但若做时序标准化,参数只能用截至当日的历史(q-063)
🛠 本题实践任务
用任意因子数据(可用模拟:对数正态+几个极端值)跑通三件套,输出每步之后的describe()对比表。然后回答:去极值前后,均值和标准差各变化多少?
💡 提示(先自己想5分钟再看)
重点观察:去极值后std明显下降;中性化后均值≈0(残差性质)。
✅ 验收标准
三步describe对比+两个数字。这条流水线是阶段5因子检验的前置标准动作,先练熟。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
Python · 独立工作线程 · 执行限时10秒
🤖 AI导师
导师会先检查你的前置知识(Winsorize、Z-score、中性化概念),再用案例、公式和代码帮助理解。此功能需要先启用服务。