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 -3.118 Tracking Error 0.14 Treynor Ratio 0 Total Fees $0.00 |
import pandas as pd def oc_to_df(optionchain): """ Converts OptionChain data to a Pandas DataFrame """ return pd.DataFrame([[x.Right, float(x.Strike), x.Expiry, float(x.BidPrice), float(x.AskPrice), float(x.LastPrice), float(x.UnderlyingLastPrice), float(x.TheoreticalPrice), float(x.OpenInterest), float(x.Volume), float(x.ImpliedVolatility), float(x.Greeks.Delta), float(x.Greeks.Gamma), float(x.Greeks.Vega), float(x.Greeks.Theta), float(x.Greeks.Rho) ] for x in optionchain], index=[x.Symbol.Value for x in optionchain], columns=['Type', 'Strike', 'Expiry', 'Bid', 'Ask', 'Last', 'UnderLast', 'Theo,', 'OI', 'Volume', 'IV', 'Delta', 'Gamma', 'Vega', 'Theta', 'Rho' ])
""" Notes: - Figure out why greeks are not working """ from QuantConnect.Securities.Option import OptionPriceModels from datetime import timedelta import pandas as pd from optutils import oc_to_df class ZeroDTE(QCAlgorithm): def Initialize(self): self.SetStartDate(2019, 10, 7) self.SetEndDate(2019, 10, 14) self.SetCash(100000) self.count = 0 self.ticker = 'SPY' # Note: They don't seem to have index option data. No SPX! under = self.AddEquity(self.ticker, Resolution.Minute) under.SetDataNormalizationMode(DataNormalizationMode.Raw) # IMPORTANT: default option = self.AddOption(self.ticker, Resolution.Minute) # set our strike/expiry filter for this option chain option.SetFilter(lambda universe: universe\ .IncludeWeeklys()\ .Strikes(-50, 50)\ .Expiration(timedelta(0), timedelta(0))) option.PriceModel = OptionPriceModels.CrankNicolsonFD() # Warmup is needed for Greeks calcs self.SetWarmUp(timedelta(10)) def OnData(self, slice): if self.IsWarmingUp: return if self.HourMinuteIs(10, 00): self.Debug(f'{self.Time}, # of Chains: {len(slice.OptionChains)}') if len(slice.OptionChains) == 1: for kvp in slice.OptionChains: df = oc_to_df(kvp.Value) self.Debug(f'# of Contracts: {len(df.index)}') self.Debug(f'{df.head()}') self.Debug(f'Min Delta: {min(df.Delta)}, Max Delta: {max(df.Delta)}') self.Debug(f'Min IV: {min(df.IV)}, Max IV: {max(df.IV)}') def HourMinuteIs(self, hour, minute): return self.Time.hour == hour and self.Time.minute == minute def OnOrderEvent(self, orderEvent): self.Debug(f'{self.time} Order Event: {orderEvent}') def OnAssignmentOrderEvent(self, assignmentEvent): self.Debug(f'{self.time} Assignment Event: {assignmentEvent}')