| 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 -29.365 Tracking Error 0.052 Treynor Ratio 0 Total Fees $0.00 |
from datetime import *
import math
import QuantConnect
from QuantConnect.Securities import *
from QuantConnect.Algorithm.Selection import *
class ResistanceUncoupledAutosequencers(QCAlgorithm):
symbolsToConsider = 20
optionChainRcvd = {}
def Initialize(self):
self.SetStartDate(2018, 1, 1)
self.SetEndDate(2018, 1, 13)
self.SetCash(100000)
self.UniverseSettings.Resolution = Resolution.Minute
self.UniverseSettings.FillForward = True
self.UniverseSettings.Leverage = 10/3
self.UniverseSettings.DataNormalizationMode = DataNormalizationMode.Raw
self.UniverseSettings.MinimumTimeInUniverse = timedelta(minutes=1)
coarseUniverse = self.AddUniverse(self.CoarseFilter)
self.AddUniverseOptions(coarseUniverse, self.OptionFilter)
def OptionFilter(self, optionFilterUniverse):
return optionFilterUniverse.IncludeWeeklys().Expiration(0, 1)
def CoarseFilter(self, coarse):
# Need to do universe selection on Thursday in order to get the ticks for open interest on Friday at midnight.
# So on Friday, we return Universe.Unchanged, on Thursday we do the selection, and we return an empty list
# on all other days.
if self.Time.weekday() == 4:
return Universe.Unchanged
if self.Time.weekday() != 3:
return []
self.optionChainRcvd = {}
friday = self.Time.date() + timedelta(days = (4-self.Time.weekday()) % 7) # https://stackoverflow.com/questions/8801084/how-to-calculate-next-friday
equities = [c for c in coarse if c.Symbol.SecurityType == SecurityType.Equity and c.HasFundamentalData and c.Price > 10]
sortedByVolume = sorted(equities, reverse=True, key=lambda x: x.Volume)
hasOptionsExpiringFriday = []
for c in sortedByVolume[:20]:
optionSymbols = self.OptionChainProvider.GetOptionContractList(c.Symbol, self.Time)
optionsExpiringFriday = [os for os in optionSymbols if os.ID.Date.date() == friday]
if len(optionsExpiringFriday) > 0:
securityExchangeHours = self.MarketHoursDatabase.GetExchangeHours(c.Market, c.Symbol, c.Symbol.SecurityType)
previousMarketOpen = securityExchangeHours.GetNextMarketOpen(securityExchangeHours.GetPreviousTradingDay(self.Time), False)
# Have to start at midnight in order for openinterest data to arrive
df = self.History(optionsExpiringFriday, previousMarketOpen.date(), previousMarketOpen+timedelta(minutes=1), Resolution.Minute)
if "openinterest" in df:
totalOpenInterest = df["openinterest"].sum()
hasOptionsExpiringFriday.append((c.Symbol, totalOpenInterest, c.Volume, optionsExpiringFriday))
sortedByRatio = sorted(hasOptionsExpiringFriday, reverse=True, key=lambda x: x[1]/x[2])
#self.Debug(f"sorted by ratio: {[(str(a), b, c) for (a,b,c,d) in sortedByRatio[:self.symbolsToConsider]]}")
return [x[0] for x in sortedByRatio[:self.symbolsToConsider]]
def OnData(self, slice):
# Only care about Fridays (when options expire)
if self.Time.weekday() != 4:
return
for symbol in slice.OptionChains.Keys:
if symbol not in self.optionChainRcvd:
self.optionChainRcvd[symbol] = self.Time
if self.Time.hour == 15 and self.Time.minute == 59:
for symbol in self.ActiveSecurities.Keys:
if symbol.SecurityType == SecurityType.Equity:
gotOptionChainAt = None
for optionSymbol, time in self.optionChainRcvd.items():
if optionSymbol.HasUnderlyingSymbol(symbol):
gotOptionChainAt = time
self.Debug(f"{symbol} gotOptionChainAt={gotOptionChainAt}")