Overall Statistics |
Total Trades 2378 Average Win 0.15% Average Loss -0.27% Compounding Annual Return 15.421% Drawdown 10.600% Expectancy 0.355 Net Profit 730.426% Sharpe Ratio 1.215 Loss Rate 12% Win Rate 88% Profit-Loss Ratio 0.54 Alpha 0.123 Beta 0.007 Annual Standard Deviation 0.101 Annual Variance 0.01 Information Ratio 0.227 Tracking Error 0.193 Treynor Ratio 16.772 Total Fees $4756.00 |
from datetime import datetime,timedelta import pandas as pd import numpy as np import sys from QuantConnect.Algorithm.Framework.Risk import TrailingStopRiskManagementModel from Execution.StandardDeviationExecutionModel import StandardDeviationExecutionModel class MomentumAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2005,1,1) #self.SetEndDate(2012,1,1) self.SetCash(100000) self.benchmark = "SPY" self.SetRiskManagement(TrailingStopRiskManagementModel(0.017)) self.spy = self.AddEquity("SPY",Resolution.Minute) self.tlt = self.AddEquity("TLT",Resolution.Minute) self.gld = self.AddEquity("GLD",Resolution.Minute) for symbol in self.Securities.Keys: self.Securities[symbol].FeeModel = ConstantFeeModel(2.00) self.__macd = self.MACD("SPY", 12, 26, 4, MovingAverageType.Exponential, Resolution.Daily) self.__mac = self.MACD("TLT", 12, 26, 3, MovingAverageType.Exponential, Resolution.Daily) self.__ma = self.MACD("GLD", 12, 26, 3, MovingAverageType.Exponential, Resolution.Daily) self.__previous = datetime.min self.SetWarmUp(TimeSpan.FromDays(30)) self.Schedule.On(self.DateRules.WeekStart("SPY"), self.TimeRules.AfterMarketOpen("SPY", 10), self.Rebalance) self.SetExecution(StandardDeviationExecutionModel(15, 2, Resolution.Daily)) def Rebalance(self): time_back = self.History(self.Securities.Keys,timedelta(days=90)) if not self.__macd.IsReady: return if self.__previous.date() == self.Time.date(): return tolerance1 = 0.00024 tolerance2 = -0.00040 signalDeltaPercent = (self.__macd.Current.Value - self.__macd.Signal.Current.Value)/self.__macd.Fast.Current.Value signalDeltaPercent2 = (self.__mac.Current.Value - self.__mac.Signal.Current.Value)/self.__mac.Fast.Current.Value signalDeltaPercent3 = (self.__ma.Current.Value - self.__ma.Signal.Current.Value)/self.__ma.Fast.Current.Value signalDeltaPercent_SLOW = (self.__macd.Current.Value - self.__macd.Signal.Current.Value)/self.__macd.Slow.Current.Value if not time_back.empty: if not "SPY" in time_back.index: self.Log("SPY is not in data stream skipping") return look_1 = time_back.loc[self.spy.Symbol.Value] if len(look_1) == 0: return last_look_1 = look_1["open"].iloc[0] if last_look_1 is None: return if not "TLT" in time_back.index: self.Log("TLT is not in data stream skipping") return self.Log("got past TLT") look_2 = time_back.loc[self.tlt.Symbol.Value] if len(look_2) == 0: return last_look_2 = look_2["open"].iloc[0] if last_look_2 is None: return if not "GLD" in time_back.index: self.Log("GLD is not in data stream skipping") return self.Log("got past GLD") look_3 = time_back.loc[self.gld.Symbol.Value] if len(look_3) == 0: return last_look_3 = look_3["open"].iloc[0] if last_look_3 is None: return try: self.Log("last_look_1 {}" . format(last_look_1)) self.Log("last_look_2 {}" . format(last_look_2)) self.Log("last_look_3 {}" . format(last_look_3)) except: self.Log('An unknown error occurred trying OnData' + str(sys.exc_info()[0]) ) return if (float(self.Securities[self.spy.Symbol].Price) == float(0)) or (float(self.Securities[self.tlt.Symbol].Price) == float(0)) \ or (float(self.Securities[self.tlt.Symbol].Price) == float(0)): self.Log("No current price found . skipping ") return GO_1= (float(self.Securities[self.spy.Symbol].Price) - float(last_look_1))/(float(self.Securities[self.spy.Symbol].Price)) GO_2= (float(self.Securities[self.tlt.Symbol].Price) - float(last_look_2))/(float(self.Securities[self.tlt.Symbol].Price)) GO_3 = (float(self.Securities[self.tlt.Symbol].Price) - float(last_look_3))/(float(self.Securities[self.tlt.Symbol].Price)) GO_4 = (float(self.Securities[self.gld.Symbol].Price) - float(last_look_3))/(float(self.Securities[self.gld.Symbol].Price)) GO_5= (float(self.Securities[self.spy.Symbol].Price) - float(last_look_1))/(float(self.Securities[self.tlt.Symbol].Price)) GO_6= (float(self.Securities[self.spy.Symbol].Price) - float(last_look_1))/(float(self.Securities[self.gld.Symbol].Price)) GO_7= (float(self.Securities[self.tlt.Symbol].Price) - float(last_look_1))/(float(self.Securities[self.tlt.Symbol].Price)) GO_8= (float(self.Securities[self.tlt.Symbol].Price) - float(last_look_2))/(float(self.Securities[self.spy.Symbol].Price)) GO_9= (float(self.Securities[self.gld.Symbol].Price) - float(last_look_3))/(float(self.Securities[self.spy.Symbol].Price)) GO_10= (float(self.Securities[self.gld.Symbol].Price) - float(last_look_3))/(float(self.Securities[self.tlt.Symbol].Price)) first = max(GO_1,GO_2) self.Log("SPY {} TLT {} GLD_3 {}" . format(GO_1,GO_2,GO_3)) if (first <= 0 and signalDeltaPercent < tolerance1): self.EmitInsights(Insight.Price("TLT", timedelta(seconds=1), InsightDirection.Flat)) self.Liquidate(self.tlt.Symbol) self.EmitInsights(Insight.Price("GLD", timedelta(seconds=1), InsightDirection.Flat)) self.Liquidate(self.gld.Symbol) self.EmitInsights(Insight.Price("SPY", timedelta(1), InsightDirection.Up)) self.SetHoldings(self.spy.Symbol,0.25) else: if(GO_1> GO_2 and GO_1> GO_3 and GO_1 > GO_4 and signalDeltaPercent < -tolerance1 ): if(self.Securities[self.tlt.Symbol].Invested==True): self.EmitInsights(Insight.Price("TLT", timedelta(seconds=1), InsightDirection.Flat)) self.Liquidate(self.tlt.Symbol) if(self.Securities[self.gld.Symbol].Invested==True): self.EmitInsights(Insight.Price("GLD", timedelta(seconds=1), InsightDirection.Flat)) self.Liquidate(self.gld.Symbol) self.EmitInsights(Insight.Price("SPY", timedelta(1), InsightDirection.Up)) self.SetHoldings(self.spy.Symbol,1.0) else: if(GO_2 > GO_3 and GO_2 > GO_1 and GO_2 > GO_6 and GO_2 > GO_8 and GO_2 > GO_7 ) : if(self.Securities[self.gld.Symbol].Invested==True): self.EmitInsights(Insight.Price("GLD", timedelta(seconds=1), InsightDirection.Flat)) self.Liquidate(self.gld.Symbol) if(self.Securities[self.spy.Symbol].Invested==True): self.EmitInsights(Insight.Price("SPY", timedelta(seconds=1), InsightDirection.Flat)) self.Liquidate(self.spy.Symbol) self.EmitInsights(Insight.Price("TLT", timedelta(1), InsightDirection.Up)) self.SetHoldings(self.tlt.Symbol,1.0) elif (GO_3 > GO_2 and GO_3 > GO_1 and signalDeltaPercent3 > signalDeltaPercent) : if(self.Securities[self.spy.Symbol].Invested==True): self.EmitInsights(Insight.Price("SPY", timedelta(seconds=1), InsightDirection.Flat)) self.Liquidate(self.spy.Symbol) if(self.Securities[self.tlt.Symbol].Invested==True): self.EmitInsights(Insight.Price("TLT", timedelta(seconds=1), InsightDirection.Flat)) self.Liquidate(self.tlt.Symbol) self.EmitInsights(Insight.Price("GLD", timedelta(1), InsightDirection.Up)) self.SetHoldings(self.gld.Symbol,1.0) def OnData(self, data): pass