| 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 -35.258 Tracking Error 0.101 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 |
from QuantConnect.Securities.Option import OptionPriceModels
class SleepyFluorescentOrangeMonkey(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 2, 1)
self.SetEndDate(2021, 2, 5)
equity = self.AddEquity("SPY", Resolution.Minute)
option = self.AddOption("SPY", Resolution.Minute)
self.symbol = option.Symbol
option.PriceModel = OptionPriceModels.CrankNicolsonFD()
option.SetFilter(self.UniverseFunc)
#option.SetFilter(-2,2, timedelta(0), timedelta(180))
self.SetWarmUp(30, Resolution.Daily)
self.day = 0
self.exp = 0
self.strike = 0
self.lors = None
self.calls = None
def UniverseFunc(self, universe):
# include weekly contracts
return universe.IncludeWeeklys().Expiration(TimeSpan.FromDays(2),
TimeSpan.FromDays(40)).Strikes(-30,30)
def OnData(self, data):
#if not data.ContainsKey(self.vx1):
# return
if self.IsWarmingUp: return
if self.day == self.Time.day:
return
self.day = self.Time.day
if(data.HasData) :
for kvp in data.OptionChains.Values:
chains = kvp
if kvp.Contracts.Count < 1: continue
calls = list(filter(lambda x: x.Right == OptionRight.Call, chains))
puts = list(filter(lambda x: x.Right == OptionRight.Put, chains))
#self.underlying_price = self.Securities[self.spy].Price
self.underlying_price = self.Securities[self.symbol].Price
expiries = [i.Expiry for i in puts]
strikes = [i.Strike for i in puts]
if len(expiries) < 2:
return
strike = min(strikes, key=lambda x: abs(x-self.underlying_price * float(0.97) ))
self.atm_call = [i for i in chains if i.Expiry == expiries[0] and i.Strike == strike]
self.atm_put = [i for i in chains if i.Expiry ==expiries[0] and i.Strike ==strike]
calls = [i for i in chains if i.Expiry == expiries[1] and i.Strike == strike]
puts = [i for i in chains if i.Expiry ==expiries[1] and i.Strike ==strike]
if len(self.atm_call) <1 or len(calls) < 1:
return
if calls[0].ImpliedVolatility == 0.0:
return
self.first = self.atm_call[0].ImpliedVolatility
self.second = calls[0].ImpliedVolatility
self.Log(f"First: {self.atm_call[0].Symbol} ({self.first}); Second: {calls[0].Symbol} ({self.second})")