| 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