通俗解释EMA

一、概念

    EMA,全称是指数移动平均,是一种给予近期数据更高权重的平均方法,详细的介绍可以参考:深度学习: 指数加权平均

二、在哪见过

    深度学习中常见的Adam、RMSProp和Momentum等优化算法内部都使用了EMA,由于使用了EMA这些算法常被称为自适应优化算法,可以随着训练过程的推移,自适应的调整参数的优化方向和步长,可以参考:深度学习中的Momentum算法原理

三、提高训练稳定性

    假设有一个模型参数 \theta ,EMA在优化器层面是一种局部时间窗口的加权平均,它只能通过对过去一个小的时间窗口内的梯度做加权并更新模型参数 \theta,如下图所示的三个矩形框所示,每次反向传播之后,参数 \theta 的增量是一个加权平均后的梯度,模型参数每次都会更新(设g1,g2,g3是三次迭代通过EMA计算得到的梯度,每个箭头表示进行一次梯度更新)。

    如果进一步对g1,g2和g3进行一次EMA,并将EMA后的结果对参数 \theta 进行更新,那么参数\theta将会综合多个时间步的梯度信息,相当于进行了细粒度的平均,多个时间步的梯度综合了更加可靠的信息,模型训练的相应也会更加稳定。

四、参考

  1. 【炼丹技巧】指数移动平均(EMA)的原理及PyTorch实现
  2.   EMA(指数移动平均)及其深度学习应用
  3.   深度学习中的Momentum算法原理
  4.   深度学习: 指数加权平均

 

### 使用 jqdata 实现 EMA 计算 在 jqdata 平台中,可以通过内置的 `ta` 库或者自定义方式来实现 EMA 的计算。以下是两种常见的方法: #### 方法一:通过 ta-lib 调用 EMA 函数 如果 jqdata 支持集成 talib,则可以直接利用其提供的 `EMA` 函数完成指数移动平均线的计算。 ```python import talib as ta def calculate_ema(data, period=22): """ 利用 talib 计算 EMA 值。 参数: data: 输入数据序列(通常是收盘价) period: 移动平均周期,默认为 22 返回: ema_values: EMA 数组 """ ema_values = ta.EMA(data.values.astype(float), timeperiod=period) return ema_values ``` 此代码片段展示了如何基于输入的价格数据和指定的时间窗口长度调用 talib 的 `EMA` 函数[^1]。 #### 方法二:手动实现 EMA 公式 当无法依赖外部库时,可以按照标准公式自行实现 EMA 的逻辑。EMWA 是一种加权平均算法,在当前值的基础上赋予更高的权重给最近的数据点。 ```python def manual_ema(prices, window_size=22): """ 手动实现 EMA 计算。 参数: prices: 输入价格列表 window_size: 时间窗口大小 返回: list: 包含 EMA 结果的列表 """ multiplier = 2 / (window_size + 1) emas = [] sma_first = sum(prices[:window_size]) / window_size emas.append(sma_first) for price in prices[window_size:]: next_value = price * multiplier + emas[-1] * (1 - multiplier) emas.append(next_value) return emas ``` 上述代码实现了不借助任何第三方工具的手工版 EMA 运算过程[^2]。 另外需要注意的是,在实际应用过程中可以选择不同的 MA 类型作为参数传递到具体函数里去改变默认行为。例如 matype 变量决定了采用何种形式的均线进行处理[^3]。 综上所述,无论是选用已有的技术分析包还是自己编码构建模型都可以满足对于 jqdata 数据源上的 EMA 需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值