September 8

15 comments

S&P Overnight Trading Model

By Jeff Swanson

September 8, 2014

automated trading, Automated Trading Development, EasyLanguage, ES, mean reversion, S&P Emini

The last couple of articles I’ve written were highlighting simple trading models that could be the basis for a profitable trading system on the S&P market. These ideas would be suitable either for the ETF market or the Emini futures market. This article will explore yet another simple trading model. Recently I was inspired by a post at Quantifiable Strategies titled, “How To Make Money From The Close Until Tomorrow’s Open in SPY/S&P 500” by Oddmund Grotte. This brief blog post builds up the work of Rob Hanna at Overnight Edges to test another simple S&P model. I thought I would create the model in EasyLanguage and put it through my own testing.

The Overnight Edge

The overnight edge is an S&P market edge that I, along with many other people, discovered years ago. I’ve written about this market edge in a previous article, “The Overnight Edge“. This particular model is going to take advantage of that edge by going long at the close of the day and closing the trade at the next day’s open. The dominate question we will be answering today is, when should we buy. Obviously buying at the close of every single day is not a realistic strategy. So, we wish to eliminate the unproductive trades in favor of finding the highest probability set-ups. That is, what types of days produce the biggest nightly returns?

Baseline Model Rules

  1. SPY closes at new 20 day low
  2. Close is above 200 day simple moving average
  3. Go long at the close
  4. Exit at tomorrow’s open

Below is a snapshot of a few trades taken on the daily chart of the S&P Emini.

Testing Environment

I coded the above rules in EasyLanguage and tested it on the E-mini S&P futures market. Before getting into the details of the results let me say this: all the tests within this article are going to use the following assumptions:

  1. Starting account size of $25,000
  2. Dates tested are from September 11, 1997 through December 31, 2012
  3. One contract was traded for each signal
  4. The P&L is not accumulated
  5. $30 was deducted per round-trip for slippage and commissions
  6. There are no stops

Baseline Results

Below is the equity graph and the performance results of the baseline model.

Baseline Net Profit

S&P Overnight Model (Baseline)

Baseline

Net Profit

$7,220

Profit Factor

4.13

Total Trades

61

%Winners

69%

Avg.Trade Net Profit

$118.36

Annual Rate of Return

1.75%

Max Drawdown(Intraday)

$712

Expectancy

0.47

Expectancy Score

4.09

Testing the Robustness of the Lookback Period

The baseline rules call for a 20-day new low. Is this just an outlier? Or, is this parameter robust for a wide range of values? When looking at a trading model, it’s important that the parameters demonstrate robustness across a wide range. That is, the system should remain profitable over many different values.

To test the robustness of this input, I will use TradeStation’s optimization feature which will allow me to quickly test a range of values. I will test the range 2-30. The results of my test are below. The x-axis displays the number of days for the new low while the y-axis displays the net profit.

Lookback vs. Net Profit

We can easily see a clear trend. The shorter the lookback period the more profit. Notice that a lookback period of 4 days is probably an outlier. It’s enticing to simply pick a small lookback period like 3 or 5, but from experience I know more profit often comes at a price. Often that price is deep drawdown, larger losing streaks and prolonged periods of no new equity highs.

Let’s look at these results another way.

Another way to look at the results is to compare the profit factor vs. the lookback period. See the bar chart below. The x-axis displays the number of days for the new low while the y-axis displays the profit factor.

Lookback vs. Profit Factor

We can see that our profit factor has an opposite trend when compared to the new profit bar graph. In other words, as we make more net profit, we do so with less efficiency. Sure we are making more money when we have a lookback period of 3 when compared to a lookback period of 20. But we also have more losing trades. This can be confirmed by the next bar graph.

Let’s also take a look at the number of trades. See the bar chart below. The x-axis displays the number of days for the new low while the y-axis displays the number of trades.

Lookback vs. Number of Trades

Once again there is a clear trend. There are fewer trading opportunities as you increase the lookback period. This makes sense. The higher the lookback period the less likely you are to experience that new low.

So, more profit does come at a cost. It will be up to you to determine what is appropriate for your trading situation. For me, I would like to have fewer trades and less net profit. This comes with, what I consider, the benefit of fewer losing trades, more net profit per trade, and less drawdown. In short, I prefer the quality trades over the quantity of trades. It appears we can improve the net profit of our model by reducing the lookback period for the new look. More on that later.

Testing the Robustness of the Regime Filter

The regime filter in this model is a simple moving average. We are using the “standard” 200-day simple moving average. This is a very common period for daily charts. It’s commonly understood that price is generally bullish when it’s above this moving average and bearish when below it. Again, to test the robustness of this filter I will use TradeStation’s optimization feature. I will test the range 60-250. The results of my test are below. The x-axis displays the number of days for the lookback value while the y-axis displays the net profit.

Lookback Value vs. Net Profit

Clearly the longer the lookback period the more net profit we generate. Our “standard” 200-day lookback value performs well, but it’s not the best. The best value is 250 in this study. Many values will perform similarly. This gives me confidence the regime filter is not overly optimized and is robust.

Weak Close Filter

In the original blog post by Oddmund Grotte he introduced a price based filter that required the close of the current bar to be within the lower half of the daily range. If price closes in the lower half of the daily range it is presumed we are looking for a weak close. A strong close would be when the close is the upper half of the daily range.

The calculation to determine if the close is within the lower half of the daily range looks like this:

Weak Close = (c-l)/(h-l) < 0.5

With this additional filter we are confirming weakness before opening a new long position. The results of our trading model with the new filter are below.

Model Equity Curve With Weak Close Filter

S&P Overnight Model

Baseline

Weak Close Filter

Net Profit

$7,220

$7,400

Profit Factor

4.13

5.34

Total Trades

61

55

%Winners

69%

71%

Avg.Trade Net Profit

$118.36

$134.55

Annual Rate of Return

1.75%

1.84%

Max Drawdown(Intraday)

$712

$430

Expectancy

0.47

1.26

Expectancy Score

4.09

4.91

The filter did a fantastic job of removing unproductive trades. You can see this because we are making more net profit with fewer trades. This pushes up the average profit per trade. We also reduce our drawdown which increases our profit factor. The only thing concerning is our trade size is small. The baseline had 61 trades, which is not very many trades. With our filter we reduce the trades to 55. But we know how to increase the number of trades by reducing the lookback period of the “new low”. We’ll do that later. For now, there is one other input value I want to test.

Testing the Robustness of the Close Filter

Once again let’s take a detailed look at the percent range used in the Close Filter. If you will recall, we are looking for a close in the lower half of the daily range. But is this just a fluke value? Will other values produce similar results?

The bar graph below depicts taking trades at or above the given x-axis value. For instance, the far left bar produces a net profit around $4,700. The value on the x-axis at this bar is 0.1. This states that all this profit is accumulated above this value. By the time we reach 0.45 there is no more profit to accumulate. Thus, we can see the accumulated profitable trades occur when the daily close falls within the lower 40% daily range. Put another way, we want to open a long position when the daily close is within the lower 2/5 of the daily range.

Combining Our Findings

Let’s now combine a couple of our findings. First, let’s increase the number of trades by reducing the lookback period on locating a new low. Let’s try to keep the profit factor around 2.0, so we’ll use a lookback period of 5 instead of the default 20. I will then change the weak close filter to a value of 0.40 from the default 0.50. I will make no change to the simple moving average regime filter which is at 200. Below are the results.

Model Equity Curve With Combined Findings

S&P Overnight Model

Baseline

Weak Close Filter

Combined

Net Profit

$7,220

$7,400

$10,590

Profit Factor

4.13

5.34

1.95

Total Trades

61

55

167

%Winners

69%

71%

65%

Avg.Trade Net Profit

$118.36

$134.55

$64.41

Annual Rate of Return

1.75%

1.84%

2.50%

Max Drawdown(Intraday)

$712

$430

$1,333

Expectancy

0.47

1.26

0.33

Expectancy Score

4.09

4.91

3.92

Not too bad for a few lines of code. Remember this model does not have any stops nor does it reinvests profits. In short, this is not a trading system but an interesting model which could evolve into a complete trading system with some work.

Jeff Swanson

About the author

Jeff has built and traded automated trading systems for the futures markets since 2008. He is the creator of the online courses System Development Master Class and Alpha Compass. Jeff is also the founder of EasyLanguage Mastery - a website and mission to empower the EasyLanguage trader with the proper knowledge and tools to become a profitable trader.

  • Nice post Jeff! This is what I daily do with my trading system development at https://nightlypatterns.wordpress.com
    You can go deeper with it by adding some others quite common filter like Scott Andrew’s Zones. He uses them in his gaps trading but I realized they work fine with overnight trading too.
    You can build a follow though with them.
    I would like to improve my nigts timing with SPY 15 minutes data. Can you help me?
    You can reply me here: nightlypatterns@hotmail.com
    https://nightlypatterns.wordpress.com

    • Thanks Macrco. Glad you liked it. I’ve seen Scott’s zones for gap trading, but never thought to use them for overnight trading. Thanks for the idea. Are you looking to use your 15-minute data along with your daily data?

      • I would use 15-minute data to backtest the entries and exit better. If it’s better taking the night trade 15 minutes or half an hour before or exiting a quarter or half an hour later than the open. Just to better fine tuning my trades.
        I just lack the 15 minutes historycal data set for SPY.
        Could you send it to me if you have it? Maybe in a zipped cvs file? It would be a great help for me.
        And if you have any advice/questions on my trading just ask!
        Bests,
        Marco

  • I am very interested in S&P Overnight Trading Model. I am a new Trad station customer and would like to incorporate this system into my account. Can I used leveraged ETF;s = SPXS for this system instead of e-mimi ?

    What do you charge for you service ?
    Thanks

    • Unfortunately I don’t provide any service to help customize code or integrate strategies into personal portfolios. I will say this, the strategy will most likely work with ETFs, but may require modification. Also, the strategy should not be traded as-is. Strategy provided it is a full and complete system ready to trade. Most people who read these articles are interested in taking ideas presented and building trading systems from these ideas to suit their own personal trading goals. If you would like to incorporate mechanical strategies into your personal trading account I would suggest first becoming familiar with your TradeStation platform. Learn how to backtest, become familiar with some basic coding. I think it’s very important for you to learn how to create basic strategies and/or backtest strategies.

  • I have had similar questions for quite some time looking at the various strategy models you have presented, but I finally have to voice it –

    Why would I want to use a model that provides an annualized return of only 2.5%?

    • That’s a good question and one that I get on occasion. The confusion has to do with believing the trading rules, as stated above in this example, are all that determines rate of return. However what’s missing is a position sizing model. A position sizing model can dramatically improve the return of the system. It’s completely possible to have two identical trading systems, thinking the same trades on the same market yet, produce different returns. The only difference between the two systems is the position sizing model. This would actually make for a great topic in a future article. Thanks!

  • Hi Jeff,

    I find this article very interesting and I wanted to test it my self, I have one issue though. I can´t get TradeStation to make daily bars that have the session times of a stock, meaning 9:30 to 16:00. if I use daily bars TradeStation doesn´t allow to make a custom session. E-mini has a 24 hour session so if I use the code I downloaded here the difference from the close of a bar to the open of the next is just an hour difference. I can code it with times but then the filters become very complicated, the ideal thing would be to use it like you in you example screen. Can you help me ? It´s probably something simple but I can´t seem to find how…

    • Hello Agustin. I’ll have to look into this, but I think you simply use the regular session for stocks. This is the period without the pre-market or post market sessions. When I get some time today, I’ll take a look at this strategy on a stock.

  • My testing shows if you use RSI(2) as a weakness filter instead of the daily range you get better results. The short side of this system also works.
    //Trigger = (Close – Low)/(High – Low) < Trigger_Level;
    Trigger_long = RSI(Close,RSI_Lookback) < RSI_Lower;

  • {"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}

    Learn To Code & Build Strategies
    Using EasyLanguage. 

    >