Quantopian's community platform is shutting down. Please read this post for more information and download your code.
Back to Community
Pairs Trading Algorithm

A general algorithm to trade pairs based on the concept of cointegration. I tried three different pairs and don't think I would trade on any of them.

7 responses

Thanks for sharing Aaron! This is a good template. Pair trading investigations will be interesting to explore in IPython notebooks using the new research environment. There you can visualize different pair combinations and watch the effect of swapping different securities.

If you don't have research yet, you can submit an algo to the contest and get your access:
https://www.quantopian.com/posts/enter-the-quantopian-open-to-get-early-access-to-the-research-platform

Disclaimer

The material on this website is provided for informational purposes only and does not constitute an offer to sell, a solicitation to buy, or a recommendation or endorsement for any security or strategy, nor does it constitute an offer to provide investment advisory services by Quantopian. In addition, the material offers no opinion with respect to the suitability of any security or specific investment. No information contained herein should be regarded as a suggestion to engage in or refrain from any investment-related course of action as none of Quantopian nor any of its affiliates is undertaking to provide investment advice, act as an adviser to any plan or entity subject to the Employee Retirement Income Security Act of 1974, as amended, individual retirement account or individual retirement annuity, or give advice in a fiduciary capacity with respect to the materials presented herein. If you are an individual retirement or other investor, contact your financial advisor or other fiduciary unrelated to Quantopian about whether any given investment idea, strategy, product or service described herein may be appropriate for your circumstances. All investments involve risk, including loss of principal. Quantopian makes no guarantees as to the accuracy or completeness of the views expressed in the website. The views are subject to change, and may have become unreliable for various reasons, including changes in market conditions or economic circumstances.

Would the same pairs work with OLS based pair trading?

Not sure I understand your question. This algorithm uses OLS to model the relationship between the chosen pairs. The rest of the logic is centered around the decision to enter into the trade. Here I'm using cointegration as a test condition and then waiting for a specified # of standard deviation from the mean before I take a position.

Aaron, A very neat and good job.

Hey Aaron,
Nice work on this algo, I like is that you consider whether the previous spread has reverted before estimating new parameters, sometimes new estimations cause a position to be closed before the original spread was profitable. Tracking the pair's pnl helps avoid that, but it's good to keep the original parameters around anyway.

The drift in the hedge ratio tends to be the killer in pairs trading In my experience, you could try adding a maximum time you'll wait for a reversion, or track how far the original parameters have deviated from updated ones and change them when the model has gone sufficiently out of whack. I added a simple max holding period as an example. I also switched it to use log prices since the returns of the spread are,

(log(A,t1) - log(A,t2)) + beta*(log(B, t2) - log(B, t1)).

It's heading in the right direction though, you'll just need risk stuff and some decent pairs.

Thanks for sharing,
David

Is there anyone who could help me modify this algorithm for a much simpler trend-following strategy? I want to test the spread between DIA and SPY as a simple crossover strategy on an hourly chart. I would like the strategy to start with an equivalent dollar amount of each stock. I believe the pair ratio is around .86 for these ETFs. I would like it to trade a simple cross moving average cross over strategy. So, if the price of the spread goes above the moving average, the strategy would buy an addition 100 or so shares of one ETF, and then go short once it crosses back below the moving average, trading around the core equivalent holding. I am using this strategy as one part of a larger strategy, so I don't expect the results to be spectacular, but there should be reasonably low volatility. If someone could help me out, that would be great. It seems like this is a good starting algorithm, but I know they are generally correlated and I only want to trade the one pair. Any help would be appreciated. Thanks.

Hey Aaron and David, thanks for sharing.
For the exit, wouldn't this sub condition be always False since context.exit_threshold is set to 0 ?
abs(current_z) < context.exit_threshold