pct_change:一行收益率的正确打开方式
先掌握这个答案
标准用法:df.groupby('code')['close'].pct_change()——先分组再算(否则A股票第一天会拿B股票的昨天算收益!)。三坑防护:①跨组污染→必须groupby;②停牌缺口→pct_change(1)算的是"相邻两行"——停牌3天后的恢复,收益是3日累计(要"每日收益率"需fill_method=None并处理NaN,或明确接受累计口径);③除权跳空→必须用复权价(q-014/358)。动词家族:shift(1)=取昨天(分子分母自己拼)、diff(1)=差值(价格变化量)、pct_change(1)=shift版收益率=(x−shift)/shift。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
先核对现金流与期限
没有中途出入金时才可直接用期末/期初计算持有期收益;分红、费用要避免漏计或重复计入。有出入金时区分时间加权与资金加权。复合年化使用净值比的幂,算术均值年化用于不同统计目的。
本阶段实战方法 · 一条能复现的数据流水线
把接口返回的数据变成可用于因子研究的面板时,先处理时点、主键与单位。
- 建立数据字典:字段、单位、时区、交易日历、数据源、抓取时间、原始价与复权因子。
- 用(date, code)查重,区分停牌、未上市、窗口不足和真实缺失;不要用向后填充把未来值带回过去。
- 保存原始快照与清洗日志,固定随机种子和环境版本;接口字段变化时先核对官方文档。
使用边界
- 报告期不等于公告可用日,盘后公告通常不能用于当天收盘前决策。
- API输出名为“动态市盈率”时不能直接改名TTM;浏览器练习不支持任意原生库或行情抓取接口。
- pct_change自动按天:它按"行"不按"天"——停牌、拼接、乱序都会让相邻行隔了任意远;先sort再算,缺口显式处理
- 首日NaN随手drop:drop会破坏面板结构(该股票从此缺一行)——fillna(0)或保留NaN由下游决定
- 用原始价算就行:除权日的-50%假收益会污染一切统计——复权价是前提不是选项(阶段1 q-013的血泪)
🛠 本题实践任务
为你的面板写标准收益函数calc_return(df):排序→分组pct_change→首日处理,并注入一次"停牌场景"(删掉某股几行)验证它的行为是否符合你的预期口径。
💡 提示(先自己想5分钟再看)
fill_method=None让缺口产生NaN而非跨缺口计算——新版pandas的推荐显式写法。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
🤖 AI导师
导师会先检查你的前置知识(收益率公式、groupby),再用案例、公式和代码帮助理解。此功能需要先启用服务。