class SwimmingYellowGreenDogfish(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 1, 21)
self.SetCash(100000)
self.dataBySymbol = {}
self.AddUniverse(self.MyCoarseFilterFunction)
self.UniverseSettings.Resolution = Resolution.Daily
def MyCoarseFilterFunction(self, coarse):
sortedByDollarVolume = sorted(coarse, key=lambda x: x.DollarVolume, reverse=True)
filtered = [ x.Symbol for x in sortedByDollarVolume
if x.Price > 10 and x.DollarVolume > 10000000 ]
return filtered[:10]
def OnData(self, data):
for symbol in self.dataBySymbol:
if self.dataBySymbol[symbol].IsReady:
self.Debug("sharpe ratio of "+str(symbol)+" is "+str(self.dataBySymbol[symbol].sharpe.Current.Value))
def OnSecuritiesChanged(self, changes):
for x in changes.AddedSecurities:
if x.Symbol not in self.dataBySymbol:
self.dataBySymbol[x.Symbol] = SymbolData(self,x.Symbol)
for x in changes.RemovedSecurities:
data = self.dataBySymbol.get(x.Symbol,None)
if data:
data.dispose()
class SymbolData:
def __init__(self,algo,symbol):
self.algo = algo
self.symbol = symbol
self.sharpe = SharpeRatio(7,0.1)
history = self.algo.History(self.symbol,7,Resolution.Daily)
if not history.empty and 'close' in history.columns:
for bar in history.loc[symbol, :].itertuples():
self.sharpe.Update(bar.Index,bar.close)
self.consolidator = TradeBarConsolidator(timedelta(days = 1))
self.consolidator.DataConsolidated += self.OnDataConsolidated
algo.SubscriptionManager.AddConsolidator(self.symbol, self.consolidator)
@property
def IsReady(self):
return self.sharpe.IsReady
def OnDataConsolidated(self,sender,bar):
self.sharpe.Update(bar.Time,bar.Close)
def dispose(self):
self.algo.SubscriptionManager.RemoveConsolidator(self.symbol, self.consolidator)