| Overall Statistics |
|
Total Trades 852 Average Win 1.05% Average Loss -1.08% Compounding Annual Return 7.568% Drawdown 23.500% Expectancy 0.233 Net Profit 158.251% Sharpe Ratio 0.57 Probabilistic Sharpe Ratio 2.915% Loss Rate 38% Win Rate 62% Profit-Loss Ratio 0.97 Alpha 0.012 Beta 0.476 Annual Standard Deviation 0.1 Annual Variance 0.01 Information Ratio -0.349 Tracking Error 0.105 Treynor Ratio 0.12 Total Fees $3344.64 Estimated Strategy Capacity $760000000.00 Lowest Capacity Asset SPY R735QTJ8XC9X Portfolio Turnover 15.23% |
import numpy as np
from QuantConnect.Algorithm import QCAlgorithm
from QuantConnect.Indicators import *
from QuantConnect import Resolution
from QuantConnect.Data.Market import TradeBar
class RsiCloseAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2010, 1, 1) # Set the start date for backtesting
self.SetEndDate(2023, 1, 1) # Set the end date for backtesting
self.SetCash(100000) # Set the initial cash balance for backtesting
# Define the symbol we want to trade
self.symbol = self.AddEquity("SPY", Resolution.Daily).Symbol
# RSI parameters
self.rsi_period = 2
self.rsi_lower = 15
# Set up the RSI indicator
self.rsi = self.RSI(self.symbol, self.rsi_period, MovingAverageType.Simple, Resolution.Daily)
# Initialize a RollingWindow to keep track of past TradeBars
self.barWindow = RollingWindow[TradeBar](2)
def OnData(self, data):
# Add the current TradeBar to the RollingWindow
self.barWindow.Add(data[self.symbol])
# Skip if the RollingWindow is not ready
if not self.barWindow.IsReady:
return
# Get the past high price from the RollingWindow
pastHigh = self.barWindow[1].High
# Check if RSI is lower than the defined threshold
if self.rsi.Current.Value < self.rsi_lower:
self.SetHoldings(self.symbol, 1.0)
# Check if today's close is higher than yesterday's high
if self.Portfolio[self.symbol].Invested and self.Securities[self.symbol].Close > pastHigh:
self.Liquidate(self.symbol)
# Plot RSI on chart
self.Plot("Indicators", "RSI", self.rsi.Current.Value)
self.Plot("Indicators", "Oversold Level", self.rsi_lower)