功能说明
ewm()(Exponential Weighted Moving,指数加权移动)为每个数据点分配指数衰减的权重,越近的数据权重越大,越远的数据权重越小。所有历史数据都参与计算,但权重随时间指数递减。DataFrame.ewm(com=None, span=None, halflife=None, alpha=None, adjust=True, ignore_na=False, axis=0, min_periods=0) Series.ewm(...)
📦 参数详解
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
com | float | None | 中心矩(center of mass)。alpha = 1 / (1 + com) |
span | float | None | 跨度(span)。alpha = 2 / (span + 1) |
halflife | float / str | None | 半衰期。alpha = 1 - exp(-ln(2) / halflife)。也支持带时间单位(如 '365.25d') |
alpha | float | None | 直接的平滑因子,范围 0 < alpha ≤ 1 |
adjust | bool | True | 为 True 时使用调整权重(考虑早期数据衰减),为 False 时使用递归方法 |
ignore_na | bool | False | 为 True 时忽略缺失值再计算权重;为 False 时缺失值导致权重归零 |
axis | int / str | 0 | 计算轴方向 |
min_periods | int | 0 | 最少非缺失值数量,不足则结果为 NaN |
参数互斥
com、span、halflife、alpha四者必须恰好指定一个,不能同时指定多个。
⚙️ 权重公式
数学原理
默认
adjust=True时使用加权平均:
其中权重 ,即历史越久远的点权重越小。
当
adjust=False时使用递归公式:
📊 可用方法
方法清单
方法 说明 mean()指数加权均值(EWMA,最常用) sum()指数加权求和 std()指数加权标准差(ddof=1) var()指数加权方差 corr()两个序列的指数加权相关系数 cov()两个序列的指数加权协方差
⚙️ 基本用法
指数加权移动平均(EWMA)
import pandas as pd import numpy as np s = pd.Series(np.random.randn(100).cumsum()) # 使用 span(最常用,类似 N 日移动平均) s.ewm(span=20).mean() # 使用 com s.ewm(com=10).mean() # 使用 halflife s.ewm(halflife=10).mean() # 直接指定 alpha(例如 alpha=0.3 表示新数据权重 30%) s.ewm(alpha=0.3).mean()
halflife的时间单位形式# 当数据索引为 DatetimeIndex 时,halflife 可带时间单位 ts = pd.Series(np.random.randn(50), index=pd.date_range('2024-01-01', periods=50, freq='D')) # halflife 为 10 天 ts.ewm(halflife='10 days').mean() # 或等价写法 ts.ewm(halflife=pd.Timedelta(days=10)).mean()
指数加权方差与标准差
returns = pd.Series(np.random.randn(100) * 0.01) # 指数加权波动率(标准差) vol = returns.ewm(span=30).std() # 年化波动率 annual_vol = vol * np.sqrt(252)
指数加权相关系数
df = pd.DataFrame({ 'A': np.random.randn(100).cumsum(), 'B': np.random.randn(100).cumsum() }) # 两列之间的滚动指数加权相关系数 df['A'].ewm(span=20).corr(df['B'])
⚙️ adjust 参数说明
adjust=Truevsadjust=False# adjust=True(默认):每个点使用加权平均,早期数据的权重被"调整",更精确但较慢 s.ewm(alpha=0.3, adjust=True).mean() # adjust=False:使用递归公式(EMA),与大多数金融软件的 EMA 一致 s.ewm(alpha=0.3, adjust=False).mean() # 等价于:y_t = 0.3 * x_t + 0.7 * y_{t-1}
什么时候用
adjust=False?当需要与常用技术指标(如股票软件的 EMA)保持完全一致时,使用
adjust=False。
⚙️ 缺失值的处理
ignore_na示例s = pd.Series([1.0, np.nan, 3.0, 4.0]) # ignore_na=False(默认):NaN 会使权重重置,后续点的权重不累积 s.ewm(alpha=0.5, ignore_na=False).mean() # ignore_na=True:跳过 NaN 继续累积权重 s.ewm(alpha=0.5, ignore_na=True).mean()