| Overall Statistics |
|
Total Trades 966 Average Win 0.30% Average Loss -0.38% Compounding Annual Return -44.113% Drawdown 37.800% Expectancy -0.169 Net Profit -25.178% Sharpe Ratio -0.94 Probabilistic Sharpe Ratio 5.074% Loss Rate 54% Win Rate 46% Profit-Loss Ratio 0.80 Alpha -0.374 Beta 0.113 Annual Standard Deviation 0.362 Annual Variance 0.131 Information Ratio -1.708 Tracking Error 0.377 Treynor Ratio -3.014 Total Fees $989.42 Estimated Strategy Capacity $15000000.00 Lowest Capacity Asset ALXN 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):
sortedByDollarVolume = sorted(coarse, key=lambda x: x.DollarVolume, reverse=True)
filtered = [ x for x in sortedByDollarVolume
if x.Price > 10 and x.DollarVolume > 10000000 ]
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 and self.dataBySymbol[x.Symbol].roc.Current.Value>0.2:
self.selected.append(x.Symbol)
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.symbol = symbol
history = algo.History(symbol,252,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