Skip to content
All library documents

Ranking Pairs Trading Candidates by Pearson Correlation

Article Strategy library · Author: QuantConnect

Summary

This framework example wires a Pearson correlation pairs alpha model into a complete algorithm workflow. The model extends a base pairs model and ranks candidate pairs using Pearson correlation, then selects the top candidate to trade. The example uses a manually seeded equity universe and adds a scheduled universe selection that changes membership during the run.

Portfolio construction uses equal weights, execution is immediate, and risk management is set to a null model. The example specifies daily resolution and a 252-period input for the alpha model. Its dates span a brief October 2013 sample, and it reports no returns, risk statistics, or comparison against alternatives. The end-of-run check verifies that universe changes leave no consolidators attached, which is an implementation safeguard rather than evidence of trading performance. The document illustrates framework integration and candidate ranking, but does not explain correlation estimation choices, pair construction, or trade entry and exit rules.

Key ideas

  • Pearson correlation ranks pairs trading candidates, and the model selects the top-ranked candidate.
  • The algorithm combines the alpha model with equal-weight portfolio construction and immediate execution.
  • A scheduled universe selection changes the available securities during the example run.
  • Risk management is configured as a null model, so the example adds no explicit risk controls.
  • The short sample and lack of reported performance metrics do not establish strategy effectiveness.

Tags

Full text
# PearsonCorrelationPairsTradingAlphaModelFrameworkAlgorithm


# PearsonCorrelationPairsTradingAlphaModelFrameworkAlgorithm









Framework algorithm that uses the PearsonCorrelationPairsTradingAlphaModel.
    This model extendes BasePairsTradingAlphaModel and uses Pearson correlation
    to rank the pairs trading candidates and use the best candidate to trade.

Framework algorithm that uses the PearsonCorrelationPairsTradingAlphaModel. This model extendes BasePairsTradingAlphaModel and uses Pearson correlation to rank the pairs trading candidates and use the best candidate to trade.

## Source (Apache-2.0)

```python
# QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
# Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from AlgorithmImports import *
from Alphas.PearsonCorrelationPairsTradingAlphaModel import PearsonCorrelationPairsTradingAlphaModel

### <summary>
### Framework algorithm that uses the PearsonCorrelationPairsTradingAlphaModel.
### This model extendes BasePairsTradingAlphaModel and uses Pearson correlation
### to rank the pairs trading candidates and use the best candidate to trade.
### </summary>
class PearsonCorrelationPairsTradingAlphaModelFrameworkAlgorithm(QCAlgorithm):
    '''Framework algorithm that uses the PearsonCorrelationPairsTradingAlphaModel.
    This model extendes BasePairsTradingAlphaModel and uses Pearson correlation
    to rank the pairs trading candidates and use the best candidate to trade.'''

    def initialize(self):

        self.set_start_date(2013,10,7)
        self.set_end_date(2013,10,11)

        symbols = [Symbol.create(ticker, SecurityType.EQUITY, Market.USA)
            for ticker in ["SPY", "AIG", "BAC", "IBM"]]

        # Manually add SPY and AIG when the algorithm starts
        self.set_universe_selection(ManualUniverseSelectionModel(symbols[:2]))

        # At midnight, add all securities every day except on the last data
        # With this procedure, the Alpha Model will experience multiple universe changes
        self.add_universe_selection(ScheduledUniverseSelectionModel(
            self.date_rules.every_day(), self.time_rules.midnight,
            lambda dt: symbols if dt.day <= (self.end_date - timedelta(1)).day else []))

        self.set_alpha(PearsonCorrelationPairsTradingAlphaModel(252, Resolution.DAILY))
        self.set_portfolio_construction(EqualWeightingPortfolioConstructionModel())
        self.set_execution(ImmediateExecutionModel())
        self.set_risk_management(NullRiskManagementModel())

    def on_end_of_algorithm(self) -> None:
        # We have removed all securities from the universe. The Alpha Model should remove the consolidator
        consolidator_count = sum(s.consolidators.count for s in self.subscription_manager.subscriptions)
        if consolidator_count > 0:
            raise AssertionError(f"The number of consolidator should be zero. Actual: {consolidator_count}")

```

Shown in full with attribution under the source's licence. Licence: Apache-2.0

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.