| Overall Statistics |
|
Total Trades 363 Average Win 0.01% Average Loss -0.01% Compounding Annual Return -0.310% Drawdown 0.400% Expectancy -0.275 Net Profit -0.330% Sharpe Ratio -0.584 Probabilistic Sharpe Ratio 2.470% Loss Rate 74% Win Rate 26% Profit-Loss Ratio 1.78 Alpha -0.002 Beta 0.007 Annual Standard Deviation 0.004 Annual Variance 0 Information Ratio 0.386 Tracking Error 0.197 Treynor Ratio -0.307 Total Fees $363.00 Estimated Strategy Capacity $470000000.00 Lowest Capacity Asset TGTX VGZQ8WW1GODH |
from AlgorithmImports import *
from QuantConnect.Orders import *
class MyQC500UniverseSelectionModel(QC500UniverseSelectionModel):
def SelectCoarse(self, algorithm, coarse):
# Filter out securities that have a closing price less than $10
filteredCoarse = [x for x in coarse if x.Price > 10]
return filteredCoarse
class CalibratedOptimizedCompensator(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2022, 1, 1) # Set Start Date
self.SetCash(100000) # Set Strategy Cash
# Set QC500 Universe Selection Model
self.SetUniverseSelection(MyQC500UniverseSelectionModel())
self.AddSecurity(SecurityType.Equity, 'SJI R735QTJ8XC9X', Resolution.Daily)
# Dictionary to hold SecurityData
self.data = {}
self.portfolio_count = 0
def OnData(self, data):
sortedByMOM = [k for k in self.data.keys() if self.data[k].mom is not None]
sortedByMOM = sorted(sortedByMOM, key=lambda k : self.data[k].mom.Current.Value, reverse=True)
# Select top 10 symbols
rankings = sortedByMOM[:10]
for symbol in rankings:
if data.ContainsKey(symbol) and self.data[symbol].sma45.Current.Value > self.data[symbol].sma44:
if not self.Portfolio[symbol].Invested and self.portfolio_count < 10:
self.portfolio_count += 1
self.SetHoldings(symbol, 1/len(self.Portfolio))
for kvp in self.Portfolio:
symbol = kvp.Key
if symbol not in rankings or self.data[symbol].sma45.Current.Value < self.data[symbol].sma44:
self.Liquidate(symbol)
self.portfolio_count = self.portfolio_count - 1
# if self.portfolio_count < 10:
# # Find the highest ranking symbol that meets the buying criteria and is not invested
# for new_symbol in rankings:
# if new_symbol not in self.Portfolio and data.ContainsKey(new_symbol) and self.data[new_symbol].sma45.Current.Value > self.data[new_symbol].sma44:
# self.SetHoldings(new_symbol, 1/len(self.Portfolio))
# self.portfolio_count += 1
# break
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.profitTarget = 0.0
self.entry_price = 0
# Retrieves ROIC fundamental
self.mom = algorithm.LOGR(symbol, 60, Resolution.Daily)
self.sma45 = algorithm.SMA(symbol,80,Resolution.Daily)
# self.sma44 = algorithm.SMA(symbol,79,Resolution.Daily)
# Initialize MOM indicator with historical data
history = algorithm.History(symbol,81, Resolution.Daily)
# Calculate the SMA for the previous day
self.sma44 = history.close.rolling(window=80).mean()[-1]
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)
self.sma45.Update(time,close)
# self.sma44.Update(time,close)
else:
self.mom = None
self.sma45 = None
self.sma44 = None