| Overall Statistics |
|
Total Trades 21 Average Win 0.02% Average Loss 0% Compounding Annual Return 274.715% Drawdown 12.500% Expectancy 0 Net Profit 13.738% Sharpe Ratio 5.044 Probabilistic Sharpe Ratio 65.981% Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 1.664 Beta 1.827 Annual Standard Deviation 0.518 Annual Variance 0.268 Information Ratio 7.456 Tracking Error 0.281 Treynor Ratio 1.43 Total Fees $20.00 |
from datetime import timedelta
class OptionBot1(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 6, 1)
self.SetEndDate(2020,9,1)
self.SetCash(100000)
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(0),timedelta(60))
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('Option Strike', 'Option Strike', contracts[0].Strike)
self.Plot('Option Ask', 'Option Ask', contracts[0].AskPrice)
self.Plot('Option Bid', 'Option Bid', contracts[0].BidPrice)
self.Plot('Option Price', 'Option Price', contracts[0].UnderlyingLastPrice)
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}')