Overall Statistics |
Total Trades 1155 Average Win 0.00% Average Loss 0.00% Compounding Annual Return -2.602% Drawdown 1.400% Expectancy -0.822 Net Profit -1.313% Sharpe Ratio -6.437 Probabilistic Sharpe Ratio 0.000% Loss Rate 93% Win Rate 7% Profit-Loss Ratio 1.53 Alpha -0.021 Beta -0.003 Annual Standard Deviation 0.003 Annual Variance 0 Information Ratio -1.38 Tracking Error 0.105 Treynor Ratio 7.36 Total Fees $1155.00 |
class TachyonDynamicPrism(QCAlgorithm): def Initialize(self): self.SetStartDate(2019, 9, 2) # Set Start Date self.SetCash(100000) # Set Strategy Cash self.AddUniverse(self.SelectCoarse) # Dictionary keyed by symbol and will hold SymbolData objects self.symboldict = {} def SelectCoarse(self, coarse): # Get top 1000 liquid symbols sortedCoarse = sorted(coarse, key=lambda c:c.DollarVolume, reverse=True) liquidSymbols = sortedCoarse[:1000] # Get symbols we need to initialize symbols = [c.Symbol for c in liquidSymbols if c.Symbol not in self.symboldict] # 1 day history call for symbols that we need to initialize history = self.History(symbols, 1, 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: # Create SymbolData object and store in dictionary self.symboldict[symbol] = SymbolData(symbol, df) # Update daily returns for c in coarse: symbol = c.Symbol if symbol in self.symboldict: self.symboldict[symbol].Update(c.AdjustedPrice) # filter for symbols with more than 10% gains since last close filteredSymbols = [symbol for symbol, data in self.symboldict.items() if data.IsReady and data.dailyReturn > 0.10] return filteredSymbols def OnSecuritiesChanged(self, changes): for security in changes.AddedSecurities: symbol = security.Symbol # Buy 1 share if security is added to our universe self.MarketOrder(symbol, 1) for security in changes.RemovedSecurities: symbol = security.Symbol # Liquidate if security removed from universe self.Liquidate(symbol) class SymbolData: def __init__(self, symbol, history): self.symbol = symbol self.dailyReturn = -1 self.lastClose = -1 # initialize last close with historical data for time, close in history.iteritems(): self.lastClose = close def Update(self, close): self.dailyReturn = (close - self.lastClose)/self.lastClose self.lastClose = close @property def IsReady(self): return self.dailyReturn != -1 and self.lastClose != -1