| Overall Statistics |
|
Total Orders 567 Average Win 0.35% Average Loss -0.47% Compounding Annual Return 28.547% Drawdown 12.500% Expectancy 0.200 Start Equity 10000 End Equity 12834.06 Net Profit 28.341% Sharpe Ratio 1.119 Sortino Ratio 1.252 Probabilistic Sharpe Ratio 67.225% Loss Rate 31% Win Rate 69% Profit-Loss Ratio 0.74 Alpha 0.049 Beta 0.757 Annual Standard Deviation 0.132 Annual Variance 0.018 Information Ratio 0.164 Tracking Error 0.107 Treynor Ratio 0.196 Total Fees $567.00 Estimated Strategy Capacity $4700000.00 Lowest Capacity Asset ORCL R735QTJ8XC9X Portfolio Turnover 14.75% |
from AlgorithmImports import *
class RsiStrategyAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2023, 1, 1)
self.SetEndDate(2023, 12, 31)
self.SetCash(10000)
self.tickers = ["TSLA", "GOOGL", "NVDA", "MSFT", "META", "HIMS", "UPST", "ORCL", "COIN", "AMD"]
self.symbols = []
self.rsi = {}
for ticker in self.tickers:
symbol = self.AddEquity(ticker, Resolution.Minute).Symbol
self.symbols.append(symbol)
# Create a 15-minute consolidator for each symbol
consolidator = TradeBarConsolidator(timedelta(minutes=15))
self.SubscriptionManager.AddConsolidator(symbol, consolidator)
# Attach RSI to each consolidator
rsi = RelativeStrengthIndex(14, MovingAverageType.Wilders)
self.rsi[symbol] = rsi
self.RegisterIndicator(symbol, rsi, consolidator)
consolidator.DataConsolidated += self.OnDataConsolidated
def OnDataConsolidated(self, sender, bar):
symbol = bar.Symbol
rsi = self.rsi[symbol]
if not rsi.IsReady:
return
rsi_value = rsi.Current.Value
holdings = self.Portfolio[symbol].Quantity
if rsi_value <= 30 and holdings == 0:
self.SetHoldings(symbol, 0.1)
self.Debug(f"{self.Time} BUY {symbol.Value} | RSI: {rsi_value:.2f}")
elif rsi_value >= 70 and holdings > 0:
self.Liquidate(symbol)
self.Debug(f"{self.Time} SELL {symbol.Value} | RSI: {rsi_value:.2f}")
def OnData(self, data):
pass