rolling:时序因子的"移动窗口"引擎
先掌握这个答案
标准用法:s.rolling(20).mean()/std()/sum()——窗口默认「含当日」向过去看20格(防前视安全);若要"截至昨日"先shift(1)再rolling。min_periods:窗口不满时默认产NaN——设min_periods=10允许"至少10天"的半窗结果(数据利用率与稳定性的权衡)。组内滚动:df.groupby('code')['close'].rolling(20).mean()——输出会多一层组索引(需要reset或droplevel);更顺手的等价写法是transform+lambda或直接df.groupby('code')['x'].transform(lambda s: s.rolling(20).mean())。expanding:窗口从首个观测一直扩大到当前——"历史所有"而非"最近N"(历史分位数因子用它)。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
本阶段实战方法 · 一条能复现的数据流水线
把接口返回的数据变成可用于因子研究的面板时,先处理时点、主键与单位。
- 建立数据字典:字段、单位、时区、交易日历、数据源、抓取时间、原始价与复权因子。
- 用(date, code)查重,区分停牌、未上市、窗口不足和真实缺失;不要用向后填充把未来值带回过去。
- 保存原始快照与清洗日志,固定随机种子和环境版本;接口字段变化时先核对官方文档。
使用边界
- 报告期不等于公告可用日,盘后公告通常不能用于当天收盘前决策。
- API输出名为“动态市盈率”时不能直接改名TTM;浏览器练习不支持任意原生库或行情抓取接口。
- rolling自动分组:它不知道股票边界——面板必须groupby后rolling,否则跨组污染
- 含当日就是前视:rolling含当日=用到今天收盘——只要配的是明日收益(标签负shift)就干净;怕混就统一"shift(1)后rolling"再无歧义
- NaN很烦就min_periods=1:半窗结果不稳定(3天的"20日波动")——min_periods至少设窗口的一半
🛠 本题实践任务
写出"截至昨日的20日换手率分位"(历史分位版:rolling rank或对turnover做rolling(60).rank)——注意shift与分组的组合顺序,并验证第t天的值不含第t天。
💡 提示(先自己想5分钟再看)
验证法:把第t天的turnover改成一个巨大值,重算后第t天的因子值应不变(因为窗口截至昨日)。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
🤖 AI导师
导师会先检查你的前置知识(shift、groupby transform),再用案例、公式和代码帮助理解。此功能需要先启用服务。