Overall Statistics |
Total Trades 146 Average Win 12.54% Average Loss -4.07% Compounding Annual Return 6.531% Drawdown 82.000% Expectancy 0.782 Net Profit 341.654% Sharpe Ratio 0.348 Probabilistic Sharpe Ratio 0.018% Loss Rate 56% Win Rate 44% Profit-Loss Ratio 3.08 Alpha 0.091 Beta -0.057 Annual Standard Deviation 0.247 Annual Variance 0.061 Information Ratio 0.005 Tracking Error 0.309 Treynor Ratio -1.513 Total Fees $202.99 Estimated Strategy Capacity $450000000000.00 Lowest Capacity Asset CTIC R735QTJ8XC9X |
from Selection.QC500UniverseSelectionModel import QC500UniverseSelectionModel class CalibratedOptimizedCompensator(QCAlgorithm): def Initialize(self): # self.SetStartDate(2019, 8, 16) # Set Start Date # self.SetEndDate(2019, 9, 28) self.SetCash(100000) # Set Strategy Cash # Set QC500 Universe Selection Model self.SetUniverseSelection(QC500UniverseSelectionModel()) self.UniverseSettings.Resolution = Resolution.Daily # Dictionary to hold SecurityData self.data = {} self.SetWarmUp(365) self.lookback = 365 self.num_long = 5 self.SetBenchmark("SPY") self.rebalance = True self.last_trade = 0 def OnData(self, data): self.last_trade += 1 if self.last_trade == 30: self.last_trade = 0 self.rebalance = True if not self.rebalance: return # Sorted by MOM sortedByMOM = sorted(list(self.data.keys()), key=lambda k : self.data[k].mom.Current.Value, reverse=True) # Select top self.num_long symbols selected = sortedByMOM[:self.num_long] # Liquidate outdated symbols for kvp in self.Portfolio: symbol = kvp.Key holding = kvp.Value if symbol not in selected and holding.Invested: self.Liquidate(symbol) # Set holdings to selected symbols for symbol in selected: if not self.Portfolio[symbol].Invested: self.SetHoldings(symbol, 1/self.num_long) self.rebalance = False def OnSecuritiesChanged(self, changes): for security in changes.AddedSecurities: symbol = security.Symbol if symbol not in self.data: self.data[symbol] = SecurityData(self, symbol, security) class SecurityData: def __init__(self, algorithm, symbol, security): self.algorithm = algorithm self.symbol = symbol self.security = security self.mom = algorithm.MOM(symbol, 365, Resolution.Daily) # Initialize MOM indicator with historical data history = algorithm.History(symbol, 365, Resolution.Daily) if not history.empty: history = history.close.unstack(0) if not history.empty: df = history[symbol] for time, close in df.iteritems(): self.mom.Update(time, close)