| Overall Statistics |
|
Total Trades 237 Average Win 2.84% Average Loss -2.22% Compounding Annual Return 28.003% Drawdown 50.500% Expectancy 0.160 Net Profit 13.250% Sharpe Ratio 0.945 Probabilistic Sharpe Ratio 40.125% Loss Rate 49% Win Rate 51% Profit-Loss Ratio 1.28 Alpha 1.103 Beta -0.781 Annual Standard Deviation 0.925 Annual Variance 0.856 Information Ratio 0.616 Tracking Error 0.944 Treynor Ratio -1.119 Total Fees $1131.12 Estimated Strategy Capacity $430000.00 Lowest Capacity Asset NE R735QTJ8XC9X |
class PensiveBlackSalamander(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 1, 28)
self.SetCash(100000)
self.AddUniverse(self.MyCoarseFilterFunction)
self.selected = []
self.UniverseSettings.Resolution = Resolution.Daily
self.dataBySymbol = {}
self.AddEquity("SPY")
self.Schedule.On(self.DateRules.MonthStart("SPY"), \
self.TimeRules.AfterMarketOpen("SPY"), \
self.liquidate)
def liquidate(self):
self.Liquidate()
def MyCoarseFilterFunction(self, coarse):
filtered = [ x for x in coarse
if x.Price > 10 and x.DollarVolume > 10000000 ]
# probably want some different logic for filtered or none at all
# filtered = filtered[:20]
self.selected = []
for x in filtered:
if x.Symbol not in self.dataBySymbol:
self.dataBySymbol[x.Symbol] = SymbolData(self,x.Symbol)
self.dataBySymbol[x.Symbol].roc.Update(self.Time,x.Price)
if self.dataBySymbol[x.Symbol].IsReady:
#https://docs.python.org/3/library/heapq.html
self.selected.append(x.Symbol)
self.selected = sorted(self.selected,key = lambda x :self.dataBySymbol[x].rocd.Current.Value,reverse = True )[:5]
self.Debug(str(self.selected))
return self.selected
def OnData(self, data):
for symbol in self.selected:
if not self.Portfolio[symbol].Invested:
self.SetHoldings(symbol,1/len(self.selected))
def OnSecuritiesChanged(self,changes):
for x in changes.RemovedSecurities:
self.dataBySymbol.pop(x.Symbol,None)
self.Liquidate(x.Symbol)
class SymbolData:
def __init__(self,algo,symbol):
self.roc = RateOfChange(252)
self.rocd = IndicatorExtensions.Of(Delay(21), self.roc)
self.symbol = symbol
history = algo.History(symbol,273,Resolution.Daily)
if not history.empty:
for time, row in history.loc[symbol].iterrows():
self.roc.Update(time,row['close'])
@property
def IsReady(self):
return self.roc.IsReady
return self.rocd.IsReady