This is a follow-up post regarding trading intraday mean-reversion (link). The intention of the initial post has been to gather feedback on the validity of the strategy presented. The initial post has received a lot of valuable feedback. Thank you very much! With this post I want to pick-up your thoughts and respond to it.
Let’s review the initial system again. I made a small though impact-full mistake yesterday. My default settings include 0.01$ / share per trade. Furthermore my price calculation resulted in Limit-Orders with up to 5 decimals. My broker (Interactive Brokers) only accepts orders with two decimal places. So I rounded to two decimal places. Furthermore I changed the entry criteria from Low <= LE1 to Low < LE, this means the low has to be bellow the entry. This makes especially sense when working with two decimal places only.
By the way, why does Interactive Brokers accept limit orders with two decimal places only but my fills have three decimal places. For me this looks like somebody is making half a cent per trade on my account! Any thoughts, please comment?
Average% win size
Some of the feedback I received was related to the average percentage win size as no slippage has been added. So let me show you a few very simple methods to improve the average win size. First I looked how the results were for stocks slightly oversold (RSI2<50) on yesterday’s bar. I couldn’t find a real difference in the result. In the next steps I looked at the market, so the system will only trade when the QQQQ’s are slightly overbougth. This made a big difference in the average win size, but has a big cost in terms of annual returns. However you get the point, there are good and bad times for intraday mean reversion. Driving factors are oversold / overbought conditions, volatility environment and correlation of the stock to the index.
Let’s add trading cost + commission in order to get to more realistic results. I added to assume for 0.1% commission per round-turn and in a second test i added 0.05% slippage per round-turn
Some other comments
- Some of the comments were related to liquidity and fill assumption beyond 100k. The test is done on NDX100 stocks only. Furthermore my personal account size is a drop in the ocean compared to volume of NDX100 stocks.
- Orders (+execution) right at the open might be an issue. I run a test where I excluded trades with low=open. Average results dropped slightly to about 0.65% per trade (from 0.68%).
- Data quality: spikes in high/low. That’s indeed an issue for further research.
A topic I would like to cover specifically is how to execute the system presented. Developing a system is one thing, executing is another thing!
The key question: when will the limit order be placed?
- Prior the open: As you don’t know what stocks fall bellow the entry criteria you have to set limit orders for all NDX100 stocks. While this is technically possible the broker won’t allow you to do this as this will likely exceed your margin level. So you have to find a way to identify the stocks that are most likely to fall bellow the limit order (and mean revert)
- Real-time, automated: You can place the order as the limit get’s hit (theoretically) and bet that the limit will be hit again. This requires you to have a pretty good (fast + reliable) IT environment (suddenly you are in competition with the BIG boys).
- Real-time, discretionary: You have your software constantly scanning the stocks and giving you an alarm signal when the limit is hit. This has the advantage of being able to buy the stock only when it has finally bottomed-out. A discretionary trader will miss many opportunities as he is slow in execution (capture the event and enter the order)
Bottom line: for a (non-automated) system trader the system has to be re-designed. I re-wrote my code in a way that the system will place five limit orders prior the open (regardless if the limit order will be hit next day or not) … stay tuned for another post!