| Overall Statistics |
|
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio -0.692 Tracking Error 0.301 Treynor Ratio 0 Total Fees $0.00 |
import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import adfuller
def TestStationartiy(returns):
# Return pandas Series with True/False for each symbol
return pd.Series([adfuller(values)[1] < 0.05 for columns, values in returns.iteritems()], index = returns.columns)
def GetZScores(returns):
# Return pandas DataFrame containing z-scores
return returns.subtract(returns.mean()).div(returns.std())from HMM import *
import numpy as np
from StationarityAndZScores import *
from QuantConnect.Data.UniverseSelection import *
from collections import deque
from System.Drawing import Color
class ModulatedDynamicCircuit(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 1, 1) # Set Start Date
self.SetCash(100000) # Set Strategy Cash
self.models = {}
self.queue = deque(maxlen=2)
self.SetWarmUp(2)
self.AddEquity('SPY', Resolution.Daily)
#self.Schedule.On(self.DateRules.EveryDay('SPY'), self.TimeRules.AfterMarketOpen('SPY', 5), self.GenerateInsights)
#self.Schedule.On(self.DateRules.MonthStart('SPY'), self.TimeRules.At(19,0), self.RefitModels)
stockPlot = Chart('HMM Plots')
stockPlot.AddSeries(Series('HMM0', SeriesType.Scatter, '$', Color.Red, ScatterMarkerSymbol.Circle))
stockPlot.AddSeries(Series('HMM1', SeriesType.Scatter, '$', Color.Blue, ScatterMarkerSymbol.Circle))
self.AddChart(stockPlot)
def RefitModels(self):
for symbol, model in self.models.items():
RefitModel(self, symbol, model)
def OnData(self, data):
self.queue.append(data["SPY"].Close)
if self.IsWarmingUp:
return
symbol = "SPY"
model = self.CheckForHMM(symbol)
state_prediction = PredictState(self, model, symbol)
self.Log("State = " + str(state_prediction))
if state_prediction == 1:
self.Plot('HMM Plots', 'HMM1', self.CurrentSlice[symbol].Close)
elif state_prediction == 0:
self.Plot('HMM Plots', 'HMM0', self.CurrentSlice[symbol].Close)
self.Log(state_prediction)
def CheckForHMM(self, symbol):
if self.models.get(symbol, None) is None:
self.models[symbol] = CreateHMM(self, symbol)
return self.models.get(symbol, None)
def OnSecuritiesChanged(self, changes):
symbols = [x.Symbol for x in changes.AddedSecurities]
# Build model for each symbol
for symbol in symbols:
self.models[symbol] = CreateHMM(self, symbol)import numpy as np
import pandas as pd
from hmmlearn.hmm import GaussianHMM
def CreateHMM(algorithm, symbol):
start_time = datetime(2010, 1, 1) # start datetime for history call
end_time = datetime(2015, 1, 1) # end datetime for history call
history = algorithm.History([symbol], start_time, end_time, Resolution.Daily)
returns = np.array(history.loc[symbol].close.pct_change().dropna())
# Reshape returns
returns = np.array(returns).reshape((len(returns),1))
# Initialize Gaussian Hidden Markov Model
return GaussianHMM(n_components=2, covariance_type="full", n_iter=1000).fit(returns)
def PredictState(algorithm, model, symbol):
returns = np.array(algorithm.queue)
returns = returns[-2:]
returns = pd.Series(returns)
returns = np.array(returns.pct_change().dropna())
returns = np.array(returns).reshape((len(returns),1))
state = model.predict(returns)[0]
return state
def RefitModel(algorithm, symbol, model):
history = algorithm.History([symbol], 900, Resolution.Daily)
returns = np.array(history.loc[symbol].close.pct_change().dropna())
# Reshape returns
returns = np.array(returns).reshape((len(returns),1))
return model.fit(returns)