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:
exp()
and linspace()
:N = 5 weights = np.exp(np.linspace(-1., 0., N))
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]
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:
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()