The August 2019 issue of Technical Analysis of Stocks & Commodities magazine John Ehlers proposed an interesting looking indicator. This indicator is a cycle indicator that John called a Voss filter. The name of the article is "A Peek Into The Future." Of course, this indicator is not magic. We're not looking into the future at all. John puts it this way when describing his indicator, "While it can not really look into the future, it can provide signals in advance of signals used by other traders—and that may be enough to create a successful trading edge." So let's take a look at this indicator and see if it holds any value.
I'm not going into the details on how the indicator works. If you would like more detailed information about the Voss indicator, please review the original article in the August 2019 issue. The code is also available if you're a subscriber to the magazine. By the way, I do recommend a subscription to the magazine because it's an excellent source of trading ideas. Well worth the price!
In the original article, there is a demonstration of the indicator on the daily chart of SPY. Below is a screenshot of a daily chart of the Emini futures with the Voss indicator applied with the default values. A simple strategy is applied with the default values, as well. The strategy enters long when the Voss filter indicates a potential bullish turning point. Likewise, the strategy goes short when the Voss filter indicates a potential bearish turning point.
Before we look at the results here are the environmental settings used for this article.
Environmental Settings
All the tests within this article are going to use the following assumptions:
- Starting account size of $25,000
- Dates tested are from January 1, 2006 through November 18, 2019
- One contract was traded for each signal
- The P&L is not accumulated to the starting equity
- $30 was deducted per round trip for slippage and commissions
- There are no stops
Baseline Results
Below is the equity curve for trading the E-mini futures contract based upon the default values of the Voss filter. The Voss indicator has two input values. A lookback period (default 20) and predict period (default 3).
The results don't look that great. The long side holds more promise than the short side. Poor performance on the short side is typical as the stock index markets have a long side bias. With that in mind, let's focus on the long side. We'll call the long-only trades our baseline (see table below).
Baseline | |
---|---|
Net Profit | $47,837 |
Profit Factor | 1.30 |
Total Trades | 240 |
%Winners | 50% |
Avg.Trade Net Profit | 199.32 |
Return on Capital | 20.30% |
Largest Losing Trade | $7,160 |
Adding A Regime Filter
My next step would be to add a simple moving average to act as a regime filter. In this case, I'm going to add a 200-period SMA and only take the trade when the price is above the SMA. Using this simple filter should keep us taking long trades only when the overall trend is up.
Baseline | Regime Filter | |
---|---|---|
Net Profit | $47,837 | $50,600 |
Profit Factor | 1.30 | 1.48 |
Total Trades | 240 | 185 |
%Winners | 50% | 52% |
Avg.Trade Net Profit | $199.32 | $273.51 |
Return on Capital | 20.30% | 202.40% |
Largest Losing Trade | $7,160 | $7,160 |
So we have a small improvement but an important one. We eliminate some unproductive trades, thus producing slightly more money, which generates a more significant profit per trade. Our most significant losing trade is still the same. Keep in mind; we don't have any stops.
Short-Term Weakness
From my experience, the Emini S&P favors those who open new long positions when the short-term price action is falling. Put another way, the Emini S&P is a short-term mean-reverting strategy. With this in mind, let's add another simple moving average with a shorter loopback period. With this new shorter-term SMA, we want price to be BELOW this moving average. When the price is below the SMA, this indicates price is a short term pullback.
I added this second simple moving average to the code and chose a value of 40 for the lookback period. Below are the results.
Baseline | Regime Filter | Short-Term Weakness | |
---|---|---|---|
Net Profit | $47,837 | $50,600 | $35,340 |
Profit Factor | 1.30 | 1.48 | 1.76 |
Total Trades | 240 | 185 | 66 |
%Winners | 50% | 52% | 61% |
Avg.Trade Net Profit | $199.32 | $273.51 | $535.45 |
Return on Capital | 20% | 202% | 141% |
Largest Losing Trade | $7,160 | $7,160 | $7,160 |
Well, we reduced our overall profit but increased our profit factor and average net profit per trade. However, we're not getting very many trades. At this point, I started thinking; maybe this would work on an intraday chart?
Will This Work Intraday?
I next created a 240-minute chart and applied our baseline to it. The ugly results are below in the table.
Baseline | |
---|---|
Net Profit | $33,410 |
Profit Factor | 1.07 |
Total Trades | 240 |
%Winners | 47% |
Avg.Trade Net Profit | $20.96 |
Return on Capital | 133% |
Largest Losing Trade | $6,297 |
Just as before, let's add a simple moving average to act as a regime filter. Because we're now working on an intraday chart, I'm going to add the daily symbol to Data2, which allows me to calculate the regime filter on the daily data.
Baseline | Regime Filter | |
---|---|---|
Net Profit | $33,410 | $15,942 |
Profit Factor | 1.07 | 1.05 |
Total Trades | 1,594 | 1,207 |
%Winners | 47% | 46% |
Avg.Trade Net Profit | $20.96 | $13.21 |
Return on Capital | 133% | 63% |
Largest Losing Trade | $6,297 | $6,297 |
Adding the regime filter took our strategy in the wrong direction! We are making less money, a smaller profit per trade and our profit factor fell — time to be a bit creative. Just because our daily regime filter worked on the daily bar, does not mean it's going to work the same way (or at all) on our 240-minute chart.
What happens if we invert the regime filter? I did that and ran an optimization over the values 10 - 200. I found a stable region and picked the middle ground - 60 in this case. Below are the results.
Baseline | Inverted Regime Filter | |
---|---|---|
Net Profit | $33,410 | $55,12 |
Profit Factor | 1.07 | 1.25 |
Total Trades | 1,594 | 575 |
%Winners | 47% | 52% |
Avg.Trade Net Profit | $20.96 | $96.54 |
Return on Capital | 133% | 222% |
Largest Losing Trade | $6,297 | $3,972 |
Inverting the regime filter got us to the point where we're generating more profit with far fewer trades. That's moving in the right direction. We see a massive jump in the average profit per trade.
I then went added another simple moving average filter to the 240-bar chart to see if this would improve the performance. This second filter is similar to what we did with the daily chart when we looked at a shorter-term simple moving average. Well, I'm doing the same here but also moved to the primary data set - the 240-bar. Doing this should be suitable for a short-term price action filter. I tested both above and below this short-term moving average and below it produced the best results.
Below are the final results with our two moving averages added.
Baseline | Inverted Regime Filter | Inverted Short-Term Filter | |
---|---|---|---|
Net Profit | $33,410 | $55,120 | $55,510 |
Profit Factor | 1.07 | 1.25 | 1.35 |
Total Trades | 1,594 | 575 | 429 |
%Winners | 47% | 52% | 52% |
Avg.Trade Net Profit | $20.96 | $96.54 | $129.39 |
Return on Capital | 133% | 222% | 222% |
Largest Losing Trade | $6,297 | $3,972 | $3,972 |
Optimized!
I then decided to run TradeStation's optimize across the two simple moving average input values and on the period value for the Voss indicator. Remember, the Voss inidcator has two inputs. One is a period and the other is a predict value. The predict value is recommended to not go byond three. I'm ignoring this value and keeping at three. So, here is what we're optimzing.
I'm also leaving the 40% of the most recent price history as out-of-sample data. After the optimization was complete I simple picked the best reforming based upon net profit. The optimized input values were:
- Regime: 10
- Regime 2: 80
- Period:15
Baseline | In Sample Data | Out-Of-Sample Data | |
---|---|---|---|
Net Profit | $33,410 | $44,100 | $23,710 |
Profit Factor | 1.07 | 1.36 | 1.20 |
Total Trades | 1,594 | 430 | 299 |
%Winners | 47% | 53% | 54 |
Avg.Trade Net Profit | $20.96 | 102.56 | $79.30 |
Return on Capital | 133% | 176% | 131% |
Largest Losing Trade | $6,297 | $3,972 | $6,297 |
Conclusion
The Voss indicator may hold some promise, but it's not overly impressive, in my opinion. At least, in the way, I'm using it I don't see much value. During this article, I was using the Voss indicator as the primary driver for my long signals. We know it's not great for locating shoring opportunities, which is a difficult task to pull off with stock index markets. Thus, it shows some promise on the long side. Feel free to experiment with it in your code as, for some situations, it may very well perform well as a filter. As always, experiment!
The Voss indicator code was downloaded from the Technical Analysis of Stocks & Commodities magazine.
Nicely done Jeff, a great example of how you execute your thinking process to the code…you teach great….thx