Overall Statistics |
Total Trades 4 Average Win 7.69% Average Loss -13.33% Compounding Annual Return 21.563% Drawdown 37.400% Expectancy -0.212 Net Profit 196.647% Sharpe Ratio 0.752 Probabilistic Sharpe Ratio 19.320% Loss Rate 50% Win Rate 50% Profit-Loss Ratio 0.58 Alpha 0.056 Beta 1.237 Annual Standard Deviation 0.234 Annual Variance 0.055 Information Ratio 0.767 Tracking Error 0.103 Treynor Ratio 0.142 Total Fees $2.00 Estimated Strategy Capacity $0 Lowest Capacity Asset VGT SVS2QA8SPHET Portfolio Turnover 0.06% |
#region imports from AlgorithmImports import * #endregion class TransdimensionalCalibratedRadiator(QCAlgorithm): def Initialize(self): self.SetStartDate(2018, 1, 1) # Set Start Date self.SetCash(15000) # Set Strategy Cash option = self.AddOption("VGT") self.symbol = option.Symbol option.SetFilter(-40, 40, timedelta(8), timedelta(8)) def OnData(self, slice: Slice) -> None: if self.Portfolio.Invested: return # Get the OptionChain chain = slice.OptionChains.get(self.symbol, None) if not chain: return # Get the furthest expiration date of the contracts expiry = sorted(chain, key = lambda x: x.Expiry, reverse=True)[0].Expiry # Select the put Option contracts with the furthest expiry puts = [i for i in chain if i.Expiry == expiry and i.Right == OptionRight.Put] if len(puts) == 0: return # Select the ITM and OTM contract strikes from the remaining contracts put_strikes = sorted([x.Strike for x in puts]) for kvp in slice.OptionChains: if kvp.Key != self.symbol: continue chain = kvp.Value contracts = [i for i in chain] if len(contracts) == 0: continue contracts = sorted(contracts, key=lambda x: (x.Strike)) self.shortContract = min(contracts, key=lambda x: x.Strike < 1.055*chain.Underlying.Price) self.longContract = min([c for c in contracts if c.Expiry==self.shortContract.Expiry], key=lambda x: x.Strike > 0.92*chain.Underlying.Price) #self.Buy(option_strategy, 1) if self.shortContract != self.longContract: pass self.allChecksPassed = True self.Sell(self.shortContract.Symbol, 1) self.Buy(self.longContract.Symbol, 1) self.expirydate = self.longContract.Expiry break # for chain in data.OptionChains.Values: # lowerBound = chain.Underlying.Price * 0.9 # upperBound = chain.Underlying.Price * 1.0 # # Option contracts sorted by their strikes # contracts = sorted(chain, key=lambda x: x.Strike) # # The contracts from -5% to 5% # selectedContracts = [x for x in contracts if x.Strike > lowerBound and x.Strike < upperBound and x.Symbol.ID.OptionRight == OptionRight.Put ] # # For validation we get the strikes of the selected contracts # strikes = [x.Strike for x in contracts if x.Strike > lowerBound and x.Strike < upperBound] # self.Log(f"Lower Bound: {lowerBound} \n Upper Bound: {upperBound} \n Strikes: {strikes}") # self.longOption = selectedContracts[0] # self.shortOption = selectedContracts[0] # self.Buy(self.longOption.Symbol, 1) # self.Sell(self.shortOption.Symbol, 1)