跳转至

股市中常见的MA, EMA, DMA, SMA等算法代码

EMA, MA, SMA公式 python实现以及解释

MA 平均值

"""
MA 这个比较简单, 就是算出平均值
MA(X, N) 求X的N日移动平均值
"""
import math


def ma(x, n):
    return sum(x[-n:]) / n

EMA平滑移动平均

"""
EMA 指数平滑移动平均值
指数, 不是大盘指数,只是一种算法
求X的N日指数平滑移动平均,它真正的指标表达是:当日指数平均值=平滑系数*(当日指数值-昨日指数平均值)+昨日指数平均值;平滑系数=2/(周期单位+1);由以上指标推导开,得到:
EMA(C,N)=2*C/(N+1)+(N-1)/(N+1)*昨天的指数收盘平均值;
算法是:若Y=EMA(X,N),则Y=[2*X+(N-1)*Y’]/(N+1),其中Y’表示上一周期的Y值。
若 值x 为 [11.2, 10.9, 11.07, 11.9, 11.03, 11.54]
那么 ema(x, 4)的代码如下:
"""
n = 4
x = [11.2, 10.9, 11.07, 11.9, 11.03, 11.54]

# 初始值为上一周期的值, 第一天默认为当天的值
y = x[-n]

for i in x[-n:]:
    y = (2 * i + (n - 1) * y) / (n + 1)
# print(y)

# 解开如下
x1 = x[-1]
x2 = x[-2]
x3 = x[-3]
x4 = x[-4]
# print(((2 * x1 + 3 * ((2 * x2 + 3 * ((2 * x3 + 3 * (2 * x4 + 3 * x4) / 5) / 5)) / 5)) / 5))

DMA 动态移动平均

"""
DMA 动态移动平均
DMA(X,A), 求X的动态移动平均
算法: 若Y=DMA(X, A) 则 Y = A * X + (1-A) * Y', 其中 Y' 表示上一周期 Y 值, A 必须小于1
例如:DMA(CLOSE, 1/30)表示求以今天收盘价的1/30 + 昨天Y的 29/30 或者(close + 昨天Y*29)/30 得到的平均值
"""
a = 0.3

x = [11.2, 10.9, 11.07, 11.9, 11.03, 11.54]
y = x[0]
for i in x:
    y = a * i + (1 - a) * y
print(y)

SMA 加权平均值

"""
SMA 加权平均值
SMA(X,N,M) X的N日加权M移动平均
M为权重,如Y=(X*M+Y'*(N-M))/N
SMA 就是把EMA(X,N) 中的权重2, 变成了一个可自己定义的变数。要求 M < N
"""
n = 4
m = 3
x = [11.2, 10.9, 11.07, 11.9, 11.03, 11.54]

# 初始值为上一周期的值, 第一天默认为当天的值
y = x[-n]

for i in x[-n:]:
    y = (m * i + (n - m) * y) / n