shift:防前视的第一卫士(与它的一族兄弟)
先掌握这个答案
语义口诀:shift(1)=「下移」=今天拿到的是昨天的值(向过去取);shift(-1)=「上移」=今天拿到明天的值(向未来取,危险!只允许出现在"标签"端)。标准配对:因子factor_t(用≤t的数据)配收益ret_{t+1}=close.shift(-1)/close-1——即label列用负shift制造,训练矩阵里因子列一律非负shift。血缘:diff(1)=x−x.shift(1);pct_change(1)=(x−shift)/shift——它们都是shift的导数家族,方向语义完全一致。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
以信息可得时间对齐
财报报告期结束日不是市场获知信息的时间。对每个特征记录available_at,并确认不晚于决策时点;盘后数据通常不能用于同日收盘前下单。保留历史修订与退市样本,检查删尾重跑是否稳定。
每一笔收益都要有可执行时间线
打印数据截止时间、信号时间、订单时间、成交时间和持仓收益区间。收盘信号不能乘当天完整收益;次日开盘成交也不能无条件拿到整个close-to-close收益。用原始价格判断可成交性,并纳入停牌与涨跌停。
本阶段实战方法 · 一条能复现的数据流水线
把接口返回的数据变成可用于因子研究的面板时,先处理时点、主键与单位。
- 建立数据字典:字段、单位、时区、交易日历、数据源、抓取时间、原始价与复权因子。
- 用(date, code)查重,区分停牌、未上市、窗口不足和真实缺失;不要用向后填充把未来值带回过去。
- 保存原始快照与清洗日志,固定随机种子和环境版本;接口字段变化时先核对官方文档。
使用边界
- 报告期不等于公告可用日,盘后公告通常不能用于当天收盘前决策。
- API输出名为“动态市盈率”时不能直接改名TTM;浏览器练习不支持任意原生库或行情抓取接口。
- shift(1)是往前还是往后:记方向别记文字——跑一行print对照:[1,2,3].shift(1)=[NaN,1,2](今天的位置出现昨天的数)
- 负shift绝对禁止:在标签端它是唯一正确的写法(未来收益就是负shift);禁区是特征端
- shift了就一定防住前视:链式计算里中间变量错位(先rolling后shift vs 先shift后rolling)仍可能泄漏——截断检验兜底(q-357)
🛠 本题实践任务
为你的因子构造标准的factor/label两列(一正一负shift),然后故意交换shift符号跑一次IC——记录"偷来的IC"有多少,加深对方向语义的肌肉记忆。
💡 提示(先自己想5分钟再看)
交换后IC通常翻2-3倍——那正是前视偏差的典型量级,见一次就忘不了。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
🤖 AI导师
导师会先检查你的前置知识(pct_change、前视偏差概念),再用案例、公式和代码帮助理解。此功能需要先启用服务。