Overall Statistics |
Total Trades 257 Average Win 0.90% Average Loss -0.42% Compounding Annual Return 12.366% Drawdown 12.400% Expectancy 0.353 Net Profit 19.968% Sharpe Ratio 1.093 Probabilistic Sharpe Ratio 51.399% Loss Rate 57% Win Rate 43% Profit-Loss Ratio 2.15 Alpha 0.087 Beta 0.179 Annual Standard Deviation 0.12 Annual Variance 0.014 Information Ratio -0.455 Tracking Error 0.252 Treynor Ratio 0.734 Total Fees $382.88 |
class EMVIndicatorAlpha(QCAlgorithm): def Initialize(self): self.SetStartDate(2019, 1, 1) self.SetEndDate(2020, 7, 24) self.SetCash(100000) self.tickers = ["SPY"] for ticker in self.tickers: self.AddEquity(ticker, Resolution.Hour) self.portfolioPercentage = 1/len(self.tickers) self.lastday = None self.symbolDataBySymbol = {} self.emvIndicator(self.tickers) EMVPlot = Chart("EMV Plot") EMVPlot.AddSeries(Series("Buy", SeriesType.Scatter, 0)) EMVPlot.AddSeries(Series("Short", SeriesType.Scatter, 0)) EMVPlot.AddSeries(Series("Sell", SeriesType.Scatter, 0)) EMVPlot.AddSeries(Series("Price", SeriesType.Line, 0)) self.AddChart(EMVPlot) EMVValuePlot = Chart("EMV Value Plot") EMVValuePlot.AddSeries(Series("EMV", SeriesType.Line, 0)) self.AddChart(EMVValuePlot) self.SetWarmUp(timedelta(days=2)) def OnData(self, data): if self.IsWarmingUp: return day= self.Time.day if day == self.lastday: return self.lastday = day self.emvIndicator(self.tickers) for ticker, info in self.symbolDataBySymbol.items(): '''Enters a long or short position''' if info.EMV > 0 and not self.Portfolio[ticker].Invested: self.SetHoldings(ticker, self.portfolioPercentage) self.Plot("EMV Plot", "Buy", self.Securities[ticker].Close) if info.EMV < 0 and not self.Portfolio[ticker].Invested: self.SetHoldings(ticker, -(self.portfolioPercentage)/20) #Allows 5% of portfolioPercentage to short self.Plot("EMV Plot", "Short", self.Securities[ticker].Close) '''Liquidates a long or short position''' if info.EMV < 0 and self.Portfolio[ticker].IsLong: self.Liquidate(ticker) self.Plot("EMV Plot", "Sell", self.Securities[ticker].Close) if info.EMV > 0 and self.Portfolio[ticker].IsShort: self.Liquidate(ticker) self.Plot("EMV Plot", "Sell", self.Securities[ticker].Close) self.Plot("EMV Plot", "Price", self.Securities[ticker].Close) self.Plot("EMV Value Plot", "EMV", float(info.EMV)) def emvIndicator(self, tickers): self.df = self.History(tickers, 2, Resolution.Daily) for ticker in tickers: if not self.df.empty: currentSymbolData = self.df.loc[ticker] '''Calculation for Ease of Movement Value''' mov_mid_today = (currentSymbolData["high"][1] + currentSymbolData["low"][1]) / 2 mov_mid_yesterday = (currentSymbolData["high"][0] + currentSymbolData["low"][0]) / 2 MID = mov_mid_today - mov_mid_yesterday t_vol = self.Securities[ticker].Volume ratio = (t_vol/10000) / (currentSymbolData["high"][1] - currentSymbolData["low"][1]) EMV = MID/ratio else: EMV = 0 self.symbolDataBySymbol[ticker] = SymbolData(ticker, EMV) class SymbolData: def __init__(self, symbol, EMV): self.Symbol = symbol self.EMV = EMV