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