The complete process is presented here for discovering price patterns in EC futures historical daily data using the Price Action Lab search function, testing the results out-of-sample and then creating a trading system. It is shown that Price Action Lab can find patterns that result in a statistically significant and profitable system in long out-of-sample periods while maintaining a high Sharpe ratio and profit factor.
This is the third in a series of posts with the aim of demonstrating the process of machine generation of trading systems based on price patterns. The first post was about SPY patterns and the second about QQQ patterns. Anyone interested in purchasing the code for these systems please follow this URL for the proper email address to use.
The results presented here can be confirmed by anyone with a demo version of Price Action Lab. Actually, the demo version was used to generate the results of this study.
Step 1: Create a target and stop file
In this example I will use 100 ticks for the profit-target and stop-loss. A T/S file is created with the values as shown below and then saved as 100pips.trs:
Please note that for EC futures and EURUSD forex spot, the value 0.01 corresponds to 100 ticks or pips.
Step 2: Create a search workspace
The workspace is created by selecting the following:
a) The T/S file we created by the name 100pips.trs
b) The in-sample EC futures data file EC.txt. Range: 01/04/1999 – 12/31/2009.
c) The trade parameters: pts is marked to indicate that the values in the selected T/S file (100pips.trs) stand for points added to the open of the next bar, which is selected under Inputs. The Delay input is kept marked off. (Using delay inputs will be the subject of another post).
d) Under search parameters we input 70 for the percent minimum win rate for patterns that generate long signals and 100 for the percent minimum win rate for patterns generating short signals. We also input 32 for the minimum number of trades and 10 for the maximum number of consecutive losers. Here we essentially have specified performance parameters for long patterns and excluded short patterns because we would like to specify different performance parameters for those. Thus, we first create a search line for the long side and then repeat the parameter entry for a second search line. Here we choose 100 for the percent minimum win rate for long patterns to exclude them and 63 for that of short patterns. We also input 28 for the minimum number of trades. Thus, only short patterns with more than 29 trades will be accepted. We then create a second search line for short patterns.
e) The date range in the data file is shown under File Date Range. In this case it corresponds to the in-sample range. The Search Range is left to 500. This means that Price Action Lab will demand that all patterns that are found to satisfy the performance criteria set in (a) – (d) must have at least one historical trade in the most recent 500 bars. Finally, the Extended search option is checked and we run the workspace.
Step 3: In-sample results
Price Action Lab will run for an interval of time depending on computer CPU speed but in this particular case it will complete the search after about 30 minutes on the average. The output should look like the one below:
Each line in the above results corresponds to a price pattern that satisfies the performance parameters specified by the user. Index and Index Date are used internally to classify patterns. Trade on is the entry point, in this case the Open of next bar. P is the success rate of the pattern, PF is the profit factor, Trades is the number of historical trades, CL is the maximum number of consecutive losers, Type is LONG for long patterns and SHORT for short patterns , Target is the profit target, Stop is the stop-loss and C indicates whether % or points for the exits, in this case it is pts. Last Date and First Date are the last and first date in the historical data file.
It may be seen from the results that Price Action Lab found 13 patterns, 6 long and 7 short, which satisfied the performance criteria specified on the workspace for the in-sample. However, one could argue that these patterns are random artifacts of survivorship bias, i.e. they survived by chance alone and they have no predictive power. This is the reason we used an in-sample to search for the patterns. We will now use the out-of-sample to see how these patterns performed in a regular backtest. Please note that:
- Price Action Lab does not look at the out-of-sample when searching the in-sample. This is very important because if a program looks at the out-of-sample and then selects patterns from the in-sample that also worked well in the out-of-sample this is an extremely bad (and even deceiving) practice that is known as data-snooping.
- Price Action Lab does not find systems that later allow varying their parameters for fitting their performance in the out-of-sample. All patterns found are parameter-free, eliminating an important but serious concern dealing with curve-fitting performance in the out-of-sample.
Step 4: Out-of-sample testing
Price Action Lab makes it very easy to test in the out-of-sample all patterns in the in-sample results. Just click on Test Patterns and then select the location of the out-of-sample data file, as shown below:
It may be seen that the out of sample period is from 01/04/2010 to 03/30/2012.
The results are obtained shortly after making the selection and confirming it:
It may be seen from the above example test that the pattern performance parameters changed due to the out-of-sample backtest. As a result, two short patterns have profit factor less than 1, meaning that only 2 out of the 13 patterns failed in out-of-sample.
The profit factor of this group of 13 price patterns can be calculated using the backtesting function of Price Action Lab applied to each pattern, adding gains and losses separately and then dividing the two. In this case, Amibroker (Charts created with AmiBroker – advanced charting and technical analysis software. http://www.amibroker.com/”) code was generated and a simple system was built that uses the OR condition to combine long patterns and short patterns separately. This systems was found to have a profit factor equal to 1.70, a Sharpe ratio equal to 2.78 and a payoff ratio was 1.08 (as expected close to 1) in the out-of-sample on a total of 79 trades (A total of 365 occurred in the in-sample). Below is the equity curve for the system for both the in-sample and out-of-sample periods:
The above equity curve was based on $10,000 of initial capital. The position size was constant and equal to one contract. No pyramiding and no compounding was used. It may be seen than in the out-of-sample the system experiences a small drawdown but soon recovers and its equity increases to new highs.
Step 5: Add the systems to system tracking or generate code
The patterns Price Action Lab discovered can be added to the system tracking module of the program for receiving notifications when a signal is generated or, if the user wishes, code can be generated for implementing a system in some other popular platform.
Comments and FAQ
How long will these patterns remain profitable? This is unknown. However, the real value of Price Action Lab is that the search can be repeated again after one year, for example, and the systems can be upgraded. This is not like buying a black-box and have to live with it.
Do I really need the out-of-sample test since it reduces available data for the in-sample? Actually, some people believe that out-of-sample testing is not needed after it is used to confirm that a certain process of finding trading systems leads to significant results. Thus, if it is shown than Price Action Lab can get significant patterns in an out-of-sample as long as the one in this post, then the process can be eliminated all together and the available data can be used as an in-sample to increase search flexibility. Instead of doing out-of-sample tests, the search is rerun every six months and the system is rebalanced.
Disclosure: no relevant position at the time of this post.