如何在Python中计算移动平均线以及自定义滑动窗口统计量?

老静姑娘_2705

老静姑娘_2705

2026-08-23

283人浏览

原创

最稳妥方式是直接调用 .rolling(window).mean(),它自动处理 nan、边界对齐及时序索引;自定义统计须用 .apply() 并注意输入为 series、返回标量、避免闭包与全局状态,复杂逻辑可结合 numba 加速。

如何在python中计算移动平均线以及自定义滑动窗口统计量?

用 pandas.Series.rolling() 计算移动平均线最稳妥

直接调用 .rolling(window).mean() 是最常用也最不易出错的方式,它自动处理 NaN 填充、边界对齐和时序索引对齐问题。别手写循环或用 numpy.convolve —— 容易漏掉首尾截断、权重不均、索引错位。

  • window 支持整数(如 20)、时间字符串(如 '5D',需索引为 DatetimeIndex)或 pd.offsets 对象
  • 默认 min_periods=1,但计算 20 日均线时建议显式设为 min_periods=20,避免前 19 行返回非空值干扰判断
  • 若原始数据含缺失值,.rolling() 默认跳过 NaN 参与计算;想强制要求窗口内无 NaN,得先 dropna() 或用 min_periods 控制有效值下限

自定义滑动窗口统计量必须用 rolling().apply(),但要注意函数签名和 axis

.apply() 接收一个函数,该函数输入是当前窗口的 Series(不是 DataFrame),返回标量。常见错误是传入带 axis 参数的 numpy 函数(如 np.std(x, axis=0)),其实没必要——窗口内就是一维。

  • 自定义函数必须返回单个 Python 标量(float、int 等),不能返回 np.ndarray 或 Series
  • 避免在 .apply() 里做重操作(如拟合模型),性能会断崖下跌;可先用 .rolling().agg() 调用内置函数加速,再补足逻辑
  • 若需访问窗口外数据(比如计算相对前一日变化率),.apply() 不适用,应改用 shift() 配合布尔索引或 iloc 手动切片

rolling().apply() 中使用 lambda 易踩坑:闭包变量未绑定、无法序列化

写成 df['ma'].rolling(10).apply(lambda x: my_func(x, param=0.5)) 看似简洁,但 param 值在定义时捕获,后续修改变量不会生效;更重要的是,这类 lambda 无法被 pickle,导致多进程(如 dask 或 joblib)报错 Can't pickle local object。

python-parallelization
python-parallelization

将顺序 Python 代码转换为并行/并发实现,用于在需要并行化 Python 代码、提升性能时使用。

下载
  • 推荐封装为具名函数:def weighted_std(x, alpha=0.5): return np.std(x) * alpha,再调用 .apply(weighted_std, alpha=0.5)
  • 参数必须通过 **kwargs 传入,不能靠外部作用域变量;且所有参数类型需为基本类型(int/float/str),不可传 list 或自定义类实例
  • 若函数内部依赖全局状态(如计数器、缓存),.apply() 每次调用都是独立上下文,状态不会累积

高频场景下 numba.jit 加速 rolling().apply() 有硬限制

当窗口统计逻辑复杂且数据量大(>100 万行),纯 Python .apply() 会成为瓶颈。用 @numba.jit(nopython=True) 能提速 5–50 倍,但前提是函数只用支持的 numpy/Python 子集。

  • numba 不支持 pandas 对象,输入 x 必须是 np.ndarray;需提前用 .to_numpy() 转换,且确保无 NaN(numba 对 np.nan 处理不稳定)
  • 不能在 jit 函数里调用 len()、print()、isinstance() 或任何非 nopython 模式函数
  • 首次调用会编译,后续才快;若窗口大小动态变化(如 window=lambda i: i//100 + 5),jit 失效,得回退到普通模式

实际业务中,移动平均线本身很少需要定制逻辑,真正卡点的是带条件的滑动统计(比如“过去 10 笔交易中价格高于均值的次数”)——这种必须手动构造布尔窗口并用 .sum(),而不是依赖 .apply()。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1731

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4404

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1709

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

25777

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3127

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3147

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1183

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2443

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习