Portfolio Construction
Supported Models
Introduction
This page describes the pre-built Portfolio Construction models in LEAN. The number of models grows over time. To add a model to LEAN, make a pull request to the GitHub repository. If none of these models perform exactly how you want, create a custom Portfolio Construction model.
Null Model
The NullPortfolioConstructionModel
is the default Portfolio Construction model. It doesn't return any PortfolioTarget
objects. It's useful if you need to analyze an Alpha model in isolation.
# Set portfolio construction to NullPortfolioConstructionModel to bypass custom logic, useful for simplifying testing or initial development when you want to manually manage or skip automatic portfolio adjustments. self.set_portfolio_construction(NullPortfolioConstructionModel())
To view the implementation of this model, see the LEAN GitHub repository.
Equal Weighting Model
The EqualWeightingPortfolioConstructionModel
assigns an equal share of the portfolio to the securities with active insights. This weighting scheme is useful for universe rotation based on simple portfolio strategies.
# Set portfolio construction to EqualWeightingPortfolioConstructionModel to allocate capital equally across selected securities, ensuring balanced exposure and reducing the influence of any single asset on the portfolio. self.set_portfolio_construction(EqualWeightingPortfolioConstructionModel())
The following table describes the arguments the model accepts:
Argument | Data Type | Description | Default Value |
---|---|---|---|
rebalance | Resolution | Rebalancing frequency | Resolution.DAILY |
This model supports other data types for the rebalancing frequency argument. For more information about the supported types, see Rebalance Frequency.
This model removes expired insights from the Insight Manager during each rebalance. It also removes all insights for a security when the security is removed from the universe.
To view the implementation of this model, see the LEAN GitHub repository.
Confidence Weighted Model
The ConfidenceWeightedPortfolioConstructionModel
generates target portfolio weights based on the Insight.confidence
for the last Insight of each Symbol. If the Insight has a direction of InsightDirection.UP
, the model generates long targets. If the Insight has a direction of InsightDirection.DOWN
, the model generates short targets. If the sum of all the last active Insight per Symbol is greater than 1, the model factors down each target percent holdings proportionally so the sum is 1. The model ignores Insight
objects that have no Confidence
value.
# Use ConfidenceWeightedPortfolioConstructionModel to assign portfolio weights based on the confidence level of the latest Insights, creating long or short positions accordingly, and normalizing weights if the total exceeds 1, leveraging the strength of predictions for better allocation and risk management. self.set_portfolio_construction(ConfidenceWeightedPortfolioConstructionModel())
The following table describes the arguments the model accepts:
Argument | Data Type | Description | Default Value |
---|---|---|---|
rebalance | Resolution | Rebalancing frequency | Resolution.DAILY |
portfolio_bias | PortfolioBias | The bias of the portfolio | PortfolioBias.LONG_SHORT |
This model supports other data types for the rebalancing frequency argument. For more information about the supported types, see Rebalance Frequency.
This model removes expired insights from the Insight Manager during each rebalance. It also removes all insights for a security when the security is removed from the universe.
To view the implementation of this model, see the LEAN GitHub repository.
Insight Weighting Model
The InsightWeightingPortfolioConstructionModel
generates target portfolio weights based on the Insight.weight
for the last Insight of each Symbol. If the Insight has a direction of InsightDirection.UP
, the model generates long targets. If the Insight has a direction of InsightDirection.DOWN
, the model generates short targets. If the sum of all the last active Insight per Symbol is greater than 1, the model factors down each target percent holdings proportionally so the sum is 1. The model takes the absolute value of the Weight
of each Insight
object and ignores Insight
objects that have no Weight
value.
# Use InsightWeightingPortfolioConstructionModel to allocate capital based on the latest Insight weights, generating long or short targets as per the Insight direction and adjusting allocations if total weights exceed 1, ensuring portfolio weights reflect current market insights and maintains proper risk management. self.set_portfolio_construction(InsightWeightingPortfolioConstructionModel())
The following table describes the arguments the model accepts:
Argument | Data Type | Description | Default Value |
---|---|---|---|
rebalance | Resolution | Rebalancing frequency | Resolution.DAILY |
portfolio_bias | PortfolioBias | The bias of the portfolio | PortfolioBias.LONG_SHORT |
This model supports other data types for the rebalancing frequency argument. For more information about the supported types, see Rebalance Frequency.
This model removes expired insights from the Insight Manager during each rebalance. It also removes all insights for a security when the security is removed from the universe.
To view the implementation of this model, see the LEAN GitHub repository.
Sector Weighting Model
The SectorWeightingPortfolioConstructionModel
generates target portfolio weights based on the company_reference.industry_template_code
provided by the US Fundamental dataset. The target percent holdings of each sector is 1/S where S is the number of sectors and the target percent holdings of each security is 1/N where N is the number of securities of each sector. If the insight has a direction of InsightDirection.UP
, the model generates long targets. If the insight has a direction of InsightDirection.DOWN
, the model generates short targets. The model ignores Insight
objects for Symbols that have no company_reference.industry_template_code
.
# Use SectorWeightingPortfolioConstructionModel to ensure diversified sector exposure and balanced allocation, aligning portfolio weights with sector insights while managing long and short positions based on insight direction. self.set_portfolio_construction(SectorWeightingPortfolioConstructionModel())
The following table describes the arguments the model accepts:
Argument | Data Type | Description | Default Value |
---|---|---|---|
rebalance | Resolution | Rebalancing frequency | Resolution.DAILY |
This model supports other data types for the rebalancing frequency argument. For more information about the supported types, see Rebalance Frequency.
This model removes expired insights from the Insight Manager during each rebalance. It also removes all insights for a security when the security is removed from the universe.
To view the implementation of this model, see the LEAN GitHub repository.
Accumulative Insight Model
The AccumulativeInsightPortfolioConstructionModel
generates target portfolio weights based on all the active insights of a security. For each active Insight of direction InsightDirection.UP
, it increases the position size by a fixed percent. For each active Insight of direction InsightDirection.DOWN
, it decreases the position size by a fixed percent. For each active Insight of direction InsightDirection.Flat
, it moves the position size towards 0 by a fixed percent.
# Use AccumulativeInsightPortfolioConstructionModel to adjust portfolio weights based on the cumulative value of all active insights, increasing position size for insights with UP direction to capitalize on expected upward movements, while reducing position size with down or flat insights to mitigate potential losses. self.set_portfolio_construction(AccumulativeInsightPortfolioConstructionModel())
The following table describes the arguments the model accepts:
Argument | Data Type | Description | Default Value |
---|---|---|---|
rebalance | Any of the following types:
|
Rebalancing parameter. If it's a timedelta , DateRules or Resolution , it's converted into a function. If it's None , it's ignored. The function returns the next expected rebalance time for a given algorithm UTC DateTime. The function returns None if unknown, in which case the function will be called again in the
next loop. If the function returns the current time, the portfolio rebalances. |
None |
portfolio_bias | PortfolioBias | The bias of the portfolio | PortfolioBias.LONG_SHORT |
percent | float | The percentage amount of the portfolio value to allocate to a single insight | 0.03 (3%) |
This model supports other data types for the rebalancing frequency argument. For more information about the supported types, see Rebalance Frequency.
This model removes expired insights from the Insight Manager during each rebalance. It also removes all insights for a security when the security is removed from the universe.
To view the implementation of this model, see the LEAN GitHub repository.
Mean Variance Optimization Model
The MeanVarianceOptimizationPortfolioConstructionModel
seeks to build a portfolio with the least volatility possible and achieve a target return.
# Use MeanVarianceOptimizationPortfolioConstructionModel to determine portfolio weights by optimizing for the best risk-return trade-off balancing the expected returns against the risk of each security to construct a portfolio aiming to maximize returns for a given level of risk or minimize risk for a given level of returns. self.set_portfolio_construction(MeanVarianceOptimizationPortfolioConstructionModel())
The following table describes the arguments the model accepts:
Argument | Data Type | Description | Default Value |
---|---|---|---|
rebalance | Resolution | Rebalancing frequency | Resolution.DAILY |
portfolio_bias | PortfolioBias | The bias of the portfolio | PortfolioBias.LONG_SHORT |
lookback | int | Historical return lookback period | 1 |
period | int | The time interval of history price to calculate the weight | 63 |
resolution | Resolution | The resolution of the history price | Resolution.DAILY |
target_return | float | The target portfolio return | 0.02 (2%) |
optimizer | IPortfolioOptimizer | The portfolio optimization algorithm | None |
This model supports other data types for the rebalancing frequency argument. For more information about the supported types, see Rebalance Frequency. If you don't provide an optimizer
argument, the default one is the MinimumVariancePortfolioOptimizer with upper and lower weights that respect the portfolioBias
.
This model removes expired insights from the Insight Manager during each rebalance. It also removes all insights for a security when the security is removed from the universe.
To view the implementation of this model, see the LEAN GitHub repository.
Black Litterman Optimization Model
The BlackLittermanOptimizationPortfolioConstructionModel
receives Insight
objects from multiple Alphas and combines them into a single portfolio. These multiple sources of Alpha models can be seen as the "investor views" required in the classical model.
# Use BlackLittermanOptimizationPortfolioConstructionModel to incorporate market equilibrium portfolio and the investor views to create an improved portfolio aligning with both market expectations and investor insights. self.set_portfolio_construction(BlackLittermanOptimizationPortfolioConstructionModel())
The following table describes the arguments the model accepts:
Argument | Data Type | Description | Default Value |
---|---|---|---|
rebalance | Resolution | Rebalancing frequency | Resolution.DAILY |
portfolio_bias | PortfolioBias | The bias of the portfolio | PortfolioBias.LONG_SHORT |
lookback | int | Historical return lookback period | 1 |
period | int | The time interval of history price to calculate the weight | 63 |
resolution | Resolution | The resolution of the history price | Resolution.DAILY |
risk_free_rate | float | The risk free rate | 0.0 |
delta | float | The risk aversion coefficient of the market portfolio | 2.5 |
tau | float | The model parameter indicating the uncertainty of the CAPM prior | 0.05 |
optimizer | IPortfolioOptimizer | The portfolio optimization algorithm | None |
This model supports other data types for the rebalancing frequency argument. For more information about the supported types, see Rebalance Frequency. If you don't provide an optimizer
argument, the default one is the MinimumVariancePortfolioOptimizer with upper and lower weights that respect the portfolioBias
.
This model removes expired insights from the Insight Manager during each rebalance. It also removes all insights for a security when the security is removed from the universe.
To view the implementation of this model, see the LEAN GitHub repository.
Mean Reversion Model
The MeanReversionPortfolioConstructionModel
implements an on-line portfolio selection technique, named "On-Line Moving Average Reversion" (OLMAR). The basic idea is to represent multi-period mean reversion as "Moving Average Reversion" (MAR), which explicitly predicts next price relatives using moving averages and then forms portfolios with online learning techniques.
# Use MeanReversionPortfolioConstructionModel to build a portfolio that capitalizes on the expected mean-reversion of asset prices, adjusting allocations based on deviations from historical averages to potentially enhance returns by exploiting price reversions. self.set_portfolio_construction(MeanReversionPortfolioConstructionModel())
The following table describes the arguments the model accepts:
Argument | Data Type | Description | Default Value |
---|---|---|---|
rebalance | Resolution | Rebalancing frequency | Resolution.DAILY |
portfolio_bias | PortfolioBias | The bias of the portfolio | PortfolioBias.LONG_SHORT |
reversion_threshold | float | Reversion threshold | 1 |
window_size | int | The window size of mean price | 20 |
resolution | Resolution | The resolution of the history price | Resolution.DAILY |
This model supports other data types for the rebalancing frequency argument. For more information about the supported types, see Rebalance Frequency.
This model removes expired insights from the Insight Manager during each rebalance. It also removes all insights for a security when the security is removed from the universe.
To view the implementation of this model, see the LEAN GitHub repository.
Reference:
- Li, B., Hoi, S. C. (2012). On-line portfolio selection with moving average reversion. arXiv preprint arXiv:1206.4626.
Risk Parity Model
The RiskParityPortfolioConstructionModel
seeks to build a portfolio with the equal contribution of risk to the total portfolio risk from all assets.
# Use RiskParityPortfolioConstructionModel to allocate portfolio weights based on risk contributions, ensuring that each asset contributes equally to the portfolio's overall risk, aiming for balanced risk exposure and potentially improved risk-adjusted returns. self.set_portfolio_construction(RiskParityPortfolioConstructionModel())
The following table describes the arguments the model accepts:
Argument | Data Type | Description | Default Value |
---|---|---|---|
rebalance | Resolution | Rebalancing frequency | Resolution.DAILY |
portfolio_bias | PortfolioBias | The bias of the portfolio | PortfolioBias.LONG_SHORT |
lookback | int | Historical return lookback period | 1 |
period | int | The time interval of history price to calculate the weight | 252 |
resolution | Resolution | The resolution of the history price | Resolution.DAILY |
optimizer | IPortfolioOptimizer | The portfolio optimization algorithm | None |
This model supports other data types for the rebalancing frequency argument. For more information about the supported types, see Rebalance Frequency. If you don't provide an optimizer
argument, the default one is the RiskParityPortfolioOptimizer.
This model removes expired insights from the Insight Manager during each rebalance. It also removes all insights for a security when the security is removed from the universe.
To view the implementation of this model, see the LEAN GitHub repository.