Overall Statistics |
Total Orders 629 Average Win 0.42% Average Loss -0.34% Compounding Annual Return 54.121% Drawdown 21.000% Expectancy 0.349 Start Equity 1000000 End Equity 1540602.90 Net Profit 54.060% Sharpe Ratio 1.5 Sortino Ratio 1.81 Probabilistic Sharpe Ratio 71.708% Loss Rate 40% Win Rate 60% Profit-Loss Ratio 1.24 Alpha 0.1 Beta 1.749 Annual Standard Deviation 0.217 Annual Variance 0.047 Information Ratio 1.362 Tracking Error 0.145 Treynor Ratio 0.186 Total Fees $1840.46 Estimated Strategy Capacity $9000000.00 Lowest Capacity Asset WMT R735QTJ8XC9X Portfolio Turnover 9.99% |
from datetime import timedelta from AlgorithmImports import * class Magnificent7IntradayStrategy(QCAlgorithm): def initialize(self): self.set_start_date(2023, 9, 1) self.set_end_date(2024, 9, 1) self.set_cash(1000000) self.symbols = [self.add_equity(ticker, Resolution.MINUTE).symbol for ticker in ["TSLA", "AMZN", "NFLX", "AAPL", "NVDA", "GOOGL", "MSFT", "META", "AVGO","WMT"]] self.rsi_indicators = {symbol: self.rsi(symbol, 14, MovingAverageType.WILDERS, Resolution.MINUTE) for symbol in self.symbols} self.sma_indicators = {symbol: self.sma(symbol, 200, Resolution.MINUTE) for symbol in self.symbols} self.schedule.on(self.date_rules.every_day(), self.time_rules.every(timedelta(minutes=15)), self.trade) self.set_universe_selection(ManualUniverseSelectionModel(*self.symbols)) self.set_portfolio_construction(EqualWeightingPortfolioConstructionModel()) self.set_execution(ImmediateExecutionModel()) # Schedule trading hours self.schedule.on(self.date_rules.every_day(), self.time_rules.every(timedelta(minutes=15)), self.trade) # Risk management self.set_risk_management(MaximumDrawdownPercentPerSecurity(0.02)) self.last_trade_date = {symbol: None for symbol in self.symbols} self.settings.minimum_order_margin_portfolio_percentage = 0 def trade(self): current_time = self.time if current_time.weekday() >= 5 or not (current_time.hour == 10 and current_time.minute >= 00): return for symbol in self.symbols: if not self.rsi_indicators[symbol].is_ready or not self.sma_indicators[symbol].is_ready: continue price = self.securities[symbol].price rsi_value = self.rsi_indicators[symbol].current.value sma_value = self.sma_indicators[symbol].current.value if self.last_trade_date[symbol] == current_time.date(): continue if rsi_value < 35 and price < sma_value: self.set_holdings(symbol, 0.15) self.last_trade_date[symbol] = current_time.date() if self.portfolio[symbol].invested: if price >= rsi_value > 80: self.liquidate(symbol) self.last_trade_date[symbol] = current_time.date() # Update trade date on exit