| Overall Statistics |
|
Total Orders 4561 Average Win 0.16% Average Loss -0.12% Compounding Annual Return -10.878% Drawdown 31.500% Expectancy -0.060 Start Equity 100000 End Equity 82805.52 Net Profit -17.194% Sharpe Ratio -0.606 Sortino Ratio -0.701 Probabilistic Sharpe Ratio 2.003% Loss Rate 60% Win Rate 40% Profit-Loss Ratio 1.33 Alpha -0.263 Beta 1.085 Annual Standard Deviation 0.187 Annual Variance 0.035 Information Ratio -1.708 Tracking Error 0.147 Treynor Ratio -0.104 Total Fees $6134.40 Estimated Strategy Capacity $14000000.00 Lowest Capacity Asset BHGE WLXQGVHQ03MT Portfolio Turnover 50.61% |
# region imports
from AlgorithmImports import *
# endregion
class TechnicalUniverseOnEtfConstituentsAlgorithm(QCAlgorithm):
def initialize(self):
self.set_start_date(2023, 1, 1)
etf = Symbol.create('QQQ', SecurityType.EQUITY, Market.USA)
self._universe = self.add_universe(self.universe.etf(etf, universe_filter_func=self._select_assets))
self.schedule.on(self.date_rules.every_day(etf), self.time_rules.after_market_open(etf, 1), self._trade)
self._rsi_period = self.get_parameter('rsi_period', 14)
self._rsi_threshold = self.get_parameter('rsi_threshold', 30)
def _select_assets(self, constituents):
symbols = []
for c in constituents:
history = self.indicator_history(RelativeStrengthIndex(self._rsi_period), c.symbol, 1, Resolution.DAILY).current
if history and history[-1].value < self._rsi_threshold:
symbols.append(c.symbol)
return symbols
def _trade(self):
if not list(self._universe.selected): return
weight = 1 / len(list(self._universe.selected))
self.set_holdings([PortfolioTarget(symbol, weight) for symbol in self._universe.selected], True)