Check out the posts below to understand the background on Exponential Moving Averages (EMA) and their calculation.
- Wapedia's Exponential Moving Average
- StockCharts.com EMA Calculation
- Exponential Versus Simple Moving Averages
Let's begin. We need to calculate our smoothing factor for the time series. Typical use in technical analysis is:
\( \alpha = 2.0 / (periods + 1.0) \)
We can use any value between 0 & 1 for the smoothing factor. Closer to one is less smooth and places greater weight on the more recent values. Use a value of 1 and you get the most recent value back. Closer to zero is more smooth and places greater weight on the older values.
Now, the formula for an EMA given our smoothing factor:
\( EMA_{today} = EMA_{yesterday} + \alpha(price_{today} - EMA_{yesterday}) \)
Coding in Python we get:
def ema(bar, series, period, prevma, smoothing=None): '''Returns the Exponential Moving Average of a series. Keyword arguments: bar -- currrent index or location of the series series -- series of values to be averaged period -- number of values in the series to average prevma -- previous exponential moving average smoothing -- smoothing factor to use in the series. valid values: between 0 & 1. default: None - which then uses formula = 2.0 / (period + 1.0) closer to 1 to gives greater weight to recent values - less smooth closer to 0 gives greater weight to older values -- more smooth ''' if period < 1: raise ValueError("period must be 1 or greater") if smoothing: if (smoothing < 0) or (smoothing > 1.0): raise ValueError("smoothing must be between 0 and 1") else: smoothing = 2.0 / (period + 1.0) if bar <= 0: return series[0] elif bar < period: return cumulative_sma(bar, series, prevma) return prevma + smoothing * (series[bar] - prevma) def cumulative_sma(bar, series, prevma): """ Returns the cumulative or unweighted simple moving average. Avoids averaging the entire series on each call. Keyword arguments: bar -- current index or location of the value in the series series -- list or tuple of data to average prevma -- previous average (n - 1) of the series. """ if bar <= 0: return series[0] else: return prevma + ((series[bar] - prevma) / (bar + 1.0))
Example call and results using the typical smoothing factor of 2 / (period + 1):
prices = [32.47, 32.70, 32.77, 33.11, 33.25, 33.23, 33.23, 33.0, 33.04, 33.21] period = 5 #number of bars to average prevsma = prevema = prices[0] #1st day nothing to average for bar, close in enumerate(prices): currentema = ema(bar, prices, period, prevema, smoothing=None) #running_sma defined in simple moving average blog post currentsma = running_sma(bar, prices, period, prevsma) print "Day %02d Value=%.2f %i-bar SMA=%f and EMA=%f" % (bar + 1, close, period, currentsma, currentema) prevema = currentema prevsma = currentsma ---------------------------------------------------------- Results of call: Day 01 Value=32.47 5-day SMA=32.470000 and EMA=32.470000 Day 02 Value=32.70 5-day SMA=32.585000 and EMA=32.585000 Day 03 Value=32.77 5-day SMA=32.646667 and EMA=32.646667 Day 04 Value=33.11 5-day SMA=32.762500 and EMA=32.762500 Day 05 Value=33.25 5-day SMA=32.860000 and EMA=32.860000 Day 06 Value=33.23 5-day SMA=33.012000 and EMA=32.983333 Day 07 Value=33.23 5-day SMA=33.118000 and EMA=33.065556 Day 08 Value=33.00 5-day SMA=33.164000 and EMA=33.043704 Day 09 Value=33.04 5-day SMA=33.150000 and EMA=33.042469 Day 10 Value=33.21 5-day SMA=33.142000 and EMA=33.098313
5 comments:
[...] covered Running SMAs and EMAs…let’s dig into Running Sums or often called Running Totals. Formula as follows: Where [...]
Can you post Average true range in python.
And Calculating implied volatilies in option pricing in python
I'll share the ATR. Don't have the implied volatility - currently don't have a need. But, I'll read up on it and see.
Thanks! really useful, complete and well explained code
You're welcome!
Post a Comment