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 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 |
#take the paper "Leverage For The Long Run", use a 200 SMA on SPY to generate weekly buy/sell signals to either go long SPX futures or cash. class LeverageForTheLongRunDiversifiedWeekly(QCAlgorithm): def Initialize(self): self.SetStartDate(2010,3, 1) #Set Start Date self.SetEndDate(2020,8,20) #Set End Date self.SetCash(100000) #Set Strategy Cash self.spy = self.AddEquity("SPY", Resolution.Daily) self.Securities["SPY"].SetDataNormalizationMode(DataNormalizationMode.Raw); self.tqqq = self.AddEquity("TQQQ", Resolution.Hour) self.shy = self.AddEquity("SHY", Resolution.Hour) self.futureSP500 = self.AddFuture(Futures.Indices.SP500EMini) self.futureSP500 .SetFilter(10, 120) # Get contracts from 10 days to 120 days out self.sma = self.SMA("SPY", 200, Resolution.Daily) self.SetWarmUp(200) # warm up the indicator self.Settings.FreePortfolioValuePercentage = 0.05 # Rebalancing logic self.rebal = 1 # Rebalance every 1 week self.rebalTimer = self.rebal - 1 # Initialize to trigger first week self.flag1 = 0 # Flag to initate trades # Increment rebalance timer at every week start self.Schedule.On(self.DateRules.WeekStart("SPY"), self.TimeRules.AfterMarketOpen("SPY", 60), self.Rebalance) def OnData(self, data): if not self.sma.IsReady: return if data.ContainsKey("SPY") == False: return # make sure we have data for trading symbols if data.ContainsKey("TQQQ") == False: return if data.ContainsKey("SHY") == False: return if self.flag1 == 1: if data[self.spy.Symbol].Close > self.sma.Current.Value: for chain in data.FutureChains.Values: for i in chain.Value: contractSymbol = i.Symbol #1. Save the notional value of the futures contract to self.notionalValue self.notionalValue = self.contractSymbol.AskPrice * self.futureSP500.SymbolProperties.ContractMultiplier #2. Save the contract security object to the variable future future = self.Securities[self.contractSymbol.Symbol] #3. Calculate the number of contracts we can afford based on the margin required. Divide the margin remaining by the initial margin and save to self.contractsToBuy self.contractsToBuy = floor(self.Portfolio.MarginRemaining / future.BuyingPowerModel.InitialOvernightMarginRequirement) #4. Make a market order for the number of contracts we calculated for that symbol self.MarketOrder(self.contractSymbol.Symbol, self.contractsToBuy) #self.MarketOrder(self.contractSymbol, 0.1) #self.SetHoldings("TQQQ", 1, True) #self.Debug("long equities") self.rebalTimer = 0 # Reset rebalance timer if data[self.spy.Symbol].Close < self.sma.Current.Value: self.SetHoldings("SHY", 1, True) self.Debug("go to cash") self.rebalTimer = 0 # Reset rebalance timer self.flag1 = 0 def Rebalance(self): self.rebalTimer +=1 if self.rebalTimer == self.rebal: self.flag1 = 1 def OnEndOfAlgorithm(self): # Get the margin requirements buyingPowerModel = self.Securities[self.contractSymbol].BuyingPowerModel name = type(buyingPowerModel).__name__ if name != 'FutureMarginModel': raise Exception(f"Invalid buying power model. Found: {name}. Expected: FutureMarginModel") initialOvernight = buyingPowerModel.InitialOvernightMarginRequirement maintenanceOvernight = buyingPowerModel.MaintenanceOvernightMarginRequirement initialIntraday = buyingPowerModel.InitialIntradayMarginRequirement maintenanceIntraday = buyingPowerModel.MaintenanceIntradayMarginRequirement