The complete process of discovering price patterns for QQQ using the Price Action Lab search function, testing the results in an out-of-sample and then creating a trading system is presented here. 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.
This is the second post in a series of posts that demonstrate the power of the process of machine generation of trading systems based on price patterns. The first post was about SPY patterns.
Trading QQQ is an efficient and liquid market. Some have argued that if a market is efficient, then it does not allow profiting through the exploitation of price patterns. In support of their claim they have presented studies that quite often, in our opinion, are very basic and even naive. Here we present just one example of machine generated QQQ price patterns that as a group has maintained a large profit factor and Sharpe ratio over a long out-of-sample testing period.
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 0: Download non-adjusted daily QQQ data from Yahoo and create two data files, one is the in-sample with prices ranging from 03/30/2000 to 12/31/2009 and the other will be used as the out-of-sample with prices ranging from 01/04/2010 to 04/05/2012. These files are saved at two different locations as QQQ.txt.
Step 1: Create a target and stop file
In this example we use 5% for the profit-target and stop-loss. A T/S file is created with the values as shown below and then saved as 5.trs:
Step 2: Create a search workspace
The workspace is created by selecting the following:
a) The T/S file we created by the name 5.trs
b) The in-sample QQQ data file QQQ.txt.
c) The trade parameters: % is marked to indicate that the values in the selected T/S file (5.trs) stand for percentages based on 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 69 for the percent minimum win rate for patterns that generate long signals and 67 for the percent minimum win rate for patterns generating short signals. We also input 1.50 for the minimum profit factor, 29 for the minimum number of trades and 10 for the maximum number of consecutive losers.
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 15 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 %. 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 9 patterns, 6 long and 3 short, which satisfy 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. Unfortunately, there are some programs that claim machine generation of trading systems where the user is required to provide the combined in-sample and out-of-sample file and that raises questions about their internal operation which is not disclosed.
- 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. Again, some other programs that claim machine generation of trading systems is not very clear what they do in the out-of-sample with the parameters obtained in the in-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:
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, only one short patterns has profit factor less than 1, meaning that only one out of the nine patterns failed in out-of-sample.
The profit factor of this group of 9 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.87 and Sharpe ratio 1.07 in the out-of-sample on a total of 58 trades. Below is the equity curve for the system for both the in-sample and out-of-sample periods:
The above equity curve is based on $10,000 of initial capital. The position size is calculated based on net equity divided by entry price to the nearest integer value. 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. It is also evident that the equity is not as smooth in the in-sample as in the out-of-sample where the Sharpe factors was reported equal to 2.38. Still, the value for Sharpe in the out-of-sample is greater than 1 with a win rate of about 64%.
Step 5: Add the systems to system tracking or generate code
The patterns Price Action Lab discovered, all or any selection of them, can be add 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
In this particular example the program found more long patterns than short. This is normal because short-patterns have in general a low win rate. One could decrease the win rate for short-patterns on the search workspace to see what happens. Price Action Lab provides a foundation for performing such experiments very efficiently. This is where its real value is found.
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.