简体   繁体   English

如何计算 Python 中的指数移动平均线

[英]How do I calculate the Exponential Moving Average in Python

I've been trying to calculate the Exponential Moving Average (EMA) for stock prices.我一直在尝试计算股票价格的指数移动平均线 (EMA)。 I have the following methods:我有以下方法:

def ema(self, prices, period):
    if len(prices) < period:
        return 'Not enough data to calculate EMA'

    return self.ema_helper(prices, period, (2 / (period + 1)), len(prices))


def ema_helper(self, prices, N, k, length):
    if len(prices) == length-N:
        return prices[0]
    
    return prices[0] * k + self.ema_helper(prices[1:], N, k, length) * (1 - k)

I'm going off of this formula:我要离开这个公式:

EMA = Price(t) × k + EMA(y) × (1 − k)

where:
t = today
y = yesterday
N = number of days in EMA
k = 2 ÷ (N + 1)

Why is it not calculating the EMA?为什么不计算 EMA?

This is the dataset I'm using: (from the latest price 22.27 to the oldest price 22.17 )这是我正在使用的数据集:(从最新价格22.27到最旧价格22.17

[22.27, 22.19, 22.08, 22.17, 22.18, 22.13, 22.23, 22.43, 22.24, 22.29, 22.15, 22.39, 22.38, 22.61, 23.36, 24.05, 23.75, 23.83, 23.95, 23.63, 23.82, 23.87, 23.65, 23.19, 23.1, 23.33, 22.68, 23.1, 22.4, 22.17]

The period is the number of days in EMA. period 是 EMA 中的天数。 I am assuming a 10 day EMA .我假设10 day EMA

Your EMA uses the result from yesterday so this needs to be kept.您的 EMA 使用昨天的结果,因此需要保留。 Maybe rather use a list like so (this can certainly be cleaned and improved upon, I just changed the ema_helper):也许宁愿使用这样的列表(这当然可以清理和改进,我只是更改了 ema_helper):

def ema_helper(prices, N, k, length):
    if len(prices) == length-N:
        return prices[0]
    res_ema = [p for p in prices[:N]] # this keeps the ema
    for t in range(N, length):
        res_ema.append(prices[t] * k + res_ema[t-1] * (1 - k))
    return res_ema

This produces这产生

[22.27, 22.19, 22.08, 22.17, 22.18, 22.13, 22.23, 22.43, 22.24, 22.29, 22.264545454545452, 22.287355371900823, 22.304199849737035, 22.359799877057576, 22.541654444865287, 22.815899091253414, 22.98573562011643, 23.139238234640715, 23.286649464706038, 23.349076834759483, 23.434699228439577, 23.513844823268744, 23.538600309947153, 23.475218435411307, 23.406996901700158, 23.3929974650274, 23.263361562295145, 23.233659460059663, 23.082085012776083, 22.916251374089523]

for your dataset.为您的数据集。 (I assume you have taken it from Moving Averages ), the values correspond. (我假设你是从Moving Averages中获取的),这些值是对应的。

If you just need the last value you can also use (no need for a list here):如果您只需要最后一个值,您也可以使用(此处不需要列表):

def ema_helper(prices, N, k, length):
    if len(prices) == length-N:
        return prices[0]
    res_ema = prices[N-1]
    for t in range(N, length):
        res_ema = (prices[t] * k + res_ema * (1 - k))
    return res_ema

which gives 22.916251374089523 (or just take the last list item res_ema[-1] ).这给出了22.916251374089523 (或者只取最后一个列表项res_ema[-1] )。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM