Overall Statistics |
Total Trades 40 Average Win 0% Average Loss -0.07% Compounding Annual Return -13.676% Drawdown 1.300% Expectancy -1 Net Profit -1.296% Sharpe Ratio -24.797 Probabilistic Sharpe Ratio 0.000% Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0.005 Annual Variance 0 Information Ratio -24.797 Tracking Error 0.005 Treynor Ratio 0 Total Fees $74.00 Estimated Strategy Capacity $66000000.00 Lowest Capacity Asset ES WSVU0MELFS3L |
import pandas as pd class IndexFuturesPairs(QCAlgorithm): def Initialize(self): # Backtesting Values self.SetStartDate(2018, 1, 1) # Set Start Date self.SetEndDate(2018, 1, 30) # Set End Date self.SetCash(25000) # Set Strategy Cash self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage) self.contracts = [] # Import SPY self.AddEquity("SPY") # Import Index Futures self.Rusemini = self.AddFuture(Futures.Indices.Russell2000EMini, Resolution.Minute) self.Nasemini = self.AddFuture(Futures.Indices.NASDAQ100EMini, Resolution.Minute) self.Dowemini = self.AddFuture(Futures.Indices.Dow30EMini, Resolution.Minute) self.SPemini = self.AddFuture(Futures.Indices.SP500EMini, Resolution.Minute) # Add contracts to chain for each future self.Rusemini.SetFilter(lambda x: x.FrontMonth().OnlyApplyFilterAtMarketOpen()) self.Nasemini.SetFilter(lambda x: x.FrontMonth().OnlyApplyFilterAtMarketOpen()) self.Dowemini.SetFilter(lambda x: x.FrontMonth().OnlyApplyFilterAtMarketOpen()) self.SPemini.SetFilter(lambda x: x.FrontMonth().OnlyApplyFilterAtMarketOpen()) self.contracts = [self.Rusemini.Symbol, self.Nasemini.Symbol, self.Dowemini.Symbol, self.SPemini.Symbol] # Set up MACD indicators #self.RusMACD = self.MACD(self.Rusemini.Symbol, 12, 26, 9, MovingAverageType.Simple, Resolution.Minute) #self.RegisterIndicator(self.Rusemini.Symbol, self.RusMACD, timedelta(minutes = 5)) #self.NasMACD = self.MACD(self.Nasemini.Symbol, 12, 26, 9, MovingAverageType.Simple, Resolution.Minute) #self.RegisterIndicator(self.Nasemini.Symbol, self.NasMACD, timedelta(minutes = 5)) #self.DowMACD = self.MACD(self.Dowemini.Symbol, 12, 26, 9, MovingAverageType.Simple, Resolution.Minute) #self.RegisterIndicator(self.Dowemini.Symbol, self.DowMACD, timedelta(minutes = 5)) #self.SPMACD = self.MACD(self.SPemini.Symbol, 12, 26, 9, MovingAverageType.Simple, Resolution.Minute) #self.RegisterIndicator(self.SPemini.Symbol, self.SPMACD, timedelta(minutes = 5)) # Set up MOMP indicators # self.RusMOMP = self.MOMP(self.Rusemini.Symbol,10,Resolution.Daily) #self.NasMOMP = self.MOMP(self.Nasemini.Symbol,10,Resolution.Daily) #self.DowMOMP = self.MOMP(self.Dowemini.Symbol,10,Resolution.Daily) #self.SPMOMP = self.MOMP(self.SPemini.Symbol,10,Resolution.Daily) # Set warm-up period self.SetWarmUp(timedelta(20)) # Initiate order buying process 30 seconds after market open self.Schedule.On(self.DateRules.EveryDay("SPY"), self.TimeRules.AfterMarketOpen("SPY", 1), self.PrepareOrder) def OnMarginCallWarning(self): self.Error("This is a margin call warning. The assets will be liquidated to cover losses.") def OnData(self, data): '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here. Arguments: data: Slice object keyed by symbol containing the stock data ''' # Check sell condition if self.Portfolio.Invested == True: if self.contractData[self.contractBought].Current.Value<self.contractData[self.ContractSold].Current.Value: self.Liquidate() def Handler(self,sender,bar): self.Debug("Bar recived:"+str(self.Time)) def PrepareOrder(self): if self.IsWarmingUp == True: self.Log('Warm up not done') return self.contractData = {} for symbol in self.contracts: contracts = self.FutureChainProvider.GetFutureContractList(symbol, self.Time) if len(contracts)==0: self.Debug("No contract available") continue self.Debug("Contract found") contract = contracts[0] self.AddFutureContract(contract, Resolution.Minute).Symbol self.contractData[contract] = self.MOMP(contract,10,Resolution.Daily) # self.consolidator += self.Handler history = self.History(contract, 1000, Resolution.Minute) for index, row in history.iterrows(): #self.Debug(str(index)+":"+str(row.close)) self.contractData[contract].Update(index[0],row.close) max = -1 min = 10000 self.ContractBought = None self.ContractSold = None for key,value in self.contractData.items(): self.Debug(str(value.Current.Value)) if value.Current.Value>max:self.ContractBought = key if value.Current.Value<min: self.ContractSold = key if self.ContractBought is None or self.ContractSold is None:return self.MarketOrder(self.ContractSold,-1) self.MarketOrder(self.ContractBought,1) #self.Log("Buy {} contracts of {} ".format(1, self.ContractBought) # self.Log("Sell {} contracts of {} ".format(1, self.ContractSold))