阶段4Python 基础进阶●●●●●

resample:频率重采样的规则与坑

我的掌握程度:
q-320精讲

先掌握这个答案

语法:df.resample('D').last()(日频取收盘/df.resample('W').last()(周频)。OHLCV的正确聚合:open→first、high→max、low→min、close→last、volume→sum——用agg一次搞定。日历坑:resample('D')生成所有日历日(含周末)→周末行全NaN;解法:先生成交易日索引再reindex(只保留交易日)。降频(分钟→日)=聚合;升频(日→分钟)=拆分/填充——升频通常用ffill但要注明假设。

先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。

从理解到使用

本阶段实战方法 · 一条能复现的数据流水线

把接口返回的数据变成可用于因子研究的面板时,先处理时点、主键与单位。

  1. 建立数据字典:字段、单位、时区、交易日历、数据源、抓取时间、原始价与复权因子。
  2. 用(date, code)查重,区分停牌、未上市、窗口不足和真实缺失;不要用向后填充把未来值带回过去。
  3. 保存原始快照与清洗日志,固定随机种子和环境版本;接口字段变化时先核对官方文档。

使用边界

  • 报告期不等于公告可用日,盘后公告通常不能用于当天收盘前决策。
  • API输出名为“动态市盈率”时不能直接改名TTM;浏览器练习不支持任意原生库或行情抓取接口。

打开术语词典,随时查阅基础概念。

背景 · 从一个困惑说起
你有分钟线想变日线、有日线想变周线——resample一行搞定。但它有两个坑:①生成的是日历时间而不是交易日(周末会有空行);②聚合方式要正确选择(open用first、close用last、volume用sum——不能全用mean)。
由此产生的问题
resample的基本语法与聚合选择?日历vs交易日的问题与解法(用交易日历reindex)?降频和升频的区别?
核心概念
语法:df.resample('D').last()(日频取收盘/df.resample('W').last()(周频)。OHLCV的正确聚合:open→first、high→max、low→min、close→last、volume→sum——用agg一次搞定。日历坑:resample('D')生成所有日历日(含周末)→周末行全NaN;解法:先生成交易日索引再reindex(只保留交易日)。降频(分钟→日)=聚合;升频(日→分钟)=拆分/填充——升频通常用ffill但要注明假设。
为什么需要它
①频率转换是因子研究的基础操作:分钟线造日频因子(q-420高频低频化)需要它;②聚合规则的金融含义:high用max而不是mean(高点是极值不是平均)——聚合错了因子含义全变;③日历坑是新手最常见的「莫名多出空白行」来源——理解resample的本质是「按日历时间分组」而非「按交易日分组」。
实际应用场景
标准代码:df.resample('D').agg({'open':'first','high':'max','low':'min','close':'last','volume':'sum'})——然后reindex到交易日历去掉周末。
与之前知识的联系
q-319(datetime索引)是resample的前置条件;q-068(交易日历)是解法;分钟转日频是q-420(高频低频化)的第一步。
⚠ 常见误解
  • resample('D')只生成交易日:不——它生成所有日历日(周一到周日)→周末NaN行;要删掉或reindex到交易日
  • 所有列都用mean聚合:OHLCV各有正确聚合(first/max/min/last/sum)——mean会把最高价平均掉
  • resample=rolling:完全不同——resample改变频率(降维/升维);rolling在原频率上滑窗统计

🤖 AI导师

导师会先检查你的前置知识(datetime索引),再用案例、公式和代码帮助理解。此功能需要先启用服务。