rolling vs expanding:固定窗口与累计窗口
我的掌握程度:
先掌握这个答案
rolling(N):固定长度N——过去N天的统计。expanding(min_periods=N):从开始到现在的全部——历史分位数、累计收益。典型用途:rolling→动量/波动/换手均值(时效性强);expanding→历史分位(PE处于历史什么位置)、累计最大值/最小值。min_periods:expanding(min_periods=252)要求至少252天才出值——之前NaN——防止小样本统计误导。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
本阶段实战方法 · 一条能复现的数据流水线
把接口返回的数据变成可用于因子研究的面板时,先处理时点、主键与单位。
- 建立数据字典:字段、单位、时区、交易日历、数据源、抓取时间、原始价与复权因子。
- 用(date, code)查重,区分停牌、未上市、窗口不足和真实缺失;不要用向后填充把未来值带回过去。
- 保存原始快照与清洗日志,固定随机种子和环境版本;接口字段变化时先核对官方文档。
使用边界
- 报告期不等于公告可用日,盘后公告通常不能用于当天收盘前决策。
- API输出名为“动态市盈率”时不能直接改名TTM;浏览器练习不支持任意原生库或行情抓取接口。
不懂的术语:动量(Momentum)
背景 · 从一个困惑说起
rolling(20)只看最近20天——像滑动的放大镜;expanding()看从第一行到现在的全部历史——像全景相机。一个关注「最近怎么样」、一个关注「有史以来怎么样」。
由此产生的问题
两者的语义差异与典型用途?expanding的min_periods坑?什么时候用哪个?
核心概念
rolling(N):固定长度N——过去N天的统计。expanding(min_periods=N):从开始到现在的全部——历史分位数、累计收益。典型用途:rolling→动量/波动/换手均值(时效性强);expanding→历史分位(PE处于历史什么位置)、累计最大值/最小值。min_periods:expanding(min_periods=252)要求至少252天才出值——之前NaN——防止小样本统计误导。
为什么需要它
①时间尺度的意识:rolling=短期记忆、expanding=长期记忆——因子设计时选哪个=你对信号时效性的判断;②历史分位是expanding的经典应用:「PE处于历史30%分位」=expanding.rank(pct=True)——这是估值择时的标准工具;③rolling在面板必须groupby(code)先(q-314的老规矩)。
实际应用场景
一日一行命令:rolling(20).mean()=20日均值;expanding(252).rank(pct=True)当天PE在全历史中的分位。
与之前知识的联系
q-314(rolling深入)的兄弟——两个窗口类型;expanding的历史分位与q-237(分位数)在此应用。
⚠ 常见误解
- expanding=rolling(全部天数):不完全等价——expanding是逐日扩大的(每天都多加一天)——不是固定「全部」;首日只有1个数据点
- expanding没有min_periods需求:默认min_periods=1——首日就出值(样本=1的统计毫无意义)——必须手动设置
- rolling和expanding可以互换:rolling看近期(半衰期短)、expanding看全史(无衰减)——因子含义完全不同
🛠 本题实践任务
对你面板中某只股票的PE/收盘价:同时算rolling(60)均值和expanding均值——画两条线对比。expanding更平滑还是更「粘滞」?为什么?
💡 提示(先自己想5分钟再看)
expanding不断纳入新数据但不删除旧数据——所以变化越来越慢(「粘滞」);rolling只看近60天——反应快。
✅ 验收标准
两条曲线的对照+一句差异解释。窗口选择从拍脑袋变成有意识的设计。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
Python · 独立工作线程 · 执行限时10秒
🤖 AI导师
导师会先检查你的前置知识(滚动窗口),再用案例、公式和代码帮助理解。此功能需要先启用服务。