def calc_ewmac_forecast(price, Lfast, Lslow=None, usescalar=True): """ Calculate the ewmac trading fule forecast, given a price and EWMA speeds Lfast, Lslow and vol_lookback Assumes that 'price' is daily data """ ## price: This is the stitched price series ## We can't use the price of the contract we're trading, or the volatility will be jumpy ## And we'll miss out on the rolldown. See http://qoppac.blogspot.co.uk/2015/05/systems-building-futures-rolling.html if Lslow is None: Lslow=4*Lfast ## We don't need to calculate the decay parameter, just use the span directly fast_ewma=pd.ewma(price, span=Lfast) slow_ewma=pd.ewma(price, span=Lslow) raw_ewmac=fast_ewma - slow_ewma ## volatility adjustment stdev_returns=volatility(price) vol_adj_ewmac=raw_ewmac/stdev_returns ## scaling adjustment if usescalar: f_scalar=ewmac_forecast_scalar(Lfast, Lslow) forecast=vol_adj_ewmac*f_scalar else: forecast=vol_adj_ewmac cap_forecast=cap_series(forecast, capmin=-20.0,capmax=20.0) return cap_forecast
def calc_ewmac_forecast(price, Lfast, Lslow=None, usescalar=True): """ Calculate the ewmac trading fule forecast, given a price and EWMA speeds Lfast, Lslow and vol_lookback Assumes that 'price' is daily data """ ## price: This is the stitched price series ## We can't use the price of the contract we're trading, or the volatility will be jumpy ## And we'll miss out on the rolldown. See http://qoppac.blogspot.co.uk/2015/05/systems-building-futures-rolling.html if Lslow is None: Lslow = 4 * Lfast ## We don't need to calculate the decay parameter, just use the span directly fast_ewma = pd.ewma(price, span=Lfast) slow_ewma = pd.ewma(price, span=Lslow) raw_ewmac = fast_ewma - slow_ewma ## volatility adjustment stdev_returns = volatility(price) vol_adj_ewmac = raw_ewmac / stdev_returns ## scaling adjustment if usescalar: f_scalar = ewmac_forecast_scalar(Lfast, Lslow) forecast = vol_adj_ewmac * f_scalar else: forecast = vol_adj_ewmac cap_forecast = cap_series(forecast, capmin=-20.0, capmax=20.0) return cap_forecast
data_to_plot = pd.concat([price, fast_ewma, slow_ewma], axis=1) data_to_plot.columns = ['Price', 'Fast', 'Slow'] data_to_plot[d1:d2].plot() plt.show() raw_ewmac[d1:d2].plot() plt.title("Raw EWMAC") plt.show() ## volatility adjustment stdev_returns = pd.ewmstd(price - price.shift(1), span=vol_lookback) vol_adj_ewmac = raw_ewmac / stdev_returns vol_adj_ewmac[d1:d2].plot() plt.title("Vol adjusted") plt.show() ## scaling adjustment f_scalar = ewmac_forecast_scalar(Lfast, Lslow) forecast = vol_adj_ewmac * f_scalar cap_forecast = cap_series(forecast, capmin=-20.0, capmax=20.0) data_to_plot = pd.concat([forecast, cap_forecast], axis=1) data_to_plot.columns = ['Scaled Forecast', 'Capped forecast'] data_to_plot[d1:d2].plot() plt.show()
plt.show() raw_ewmac[d1:d2].plot() plt.title("Raw EWMAC") plt.show() ## volatility adjustment stdev_returns=pd.ewmstd(price - price.shift(1), span=vol_lookback) vol_adj_ewmac=raw_ewmac/stdev_returns vol_adj_ewmac[d1:d2].plot() plt.title("Vol adjusted") plt.show() ## scaling adjustment f_scalar=ewmac_forecast_scalar(Lfast, Lslow) forecast=vol_adj_ewmac*f_scalar cap_forecast=cap_series(forecast, capmin=-20.0,capmax=20.0) data_to_plot=pd.concat([forecast, cap_forecast], axis=1) data_to_plot.columns=['Scaled Forecast', 'Capped forecast'] data_to_plot[d1:d2].plot() plt.show()