Skip to content
All library documents

Selecting High-Weight ETF Constituents for an Equal-Weight Portfolio

Article Strategy library · Author: QuantConnect

Summary

This QuantConnect framework example demonstrates using an ETF constituents universe selection model with SPY as the source ETF. It filters constituent records to those with available weights, sorts them from highest to lowest weight, and selects the top eight symbols. The algorithm sets daily data resolution and uses a constant one-day upward price insight for selected securities, then applies equal-weight portfolio construction.

The example teaches how ETF membership data can define a dynamic security universe and how a constituent filter connects to alpha and portfolio construction components. It is illustrative framework plumbing rather than evidence for an investment strategy: the sample covers only a short date interval and specifies no performance evaluation. Selecting the largest-weight constituents does not itself establish expected returns, and the constant bullish insight means the example does not test whether the selection rule predicts price direction.

Key ideas

  • An ETF constituent universe model can supply securities for an algorithmic portfolio.
  • The filter ranks constituents by reported ETF weight and selects the largest-weight names.
  • Selected securities receive a constant upward price insight in the demonstration.
  • Equal weighting is applied after universe selection, independently of the ETF weights.
  • The short illustrative sample reports no evidence that the selection rule generates returns.

Tags

Full text
# ETFConstituentsFrameworkAlgorithm


# ETFConstituentsFrameworkAlgorithm









Demonstration of using the ETFConstituentsUniverseSelectionModel

## 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 Selection.ETFConstituentsUniverseSelectionModel import *

### <summary>
### Demonstration of using the ETFConstituentsUniverseSelectionModel
### </summary>
class ETFConstituentsFrameworkAlgorithm(QCAlgorithm):

    def initialize(self):
        self.set_start_date(2020, 12, 1)
        self.set_end_date(2020, 12, 7)
        self.set_cash(100000)

        self.universe_settings.resolution = Resolution.DAILY
        symbol = Symbol.create("SPY", SecurityType.EQUITY, Market.USA)
        self.add_universe_selection(ETFConstituentsUniverseSelectionModel(symbol, self.universe_settings, self.etf_constituents_filter))

        self.add_alpha(ConstantAlphaModel(InsightType.PRICE, InsightDirection.UP, timedelta(days=1)))

        self.set_portfolio_construction(EqualWeightingPortfolioConstructionModel())


    def etf_constituents_filter(self, constituents: List[ETFConstituentData]) -> List[Symbol]:
        # Get the 10 securities with the largest weight in the index
        selected = sorted([c for c in constituents if c.weight],
            key=lambda c: c.weight, reverse=True)[:8]
        return [c.symbol for c in selected]


```

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.