Overall Statistics |
Total Trades 3662 Average Win 0.19% Average Loss -0.15% Compounding Annual Return 23.050% Drawdown 30.700% Expectancy 0.079 Net Profit 21.039% Sharpe Ratio 0.843 Probabilistic Sharpe Ratio 39.930% Loss Rate 53% Win Rate 47% Profit-Loss Ratio 1.29 Alpha 0.229 Beta 0.003 Annual Standard Deviation 0.273 Annual Variance 0.074 Information Ratio 0.088 Tracking Error 0.416 Treynor Ratio 68.301 Total Fees $4113.12 |
from Execution.ImmediateExecutionModel import ImmediateExecutionModel class InterdayMeanReversion(QCAlgorithm): def Initialize(self): self.SetStartDate(2020, 1, 1) # Set Start Date self.SetEndDate(2020, 12, 1) #. Set End Date self.SetCash(100000) # Set Strategy Cash self.UniverseSettings.Resolution = Resolution.Daily self.AddUniverse(self.Universe.Index.QC500) self.AddAlpha(ImrAlphaModel()) self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel()) self.SetExecution(ImmediateExecutionModel()) self.SetBenchmark("SPY") class ImrAlphaModel(AlphaModel): def __init__(self): self.momp = {} self.momp_period = 5 self.effect_period = 5 self.num_of_selected_long = 10 self.num_of_selected_short = 10 def OnSecuritiesChanged(self, algorithm, changes): for security in changes.AddedSecurities: symbol = security.Symbol self.momp[symbol] = algorithm.MOMP(symbol, self.momp_period, Resolution.Daily) for security in changes.RemovedSecurities: mompInd = self.momp.pop(security.Symbol, None) if mompInd is not None: algorithm.RemoveSecurity(security.Symbol) def Update(self, algorithm, data): if algorithm.Time.weekday() != 0: return [] insights = [] insight_magnitude = {symbol: -1 * fiveDayPctMomentum.Current.Value for (symbol, fiveDayPctMomentum) in self.momp.items()} sorted_insight = sorted(insight_magnitude.items(), key = lambda item: item[1], reverse=True) top_pos_insight = sorted_insight[:self.num_of_selected_long] top_neg_insight = sorted_insight[-self.num_of_selected_short:] for symbol, signal in top_pos_insight: insights.append(Insight.Price(symbol, timedelta(self.effect_period), InsightDirection.Up)) for symbol, signal in top_neg_insight: insights.append(Insight.Price(symbol, timedelta(self.effect_period), InsightDirection.Down)) return Insight.Group(insights)