Calculating the Exponential Moving Average in Python

exponential moving average.png

Theory

The exponential moving average differs from the simple moving average in that more recent samples are more strongly weighted. This means that the exponential moving average responds more quickly to changes in the signal.

Implementation

The signal parameter is a one dimensional array. the smoothing parameter controls how much influence the more recent samples have on the value of the average.

import numpy as np

def exponential_moving_average(signal, points, smoothing=2):
    """
    Calculate the N-point exponential moving average of a signal

    Inputs:
        signal: numpy array -   A sequence of price points in time
        points:      int    -   The size of the moving average
        smoothing: float    -   The smoothing factor

    Outputs:
        ma:     numpy array -   The moving average at each point in the signal
    """

    weight = smoothing / (points + 1)
    ema = np.zeros(len(signal))
    ema[0] = signal[0]

    for i in range(1, len(signal)):
        ema[i] = (signal[i] * weight) + (ema[i - 1] * (1 - weight))

    return ema

Results

Consider the following diagram showing the exponential average in blue and the simple average in red. Note that the exponential average leads the simple average, reacting to price changes more quickly.

ema vs sma.png

H2
H3
H4
3 columns
2 columns
1 column
3 Comments
Ecency