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'))