尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

gs-quant 技术指标库中的移动平均:moving_average 函数深度解析与实践指南

发布时间:2026/9/15 13:35:46

资讯中心
01
ARTICLE

gs-quant 技术指标库中的移动平均:moving_average 函数深度解析与实践指南

gs-quant 技术指标库中的移动平均:moving_average 函数深度解析与实践指南
gs-quant 技术指标库中的移动平均moving_average 函数深度解析与实践指南【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant导读本文围绕 gs-quant 开源量化工具包Python toolkit for quantitative finance中gs_quant.timeseries.technicals.moving_average这一核心技术指标函数展开完整讲解其函数签名、参数语义、底层实现原理与测试验证方式。读者阅读本文后将掌握如何在 gs-quant 中基于任意价格时间序列计算滚动移动平均理解窗口Window与 ramp 预热机制的内部工作方式并能将其与其他技术指标如 Bollinger 带、RSI、平滑移动平均组合应用于实际量化分析流程。函数概览一个函数一行声明一套完整语义在 docs/functions/gs_quant.timeseries.technicals.moving_average.rst 中该函数的文档定义极为简洁——通过 Sphinx 的.. autofunction::指令自动生成 API 文档页。这意味着函数的所有核心说明参数、公式、示例、关联函数都来自源码中的 docstring因此阅读源码即阅读文档。真实实现位于 technicals.pyplot_function def moving_average(x: pd.Series, w: Union[Window, int, str] Window(None, 0)) - pd.Series: Moving average over specified window :param x: time series of prices :param w: Window or int: size of window and ramp up to use. e.g. Window(22, 10) where 22 is the window size and 10 the ramp up value. If w is a string, it should be a relative date like 1m, 1d, etc. Window size defaults to length of series. :return: date-based time series of return ... if x.empty: return pd.Series(dtypefloat) w normalize_window(x, w) return apply_ramp(mean(x, Window(w.w, 0)), w)其中plot_function装饰器来自 helper.py其作用仅为给函数打上plot_function True标记声明该函数可被 Marquee Plot Service 作为纯函数导出。也就是说moving_average不仅可以在本地 Python 环境直接调用也具备被平台绘图服务识别的能力——这是 gs-quant 中所有技术指标函数的共同约定。从导入路径看moving_average通过 timeseries/init.py 中的from .statistics import *与from .technicals import *被统一导出因此实际使用时只需from gs_quant.timeseries import moving_average参数语义从整数到相对日期窗口的三种表达方式moving_average的参数w的类型注解为Union[Window, int, str]这是 gs-quant 技术指标库的统一窗口设计。其归一化逻辑集中在 normalize_window具体规则如下传入形式示例实际含义归一化结果整数intmoving_average(prices, 22)22 个观测点的滚动窗口Window(22, 22)即窗口与 ramp 均取 22字符串strmoving_average(prices, 1m)、2d相对日期长度tenor通过_to_offset解析为pd.DateOffset如1m→ 1 个月、2d→ 2 天、1w→ 1 周、1y→ 1 年Window对象moving_average(prices, Window(22, 10))窗口 22 个观测、ramp 预热 10 个观测原样保留内部校验合法值缺省默认moving_average(prices)全序列长度Window(len(x), 0)即在整个序列上计算单一均值需要特别留意两点实现细节字符串窗口的解析规则_to_offsethelper.py使用正则(\d)([hdwmy])匹配 tenor只接受h小时、d天、w周、m月、y年五种单位后缀其他输入会抛出MqValueError(invalid tenor ...)。Window 的默认 rampWindow构造器helper.py在r缺省时会让 ramp 自动等于窗口大小wself.r w if r is None else r。这意味着直接用整数22调用时输出序列会砍掉前 22 个观察点预热区只保留从第 22 个点开始的滚动均值而Window(22, 0)则保留从首个点开始、前 21 个点取部分观测均值的结果。此外_check_windowhelper.py负责合法性校验窗口值必须大于 0ramp 必须小于等于序列长度且不小于 0否则抛出MqValueError。计算原理滚动算术平均与三重防线数学定义moving_average计算的是指定窗口上的简单算术移动平均SMA源码 docstring 给出的公式为$$R_t \frac{\sum_{it-w1}^{t} X_i}{N}$$其中 $N$ 为每个滚动窗口内的观测数量 $w$。公式含义清晰较短窗口对价格变化更敏感但波动更大较长窗口更平滑但对近期变化的反应更滞后这是移动平均用于趋势识别的基本权衡。源码实现的三步流水线实现仅有三行核心逻辑却包含三重防御性设计if x.empty: return pd.Series(dtypefloat) # 防线一空序列直接返回空 Series w normalize_window(x, w) # 防线二统一窗口形式并做合法性校验 return apply_ramp(mean(x, Window(w.w, 0)), w) # 防线三先算滚动均值再应用 ramp 裁剪空输入保护若输入序列为空直接返回pd.Series(dtypefloat)而不是让 pandas 抛错。测试用例test_moving_averagetest_technicals.py专门验证了moving_average(pd.Series(dtypefloat), 2d)返回空序列这一行为。复用mean统计函数滚动均值部分委托给gs_quant.timeseries.statistics.meanstatistics.py其本质等价于 pandas 的Series.rolling(w).mean()。docstring 也明确注明 Equivalent tomean。ramp 裁剪apply_ramphelper.py根据w.r截断输出序列若 ramp 为整数则做位置切片x[r:]若 ramp 为pd.DateOffset则按首个索引日期加上该偏移做时间切片。注意当窗口大小超过序列长度且窗口是整数时apply_ramp会返回空 Series见_check_window之后的判断防止返回无意义的全 NaN 结果。实测验证从测试用例看精确输出仓库自带的单元测试 test_moving_average 给出了可复现的期望输出是理解函数行为的绝佳素材x pd.Series([3.0, 2.0, 3.0, 1.0, 3.0, 6.0], index[dt.date(2019, 1, 1), ..., dt.date(2019, 1, 6)]) moving_average(x) # 全序列均值3.0, 2.5, 8/3, 2.25, 2.4, 3.0滚动累计均值 moving_average(x, Window(1, 0)) # 窗口1原样返回 [3, 2, 3, 1, 3, 6] moving_average(x, Window(2, 0)) # 窗口23.0, 2.5, 2.5, 2.0, 2.0, 4.5 moving_average(x, 2d) # 两天窗口 2 天 ramp2.5, 2, 2, 4.5仅剩 4 个点对照 pandas 原生实现moving_average(x, Window(2, 0))与x.rolling(2).mean()的输出完全一致首点为 NaN 的差异由 ramp 机制处理这验证了 gs-quant 的moving_average正是标准滚动算术均值的封装。测试中使用pandas.testing.assert_series_equal做严格断言保证指数、数值、dtype 完全对齐。实战应用与真实价格序列和其他指标联动基础用法按 generate_series 生成 100 个观测的随机价格序列基于标准正态随机变量递推 $X_t (1R)X_{t-1}$初始值 100即可快速体验from gs_quant.timeseries import generate_series, moving_average, Window prices generate_series(100) # 从今天开始的 100 个观测 sma22 moving_average(prices, 22) # 22 日简单移动平均自动附带 22 天 ramp sma22_noramp moving_average(prices, Window(22, 0)) # 不裁剪预热区 sma_1m moving_average(prices, 1m) # 一个月窗口按相对日期解析若手头有真实资产数据可结合gs_quant的证券市场模块获取价格后再计算moving_average的输入约定是date-based time series即索引为日期的pd.Series。作为其他指标的基石moving_average在 gs-quant 技术指标库中处于基础构件地位多个高阶指标直接或间接复用它见 technicals.pyBollinger 带bollinger_bandsavg moving_average(x, w)再配合滚动标准差std(x, w)构造上轨 $u_t \bar{X_t} k\sigma_t$ 与下轨 $l_t \bar{X_t} - k\sigma_t$默认 $k2$。RSIrelative_strength_index内部先对涨跌幅做增益/损失拆分再调用smoothed_moving_average计算平均增益与平均损失最终得到 0-100 的动量指标。平滑移动平均 SMMAsmoothed_moving_average递推公式 $P_{MM,today} \frac{(N-1)P_{MM,yesterday} P_{today}}{N}$其首个值正是以mean即移动平均初始化。EMA / MACDexponential_moving_average、macd虽然 EMA 走Series.ewm路径而非复用moving_average但 MACD 的语义仍是短 EMA 减长 EMA 再平滑与移动平均家族同源。这些指标在See also中相互引用共同构成一套完整的技术分析工具箱适用场景包括趋势跟踪、动量判断、波动率区间刻画等。常见错误与边界行为速查场景行为传入空序列返回空pd.Series(dtypefloat)不抛异常整数窗口 ≤ 0抛出MqValueError(Window value must be greater than zero.)ramp 大于序列长度或为负抛出MqValueError(Ramp value must be less than the length of the series and greater than zero.)非法 tenor 字符串如3q_to_offset抛出MqValueError(invalid tenor 3q)整数窗口大于序列长度返回空pd.Series由apply_ramp短路处理字符串窗口DateOffset大于序列长度不受限制按实际时间范围计算normalize_window与apply_ramp对 DateOffset 不做长度限制小结gs_quant.timeseries.technicals.moving_average虽然只是一行 autofunction 文档背后的简单函数但它集中体现了 gs-quant 技术指标库的设计哲学统一的Window抽象整数 / tenor 字符串 / Window 对象三种表达、严格的参数校验、对空输入与异常窗口的防御性处理以及通过plot_function向绘图服务导出能力的平台化设计。理解它也就理解了smoothed_moving_average、bollinger_bands、relative_strength_index等整个技术指标家族。建议读者在本地环境中结合 test_technicals.py 的测试用例亲自运行一遍以获得对 ramp、窗口归一化和输出精度的直观认识。【免费下载链接】gs-quantPython toolkit for quantitative finance项目地址: https://gitcode.com/GitHub_Trending/gs/gs-quant创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。