EMA(指数移动平均线)

EMA(Exponential Moving Average) 指数移动平均值是以指数式递减加权的移动平均,它是一种趋势指标,要了解均价趋势快慢的时候,用 EMA 更稳定。

EMA 的计算方法是一个递归公式。
EMA= 平滑系数 * 当前价格 +(1- 平滑系数)*EMA(N-1)。
N 表示 ema 的周期,有短期、中期、长期。

平滑系数 =2/(N+1)
在没有昨日 EMA 的情况下,该日的 EMA 用当日的收盘价代替,一般用第一天的收盘价为 EMA 的初始值

显然时间越靠近当今时刻,即 N 越小,它的权重越大,说明 EMA 函数对近期的价格加强了权重比,比 MA 更能及时反映近期价格波动情况。

以代码 600000 的股票数据为例,计算 5 日 EMA 值。


A
1 600000
2 2024-01-01
3 2024-12-31
4 =call("adjustprice.splx", "", call("loadkday.splx", A1, A2,A3) )
5 5
6 =k=2/(A5+1)
7 =A4.new(code,tdate,if(#>1,k*close+(1-k)*ema[-1],close):ema)

A1-A4 读取股票数据

A5 设置移动平均周期 N

A6 计算平滑系数 k

A7 带入递归公式计算 ema

..

也可以封装成函数,使用时直接调用。

函数代码:


A B
1 func ema(data,field,N) >k=2/(N+1)
2
=data.new(code,tdate,if(#>1,k*${field}+(1-k)*ema_${N}[-1],${field}):ema_${N})

此代码比较短,和前面章节的 MA 一样,可以用 func 的形式保存在 index.splx 中。

参数:

data 序表,某支股票的日线数据
field 字符串,字段名如 "close"
N 数字,移动平均周期

返回数据集结构:

code 股票代码
tdate 日期
ema_N N 日 EMA

例如,调用脚本计算浦发银行 2024 年收盘价的 5 日 EMA,


A B
4 =call@f("index.splx") 登记脚本中的函数
5 计算出源数据
6 =ema (A5,"close",5) 调用函数

运行效果:

..