Time for action – calculating the Exponential Moving Average

Given an array, the exp() function calculates the exponential of each array element. For example, look at the following code:

x = np.arange(5)
print("Exp", np.exp(x))

It gives the following output:

Exp [  1.           2.71828183   7.3890561   20.08553692  54.59815003]

The linspace() function takes as parameters a start value, a stop value, and optionally an array size. It returns an array of evenly spaced numbers. This is an example:

print("Linspace", np.linspace(-1, 0, 5))

This will give us the following output:

Linspace [-1.   -0.75 -0.5  -0.25  0.  ]

Calculate the EMA for our data:

  1. Now, back to the weights, calculate them with exp() and linspace():
    N = 5
    weights = np.exp(np.linspace(-1., 0., N))
  2. Normalize the weights with the ndarray sum() method:
    weights /= weights.sum()
    print("Weights", weights)

    For N = 5, we get these weights:

    Weights [ 0.11405072  0.14644403  0.18803785  0.24144538  0.31002201]
    
  3. After this, use the convolve() function that we learned about in the SMA section and also plot the results:
    c = np.loadtxt('data.csv', delimiter=',', usecols=(6,), unpack=True)
    ema = np.convolve(weights, c)[N-1:-N+1]
    t = np.arange(N - 1, len(c))
    plt.plot(t, c[N-1:], lw=1.0, label='Data')
    plt.plot(t, ema, '--', lw=2.0, label='Exponential Moving Average')
    plt.title('5 Days Exponential Moving Average')
    plt.xlabel('Days')
    plt.ylabel('Price ($)')
    plt.legend()
    plt.grid()
    plt.show()

    This gives us a nice chart where, again, the close price is the thin jagged line and the EMA is the smooth dashed line:

    Time for action – calculating the Exponential Moving Average

What just happened?

We calculated the EMA of the close price. First, we computed exponentially decreasing weights with the exp() and linspace() functions. The linspace() function gave us an array with evenly spaced elements, and, then, we calculated the exponential for these numbers. We called the ndarray sum() method in order to normalize the weights. After this, we applied the convolve() trick that we learned in the SMA section (see ema.py):

from __future__ import print_function
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(5)
print("Exp", np.exp(x))
print("Linspace", np.linspace(-1, 0, 5))

# Calculate weights
N = 5
weights = np.exp(np.linspace(-1., 0., N))

# Normalize weights
weights /= weights.sum()
print("Weights", weights)

c = np.loadtxt('data.csv', delimiter=',', usecols=(6,), unpack=True)
ema = np.convolve(weights, c)[N-1:-N+1]
t = np.arange(N - 1, len(c))
plt.plot(t, c[N-1:], lw=1.0, label='Data')
plt.plot(t, ema, '--', lw=2.0, label='Exponential Moving Average')
plt.title('5 Days Exponential Moving Average')
plt.xlabel('Days')
plt.ylabel('Price ($)')
plt.legend()
plt.grid()
plt.show()
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset