In this example of machine generation of trading systems, the steps are presented for discovering price patterns to develop a position trading system for GBPUSD spot currency. The patterns are discovered using the Price Action Lab search function in an in-sample of daily historical data. The in-sample results are then tested in an out-of-sample and a system is created in Amibroker. It is shown that Price Action Lab can identify patterns in a deterministic (reproducible) way that result in a statistically significant profitable system in the out-of-sample period while maintaining a high win rate and profit factor.
This is the sixth in a series of posts aiming at demonstrating the process of machine generation of trading systems based on price patterns. The first post was about SPY, the second was about QQQ, the third was about EC futures, the fourth post was about YM futures and the fifth about DIA. Anyone interested in purchasing the code for these systems please follow this URL for the proper email address to use. Full system code is available for Tradestation and Amibroker and condition code for several other platforms.
The GBPUSD currency pair was selected because in its price historyit exhibits major up and down swings and long periods of sideways movement, as it may be seen from the daily chart below:
It may be seen that the out-of-sample involves only a short duration uptrend and for the remaining time of about a year and a half the market moves in a tight range. This type of out-of-sample is very challenging and provides a good test of the significance of the in-sample patterns. However, it should not be expected that the performance in the out-of-sample matches or even exceeds that observed in the in-sample. Such requirement would be totally unrealistic because of the tight range and volatility in the out-of-sample, as well as, of its short duration in relation to the in-sample.
The results presented here, except the pattern code, can be confirmed by anyone with a demo version of Price Action Lab. Actually, the demo version was used to generate most of the results of this study.
Step 1: Create a target and stop file
In this example 150 pips will be used for the profit-target and for the stop-loss for an expected average win to average loss ratio close to 1. A T/S file is created with the values as shown below and then saved as 150pips.trs:
The proper value to be used that corresponds to 150 pips is 0.015.
Step 2: Create a search workspace
The workspace is created by selecting the following:
a) The T/S file we created by the name 150pips.trs
b) The in-sample data file GBPUSD.txt. Range: 01/04/1999 – 05/31/2010.
c) The trade parameters: ”pts” is is marked to indicate that the values in the selected T/S file stand for points added to the entry price, which is selected as the open of the next bar 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 75.99 for the percent minimum win rate for both long and short patterns. The other parameters stay at default values.
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 17 patterns, 11 long and 6 short, which satisfied the performance criteria specified on the workspace for the in-sample. (Please keep in mind that this is an example for specific risk/reward criteria and performance parameters). One could argue that these patterns are random and a result 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 and 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.
– Price Action Lab does not use genetic programming, neural networks, permutations or any other methods employed by some other programs that produce random and curve-fitted systems. Price Action Lab is based on a proprietary deterministic algorithm that produces the same output each time it encounters the same conditions and that is in compliance with the standards of scientific testing and analysis.
Step 4: Out-of-sample testing
Price Action Lab makes it very easy to test in the out-of-sample all patterns found 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 06/01/2010 to 06/01/2012. The results are obtained shortly after making the selection and confirming it:
It is always easier to sort the results by win rate in order to make easier to spot losers in the out-of-sample. Recall that losers have necessarily profit factor less that 1:
It may be seen from the results that only two short patterns turned unprofitable in the out-of-sample. As a matter of fact, the top 7 patterns in the list exhibit a very high profit factor.
The profit factor of this group of 17 price patterns can be calculated using the backtesting function of Price Action Lab applied to each pattern, adding gains and losses separately and then calculating the ratio. In this case, Amibroker code was generated and a simple system was built that uses the OR condition to combine long patterns and short patterns separately. Below is a table with key performance statistics for the in-sample and out-of sample:
W | LT | ST | PF | AvgB | Sharpe | E | |
In-sample | 73.03% | 144 | 123 | 2.92 | 3.26 | 5.02 | 691.48 |
Out-of-sample | 59.62% | 30 | 22 | 1.64 | 3.15 | 2.24 | 228.40 |
Legend – W: win rate, LT, ST: number of long and short trades, PF: profit factor, AvgB: average bars in trades, E: expectancy (average trade).
It may be seen from the above table that the system maintained a high win rate, a high profit factor and Sharpe ratio in the out-of-sample test. The average bars in trades is close to 3 which is much less than the average number of bars in the patterns used to generate the signals (That number of close to 4.5 bars).
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 $20,000 of initial capital and one GBPUSD lot per position. No pyramiding and no compounding was used. No interest calculations were included in the performance results. It may be seen than in the out-of-sample the system experienced a drawdown. Note however the tight range in which the currency pair moved since the beginning of 2011. This was a very challenging out-of-sample for the system and the resulting performance can be deemed very satisfactory.
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.
Charting program: Amibroker (Charts created with AmiBroker – advanced charting and technical analysis software. http://www.amibroker.com/”)