Hi everyone, 

I built a simple strategy to buy a basket of securities at market close and sell them at open. The code executes the way I want it to but it takes roughly 30mins to backtest just 2 months of data with only a handful of securities.  I'm a beginner when it comes to programming so it's probably my own doing, what are some ways to improve the speed at which it backtests? 

class MultidimensionalHorizontalShield(QCAlgorithm): def Initialize(self): self.SetStartDate(2019, 11, 10) # Set Start Date self.SetEndDate(2019,12,10) #Set End Date self.SetCash(10000) # Set Strategy Cash # Adds securities to the universe we can pull from self.AddEquity("MCD", Resolution.Minute) self.AddEquity("dis", Resolution.Minute) self.AddEquity("aapl", Resolution.Minute) self.AddEquity("mrk", Resolution.Minute) self.AddEquity("csco", Resolution.Minute) self.AddEquity("BRK.B", Resolution.Minute) self.AddEquity("tsm", Resolution.Minute) self.AddEquity("vz", Resolution.Minute) self.AddEquity("MSFT", Resolution.Minute) self.AddEquity("orcl", Resolution.Minute) # Sets comission model to be 0 fee self.Securities["MCD"].SetFeeModel(CustomFeeModel()) self.Securities["dis"].SetFeeModel(CustomFeeModel()) self.Securities["aapl"].SetFeeModel(CustomFeeModel()) self.Securities["mrk"].SetFeeModel(CustomFeeModel()) self.Securities["csco"].SetFeeModel(CustomFeeModel()) self.Securities["BRK.B"].SetFeeModel(CustomFeeModel()) self.Securities["tsm"].SetFeeModel(CustomFeeModel()) self.Securities["vz"].SetFeeModel(CustomFeeModel()) self.Securities["MSFT"].SetFeeModel(CustomFeeModel()) self.Securities["orcl"].SetFeeModel(CustomFeeModel()) def OnData(self, data): class DynamicNadionCircuit(QCAlgorithm): self.Schedule.On(self.DateRules.EveryDay("MCD"), \ self.TimeRules.BeforeMarketClose("MCD", 5), \ self.EveryDayBeforeMarketClose) self.Schedule.On(self.DateRules.EveryDay("dis"), \ self.TimeRules.BeforeMarketClose("dis", 5), \ self.EveryDayBeforeMarketClose) self.Schedule.On(self.DateRules.EveryDay("aapl"), \ self.TimeRules.BeforeMarketClose("aapl", 5), \ self.EveryDayBeforeMarketClose) self.Schedule.On(self.DateRules.EveryDay("mrk"), \ self.TimeRules.BeforeMarketClose("mrk", 5), \ self.EveryDayBeforeMarketClose) self.Schedule.On(self.DateRules.EveryDay("csco"), \ self.TimeRules.BeforeMarketClose("csco", 5), \ self.EveryDayBeforeMarketClose) self.Schedule.On(self.DateRules.EveryDay("BRK.B"), \ self.TimeRules.BeforeMarketClose("BRK.B", 5), \ self.EveryDayBeforeMarketClose) self.Schedule.On(self.DateRules.EveryDay("tsm"), \ self.TimeRules.BeforeMarketClose("tsm", 5), \ self.EveryDayBeforeMarketClose) self.Schedule.On(self.DateRules.EveryDay("vz"), \ self.TimeRules.BeforeMarketClose("vz", 5), \ self.EveryDayBeforeMarketClose) self.Schedule.On(self.DateRules.EveryDay("MSFT"), \ self.TimeRules.BeforeMarketClose("MSFT", 5), \ self.EveryDayBeforeMarketClose) self.Schedule.On(self.DateRules.EveryDay("orcl"), \ self.TimeRules.BeforeMarketClose("orcl", 5), \ self.EveryDayBeforeMarketClose) #################### self.Schedule.On(self.DateRules.EveryDay("MCD"), \ self.TimeRules.AfterMarketOpen("MCD", 5), \ self.EveryDayAfterMarketOpen) self.Schedule.On(self.DateRules.EveryDay("dis"), \ self.TimeRules.AfterMarketOpen("dis", 5), \ self.EveryDayAfterMarketOpen) self.Schedule.On(self.DateRules.EveryDay("aapl"), \ self.TimeRules.AfterMarketOpen("aapl", 5), \ self.EveryDayAfterMarketOpen) self.Schedule.On(self.DateRules.EveryDay("mrk"), \ self.TimeRules.AfterMarketOpen("mrk", 5), \ self.EveryDayAfterMarketOpen) self.Schedule.On(self.DateRules.EveryDay("csco"), \ self.TimeRules.AfterMarketOpen("csco", 5), \ self.EveryDayAfterMarketOpen) self.Schedule.On(self.DateRules.EveryDay("BRK.B"), \ self.TimeRules.AfterMarketOpen("BRK.B", 5), \ self.EveryDayAfterMarketOpen) self.Schedule.On(self.DateRules.EveryDay("tsm"), \ self.TimeRules.AfterMarketOpen("tsm", 5), \ self.EveryDayAfterMarketOpen) self.Schedule.On(self.DateRules.EveryDay("vz"), \ self.TimeRules.AfterMarketOpen("vz", 5), \ self.EveryDayAfterMarketOpen) self.Schedule.On(self.DateRules.EveryDay("MSFT"), \ self.TimeRules.AfterMarketOpen("MSFT", 5), \ self.EveryDayAfterMarketOpen) self.Schedule.On(self.DateRules.EveryDay("orcl"), \ self.TimeRules.AfterMarketOpen("orcl", 5), \ self.EveryDayAfterMarketOpen) def EveryDayAfterMarketOpen(self): self.Liquidate() #Buys securities with a target 10% of the total portfolio value def EveryDayBeforeMarketClose(self): self.SetHoldings("MCD",.1) self.SetHoldings("dis",.1) self.SetHoldings("aapl",.1) self.SetHoldings("mrk",.1) self.SetHoldings("csco",.1) self.SetHoldings("csco",.1) self.SetHoldings("tsm",.1) self.SetHoldings("vz",.1) self.SetHoldings("MSFT",.1) self.SetHoldings("orcl",.1) # Our 0 fee custom fee model class CustomFeeModel: def GetOrderFee(self, parameters): fee = max(0, parameters.Security.Price * parameters.Order.AbsoluteQuantity * 0.00000) return OrderFee(CashAmount(fee, 'USD'))

 

Author