| Overall Statistics |
|
Total Trades 17 Average Win 1.80% Average Loss -0.62% Compounding Annual Return 8.018% Drawdown 13.000% Expectancy 0.306 Net Profit 8.018% Sharpe Ratio 0.544 Probabilistic Sharpe Ratio 28.632% Loss Rate 67% Win Rate 33% Profit-Loss Ratio 2.92 Alpha -0.012 Beta 0.37 Annual Standard Deviation 0.113 Annual Variance 0.013 Information Ratio -1.081 Tracking Error 0.126 Treynor Ratio 0.167 Total Fees $17.87 Estimated Strategy Capacity $61000000.00 Lowest Capacity Asset EBAY REC37LGZ79T1 |
# region imports
from AlgorithmImports import *
# endregion
class CGPT(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 1, 1) # Set Start Date
self.SetEndDate(2022, 1, 1) # Set End Date
self.SetCash(100000) # Set Strategy Cash
self.UniverseSettings.Resolution = Resolution.Daily
filter_function = lambda constituents: [x.Symbol for x in constituents]
universe = self.Universe.ETF("QQQ", Market.USA, self.UniverseSettings, filter_function)
self.AddUniverse(universe)
# list_equities = ['AAPL','MSFT']
# for ticker in list_equities:
# self.AddEquity(ticker, Resolution.Daily)
self.lookback = 50
self.SetWarmup(100)
self.rolling_closes = dict()
self.sma = dict()
self.open_positions = 0
self.target_positions = 5
def OnSecuritiesChanged(self, changes):
for security in changes.AddedSecurities:
symbol = security.Symbol
self.rolling_closes[symbol] = RollingWindow[float](self.lookback)
self.sma[symbol] = self.SMA(symbol, 200)
def OnData(self, data: Slice):
if self.open_positions < self.target_positions:
for symbol in self.ActiveSecurities.Keys:
if data.ContainsKey(symbol) and data[symbol] is not None:
try:
self.rolling_closes[symbol].Add(data[symbol].Close)
except:
self.temp = 1
if (self.rolling_closes[symbol].Count < 50) or self.IsWarmingUp:
return
momentum = self.rolling_closes[symbol][0] - self.rolling_closes[symbol][49]
long_entry = momentum > 0
short_entry = momentum < 0
proportion = round(1/self.target_positions,2)
if long_entry and not self.Portfolio[symbol].Invested:
self.SetHoldings(symbol,proportion,tag='Momentum > 0')
self.open_positions += 1
elif short_entry and not self.Portfolio[symbol].Invested:
self.SetHoldings(symbol,-1*proportion,tag='Momentum < 0')
self.open_positions += 1
else:
for symbol in self.Portfolio.Keys:
if (self.Portfolio[symbol].Quantity > 0):
if (self.rolling_closes[symbol][0] < self.sma[symbol].Current.Value):
self.SetHoldings(symbol,0,tag='Price below SMA')
self.open_positions -= 1
elif (self.Portfolio[symbol].Quantity < 0):
if (self.rolling_closes[symbol][0] > self.sma[symbol].Current.Value):
self.SetHoldings(symbol,0,tag='Price above SMA')
self.open_positions -= 1