EXPMA指标说明
EXPMA为因移动平均线被视为落后指标的缺失而发展出来的,为解决一旦价格已脱离均线差值扩大,而平均线未能立即反应,EXPMA可以减少类似缺点。
EXPMA译为指数平均线,修正移动平均线较股价落后的缺点,本指标随股价波动反应快速,用法与移动平均线相同。
指数加权平均EWA
指数加权平均(Exponentially Weighted Average, EWA),是一种统计学方法,用于平滑时间序列数据。它通过给予最近的数据点更高的权重,并逐渐减少较早数据点的权重,来计算平均值。这种方法在处理和分析时间序列数据时特别有用,因为它能够更好地反映最新的趋势。
EXPMA,全称为指数移动平均(Exponential Moving Average),实际上与EWA(指数加权平均)指的是同一个概念。在不同的上下文中,可能会使用不同的术语,但它们描述的是同一种方法。
EWA 的核心思想
- 平滑数据:通过计算一系列观测值的加权平均来减少短期波动的影响,从而更容易识别出长期趋势。
- 权重分配:对较新的数据给予较高的权重,而对较旧的数据给予逐渐减少的权重。这种权重的分配是指数级下降的,因此得名“指数”移动平均或加权平均。
EWA计算公式
假设有一个时间序列数据
x
t
x_t
xt,其中
t
t
t表示时间步长。指数加权平均
v
t
v_t
vt 在时间
t
t
t的值可以按照如下递归公式计算:
v
t
=
β
v
t
−
1
+
(
1
−
β
)
x
t
v_t = \beta v_{t-1} + (1-\beta)x_t
vt=βvt−1+(1−β)xt
这里:
-
v t v_t vt是时间 t t t的指数加权平均值。
-
x t x_t xt是时间 t t t的观测值。
-
β \beta β 是一个介于0和1之间的参数,表示衰减率。它的值决定了历史数据被赋予的权重大小。较小的 β \beta β 值意味着对过去观察结果赋予较低的权重,使得模型更关注近期的数据;较大的 β \beta β 值则会使得模型考虑更多的历史数据。
EWA计算示例
通过一个具体的例子来说明指数加权平均(EWA)是如何计算的。
假设我们有一个时间序列数据集,表示某商品连续5天的价格,分别为:
- x 1 = 10 x_1 = 10 x1=10
- x 2 = 12 x_2 = 12 x2=12
- x 3 = 11 x_3 = 11 x3=11
- x 4 = 13 x_4 = 13 x4=13
- x 5 = 14 x_5 = 14 x5=14
我们选择衰减率 β = 0.9 \beta = 0.9 β=0.9 来计算指数加权平均值。
首先,初始化 v 1 = x 1 = 10 v_1 = x_1 = 10 v1=x1=10。
然后,我们可以依次计算每一天的指数加权平均值:
-
对于 t = 2 t=2 t=2:
v 2 = 0.9 × 10 + ( 1 − 0.9 ) × 12 = 9 + 1.2 = 10.2 v_2 = 0.9 \times 10 + (1-0.9) \times 12 = 9 + 1.2 = 10.2 v2=0.9×10+(1−0.9)×12=9+1.2=10.2 -
对于 t = 3 t=3 t=3: v 3 = 0.9 × 10.2 + ( 1 − 0.9 ) × 11 = 9.18 + 1.1 = 10.28 v_3 = 0.9 \times 10.2 + (1-0.9) \times 11 = 9.18 + 1.1 = 10.28 v3=0.9×10.2+(1−0.9)×11=9.18+1.1=10.28
-
对于 t = 4 t=4 t=4:
v 4 = 0.9 × 10.28 + ( 1 − 0.9 ) × 13 = 9.252 + 1.3 = 10.552 v_4 = 0.9 \times 10.28 + (1-0.9) \times 13 = 9.252 + 1.3 = 10.552 v4=0.9×10.28+(1−0.9)×13=9.252+1.3=10.552 -
对于 t = 5 t=5 t=5:
v 5 = 0.9 × 10.552 + ( 1 − 0.9 ) × 14 = 9.4968 + 1.4 = 10.8968 v_5 = 0.9 \times 10.552 + (1-0.9) \times 14 = 9.4968 + 1.4 = 10.8968 v5=0.9×10.552+(1−0.9)×14=9.4968+1.4=10.8968
因此,经过计算后,第5天的指数加权平均价格为约 10.9。这表明尽管最近一天的价格是 14,但因为指数加权平均考虑了过去几天的数据,并且给予了最近的数据更高的权重,所以最终的平均值比单纯取最近一天的价格要低。
关键点:有效窗口大小⭐
有效窗口大小 ≈ 1 1 − β 有效窗口大小 ≈ \frac{1}{1 - \beta} 有效窗口大小≈1−β1
这是一个非常重要的概念,它帮助我们理解指数加权平均(EWA)中参数 β \beta β 的实际含义。
什么是“有效窗口大小”?
在传统的简单移动平均(Simple Moving Average, SMA)中,比如取最近 10 天的平均值,我们明确地使用了过去 10 个数据点,每个数据点权重相同。这就是一个固定窗口大小为 10 的平均。
但在指数加权平均中,理论上来说,所有历史数据都会对当前的平均值产生影响,只不过越早的数据权重越小。因此,我们会说:
“虽然所有的历史数据都有影响,但大部分影响集中在最近的几个时间点。”
这个“集中在最近的时间范围”就被称为有效窗口大小。
如何计算有效窗口大小?
我们通过下面这个公式来估算指数加权平均的有效窗口大小:
有效窗口大小 ≈ 1 1 − β \text{有效窗口大小} \approx \frac{1}{1 - \beta} 有效窗口大小≈1−β1
示例:
β 值 =0.9
有效窗口大小
≈
1
1
−
0.9
=
10
\text{有效窗口大小} \approx\frac{1}{1 - 0.9} = 10
有效窗口大小≈1−0.91=10
β 值 =0.98
有效窗口大小
≈
1
1
−
0.98
=
50
\text{有效窗口大小} \approx\frac{1}{1 - 0.98} = 50
有效窗口大小≈1−0.981=50
β 值 =0.5
有效窗口大小
≈
1
1
−
0.5
=
2
\text{有效窗口大小} \approx\frac{1}{1 - 0.5} = 2
有效窗口大小≈1−0.51=2
这说明:
- 当 β = 0.9 \beta = 0.9 β=0.9 时,大约前 10个时间步的数据对当前的 EWA 值有显著影响。
- 当 β = 0.98 \beta = 0.98 β=0.98 时,大约前 50个时间步的数据仍有影响,表示更“平滑”,但对变化反应慢;
- 当 β = 0.5 \beta = 0.5 β=0.5 时,只关注最近 2个时间步,波动性更大,响应更快。
更直观的理解
我们可以把 β \beta β 理解为:“保留多少上一时刻的信息”。
假设现在有一个新的观测值 x t x_t xt,那么更新后的 EWA 是:
v t = β v t − 1 + ( 1 − β ) x t v_t = \beta v_{t-1} + (1 - \beta)x_t vt=βvt−1+(1−β)xt
也就是说:
- β \beta β 越大 → 越依赖之前的值 v t − 1 v_{t-1} vt−1,相当于看更多历史数据;
- β \beta β 越小 → 更倾向于相信最新的数据 x t x_t xt,相当于只看最近很少几个数据点。
所以:
设置 β = 0.9 \beta = 0.9 β=0.9 就相当于你在做一个“近似10天的加权移动平均”。
总结
概念 | 含义 |
---|---|
β \beta β 值 | 决定旧数据保留的比例 |
1 − β 1 - \beta 1−β | 新数据所占权重 |
有效窗口大小 | 近似等于 1 1 − β \frac{1}{1 - \beta} 1−β1,表示大约有多少个历史数据对当前 EWA 有显著影响 |
实际意义 | 帮助我们选择合适的 β \beta β 来模拟特定长度的移动平均,便于调参和理解模型行为 |
股票市场实际意义⭐
- 趋势跟随:EXPMA可以帮助识别出股票价格的趋势方向。当短期EXPMA位于长期EXPMA之上时,通常被视为上升趋势;反之,若短期EXPMA位于长期EXPMA之下,则可能是下降趋势。
- 买卖信号:
- 买入信号:当短期EXPMA向上穿越长期EXPMA时,这通常被认为是一个买入信号,表明股票可能会进入一个上升趋势。
- 卖出信号:相反地,如果短期EXPMA向下穿越长期EXPMA,这可能预示着股价即将下跌,是一个卖出信号。
- 支撑和阻力:在多头市场中,短期EXPMA可以作为股价的动态支撑线;而在空头市场中,它可以作为股价的动态阻力线。
- 波动性判断:通过观察EXPMA曲线的变化速率,可以对市场的波动性进行一定程度的评估。快速变化的EXPMA曲线可能意味着较高的市场波动性。
跌,是一个卖出信号。 - 支撑和阻力:在多头市场中,短期EXPMA可以作为股价的动态支撑线;而在空头市场中,它可以作为股价的动态阻力线。
- 波动性判断:通过观察EXPMA曲线的变化速率,可以对市场的波动性进行一定程度的评估。快速变化的EXPMA曲线可能意味着较高的市场波动性。
计算中兴通讯5日EXPMA
使用akshare获取中兴通讯的股票数据,然后计算5日EXPMA,并用matplotlib绘图。
import akshare as ak
import pandas as pd
import matplotlib.pyplot as plt
# 获取股票数据(调整股票代码和日期)
stock_code = "000063" # 正确的股票代码格式
start_date = "20230430" # 调整为一年前的日期
stock_data = ak.stock_zh_a_hist(symbol=stock_code, start_date=start_date)
# 检查数据是否获取成功
if stock_data.empty:
raise ValueError("未获取到数据,请检查股票代码或日期参数。")
# 数据预处理
stock_data['日期'] = pd.to_datetime(stock_data['日期'])
stock_data = stock_data.sort_values(by='日期', ascending=True)
# 计算5日EMA
stock_data['expma_5'] = stock_data['收盘'].ewm(span=5).mean()
# 数据可视化
plt.figure(figsize=(16, 8))
plt.plot(stock_data['日期'], stock_data['收盘'], label='收盘价', color='blue')
plt.plot(stock_data['日期'], stock_data['expma_5'], label='5日指数移动平均线', color='red')
plt.title('中兴通讯(000063) 股价与5日EMA (2023-2024)')
plt.xlabel('日期')
plt.ylabel('股价(元)')
plt.legend()
plt.grid(True)
plt.show()