功能说明

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(...)

📦 参数详解

参数类型默认值说明
comfloatNone中心矩(center of mass)。alpha = 1 / (1 + com)
spanfloatNone跨度(span)。alpha = 2 / (span + 1)
halflifefloat / strNone半衰期。alpha = 1 - exp(-ln(2) / halflife)。也支持带时间单位(如 '365.25d')
alphafloatNone直接的平滑因子,范围 0 < alpha ≤ 1
adjustboolTrue为 True 时使用调整权重(考虑早期数据衰减),为 False 时使用递归方法
ignore_naboolFalse为 True 时忽略缺失值再计算权重;为 False 时缺失值导致权重归零
axisint / str0计算轴方向
min_periodsint0最少非缺失值数量,不足则结果为 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=True vs adjust=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()

🔗 相关链接