Overall Statistics |
Total Trades 820 Average Win 0.07% Average Loss -1.82% Compounding Annual Return 0% Drawdown 458.400% Expectancy -0.866 Net Profit -458.443% Sharpe Ratio -0.092 Probabilistic Sharpe Ratio 0.029% Loss Rate 87% Win Rate 13% Profit-Loss Ratio 0.04 Alpha -3.77 Beta 6.907 Annual Standard Deviation 10.82 Annual Variance 117.082 Information Ratio -0.13 Tracking Error 10.818 Treynor Ratio -0.145 Total Fees $820.00 Estimated Strategy Capacity $350000.00 Lowest Capacity Asset SNDE VOAMLVK3W485 |
class FocusedGreenDonkey(QCAlgorithm): def Initialize(self): self.SetStartDate(2019, 10, 12) self.SetCash(100000) self.AddUniverse(self.MyCoarseFilterFunction) self.symbolDataBySymbol = {} def MyCoarseFilterFunction(self,coarse): StocksUnder10 = [c for c in coarse if c.Price<10] symbols = [c.Symbol for c in StocksUnder10 if c.Symbol not in self.symbolDataBySymbol] history = self.History(symbols, 252, Resolution.Daily) if not history.empty: history = history.close.unstack(0) for symbol in symbols: if str(symbol) not in history: continue df = history[symbol].dropna() if not df.empty: self.symbolDataBySymbol[symbol] = SymbolData(self, symbol, df) for x in coarse: symbol = x.Symbol if symbol in self.symbolDataBySymbol: self.symbolDataBySymbol[symbol].Update(x.EndTime, x.AdjustedPrice) selectedSymbols = [symbol for symbol, symbolData in self.symbolDataBySymbol.items() if symbolData.HasNewMax and symbolData.rsi.Current.Value>80] return selectedSymbols def OnData(self, data): pass def OnSecuritiesChanged(self, changes): for security in changes.AddedSecurities: symbol = security.Symbol self.MarketOrder(symbol, 100) for security in changes.RemovedSecurities: symbol = security.Symbol self.Liquidate(symbol) class SymbolData: def __init__(self, algorithm, symbol, history): self.symbol = symbol self.max = Maximum(252) self.rsi = RelativeStrengthIndex(10, MovingAverageType.Simple) self.maxWindow = RollingWindow[IndicatorDataPoint](2) self.max.Updated += self.OnMax for time, close in history.iteritems(): self.Update(time, close) def OnMax(self, sender, updated): if self.max.IsReady: self.maxWindow.Add(updated) def Update(self, time, close): self.max.Update(time, close) self.rsi.Update(time,close) @property def HasNewMax(self): if self.maxWindow.IsReady: return self.maxWindow[0] > self.maxWindow[1] else: return False