19th Ave New York, NY 95822, USA

Does This Trading System Really Make 20% Per Year?

LOREM IPSUM DOLOR SIT AMET
AdobeStock_227897813

The trading website Finviz.com shows a simple strategy based on the RSI indicator with an annualised performance of 19.59% per pear.

The rules are to go long a stock from the S&P 500 when RSI(5) crosses under 20 and to sell when RSI(5) crosses back over 50. 

The following chart shows the backtest performance published on the Finviz website going back to 1996:

RSI(5) system from finviz.com

As you can see, the rules are almost too simple to be taken seriously. 

However, the results are impressive and beat buy and hold by some margin. 

So does this strategy really make 20% per year or is there something else going on?

Replicating The Finviz RSI(5) Strategy

Looking at the backtest settings and the help page on the Finviz website, we can deduce that the rules of the trading strategy are as follows:

  • Buy = RSI(C,5) cross < Value(20)
  • Sell = RSI(C,5) cross > Value(50)
  • Universe: S&P 500 including delisted stocks
  • Date: 06/02/1996 – 12/31/2014
  • Liquidity: Minimum Volume: $10M
  • Transaction Cost: 0.05% Per Trade
  • Execution: Same day close

These rules are pretty clear but there are a couple of questions that are left unanswered. 

For example:

  • What starting capital is used in the simulation?
  • What position sizing is used?
  • How many stocks can be held at once?
  • Is there a ranking system for duplicate signals?

Closer inspection reveals that the backtest covers 63,668 trades and there seems to be no limit to the number of stocks held at one time.

For example, the following distribution shows that 435 unique stocks were traded on the 11th August 2011 which was the highest during the backtest period:

src: finviz.com

I think we can conclude from this that the simulation does not include any portfolio restraints. In other words, it takes every signal and there is no limit to how many stocks can be held at once. 

This is a good way to test the profitability of a trading rule, however, it is not the most realistic test and can lead to unreliable results.

For example, most traders are not going to have the ability or resources to buy 435 different stocks in one day. 

This issue is compounded since entries and exits are meant to be placed on the market close but you don’t know the correct RSI close value until the market has in fact closed. 

Furthermore, MOC orders must usually be sent 15 minutes before the actual market close. So what is to stop your stock from reversing in the last 15 minutes after you have already sent in your market order?

Our Trading Strategy Rules

Taking into account these issues I have set up my own backtest with some slight variations in the rules as follows:

  • Buy = RSI(C,5) cross < Value(20)
  • Sell = RSI(C,5) cross > Value(50)
  • Universe: S&P 500 including historical members
  • Date: 06/02/1996 – 07/01/2019
  • Liquidity: Minimum turnover: $10M
  • Transaction Cost: 0.05% per trade
  • Execution: Next day open
  • Starting Capital: $100,000
  • Max open positions: 25
  • Position size: 4% (equal weight)
  • Ranking: RSI(5) lowest first

Essentially, all I have done is to introduce some standard portfolio rules. Now we can hold no more than 25 stocks at any one time.

I have also made all entries and exits take place on the next day open and I have introduced a ranking that ranks any duplicate signals by RSI(5) with the lowest score being preferred first. 

Lastly, I have changed volume to turnover since volume can get distorted by stock splits.

Now we have these rules set up I feel we are able to backtest this strategy in a more realistic manner.  

Backtest Results

To test this system I opened up my backtesting software Amibroker with historical data from Norgate Data

I first ran an all trades test that tests every signal with a fixed position size of $1000. This will give us an idea of the profitability of the new rules.

Then I ran the full portfolio rules – a more realistic test using the full backtest settings described earlier.

All Trades Test Results

Following are the results from the all trades test – trading every setup with a fixed position size of $1000:

  • # Trades: 91946
  • Win Rate: 63.51%
  • Avg P/L Per Trade: 0.50%
  • RAR: 33.88%
  • Avg Bars Held: 4.66
  • Payoff Ratio: 0.74
  • Sharpe: 0.39
  • Buy/Hold SPY: 8.61%
All trades test equity curve with fixed position size. Chart from Amibroker.

As you can see from the all trades test results and equity curve, the RSI(5) trading rule was profitable returning a risk adjusted return of 33.88% over 91,946 trades with a win rate of 63.51% and an average profit per trade of 0.50%.

These are fairly good results. The equity curve is upward sloping and moving in the right direction. Although we have been in a dip since mid-2018.

(Don’t focus on the absolute numbers in this equity curve since we are not testing the compounded return yet. We will do that next).

Full Portfolio Test Results

We can now introduce some portfolio restraints and see how the strategy performs with a more realistic portfolio simulation.

  • # Trades: 29349
  • CAR: 14.76%
  • MDD: -51.20%
  • Win Rate: 62.11%
  • Avg P/L Per Trade: 0.47%
  • RAR: 21.06%
  • Avg Bars Held: 4.70
  • Payoff Ratio: 0.65
  • Sharpe: 0.28
  • Buy/Hold SPY: 8.61%
Portfolio test equity curve. src: Amibroker.

As you can see from the portfolio test we got another profitable result with a CAR of 14.76%, a drawdown of -51% and a RAR of 21.06%.

This handily beat the SPY return of 8.61% with a 55% drawdown.

However, two important points need to be noted:

  1. Most of our trade metrics have worsened with Sharpe dropping to 0.28.
  2. The equity curve has been in a steady downtrend since the end of 2014. 

The second point is the most worrying.

Unfortunately, this suggests there could be some overfitting in the original backtest results because they have not transferred past the end of the original test date (12/2014).

Where Do We Go From Here?

So far we have shown that the RSI(5) trading system published on Finviz has some positive characteristics but it failed to pass our portfolio test on the out-of-sample data between the end of 2014 to July 2019. 

There are several reasons why this could be. 

  1. There could be overfitting present in the original backtest results. This is highly likely since you can see performance has deteriorated strongly from 2015 onwards.
  2. The portfolio rules we have introduced might do a poor job of selecting profitable trades. This could be an area for future research. It’s possible that a better ranking system would lead to stronger results. Or maybe we should increase our portfolio size to 50 or 100 stocks. (*In fact, I ran some tests on this and I did not find any improvement. Performance is still declining from 2015 onwards).
  3. Our position sizing (which includes compounding) may not be optimal and may be working against us. Perhaps it would be better to use a more dynamic position sizing.
  4. Someone has made a mistake somewhere. (Always possible).

Conclusions

Overall, this article demonstrates the dangers of taking a published backtest and transferring it to real life trading. 

The published strategy involves a potential future leak because it assumes you can buy stocks on the close and calculate the closing RSI value at the same time. 

It also shows potential overfitting in the backtest results and relies on an unrealistic method of position sizing.

Having said that, the backtest does have positive attributes. It’s on a large sample of trades, includes transaction costs and also covers delisted stocks. That is more than can be said for a lot of strategies published online. 

However, based on the out-of-sample performance, this RSI strategy doesn’t show much potential for trading. This is not surprising since the rules are overly simplistic.

The strategy will need a lot of refinement it is to be taken into the live market with real money on the line.

Simulations in this article produced with Amibroker using data from Norgate. Finviz backtests are available as part of the Finviz Elite subscription.


Comments (5)

Good article Joe. One does have to do their own due diligence and this shows why.

Thank you.

Hi JB,
thanks for the insight.
I would like to know why there is no trend filter is set up in back testing?
Let us say if we have stock above 100EMA and then only BUY is executed. This would result not taking trades against the trend.

Thank you.

Purpose of the article was to test the rules as they were presented on the Finviz website so I did not add any filter. Thanks.

Good article! I always say simple is better! The non simplicity of this strategy perhaps is the wider universe of stocks involved. What about to rank by drawdown volatility like ulcer index, UPI, Serenity Ratio as described by: https://www.keyquant.com/Publications/Index/3 ?

The strategy could allocate to “cash” (SHV, SHY, etc…) when drawdown ranking are on hit.

Thanks in advance 😉

Leave a comment