Overall Statistics |
Total Trades 12 Average Win 3.61% Average Loss 0% Compounding Annual Return 129.941% Drawdown 11.200% Expectancy 0 Net Profit 23.540% Sharpe Ratio 6.545 Probabilistic Sharpe Ratio 98.817% Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 1.072 Beta 0.172 Annual Standard Deviation 0.183 Annual Variance 0.034 Information Ratio 1.944 Tracking Error 0.235 Treynor Ratio 6.96 Total Fees $6.00 |
from datetime import timedelta class OptionBot1(QCAlgorithm): def Initialize(self): self.SetStartDate(2020, 6, 1) self.SetEndDate(2020,9,1) self.SetCash(10000) self.spy = self.AddEquity("SPY", Resolution.Minute) self.option = self.AddOption("SPY",Resolution.Minute) self.symbol = self.option.Symbol self.option.SetFilter(-2,-1,timedelta(3),timedelta(7)) self.SetBenchmark(self.spy.Symbol) self.options_sold = 0 def OnData(self, data): for kvp in data.OptionChains: if kvp.Key != self.symbol: continue optionchain = kvp.Value put = [x for x in optionchain if x.Right == OptionRight.Put] price = optionchain.Underlying.Price contracts = [x for x in put if price - x.Strike > 0] contracts = sorted(contracts, key = lambda x: x.Expiry, reverse = True) if len(contracts) == 0: continue symbol = contracts[0].Symbol self.Sell(symbol, 1) self.Plot('Options Profit', 'Options Profit', sum([x.UnrealizedProfit for x in self.Portfolio.Values if x.Type == SecurityType.Option])) self.Plot('Assets Held', 'Assets Held', len([x for x in self.Portfolio.Values if x.Invested])) self.Plot('Non-options Assets Held', 'Non-options Assets Held', len([x for x in self.Portfolio.Values if x.Invested and x.Type != SecurityType.Option])) self.Plot('Options Sold', 'Options Sold', self.options_sold) self.Plot('Option Assets Held', 'Option Assets Held', len([x for x in self.Portfolio.Values if x.Invested and x.Type == SecurityType.Option])) def OnOrderEvent(self, orderEvent): if orderEvent.Symbol.SecurityType == SecurityType.Option: self.options_sold += -orderEvent.FillQuantity self.Log(f'Options Sold: {self.options_sold}')