跳转至

常见问题解答

作者:Robert Andrew Martin

译者:片刻小哥哥

项目地址:https://www.dafeiyang.cn/finance/stock/tools/PyPortfolioOpt/FAQ

原始地址:https://pyportfolioopt.readthedocs.io/en/latest/FAQ.html

限制分数

假设对于每项资产,您都有一些“分数”——它可以是 ESG 指标,也可以是一些自定义风险/回报指标。指定线性约束很简单,例如“投资组合 ESG 得分必须大于 x”:您只需创建 分数向量,对这些分数与投资组合权重的点积添加约束,然后优化您的目标:

esg_scores = [0.3, 0.1, 0.4, 0.1, 0.5, 0.9, 0.2]
portfolio_min_score = 0.5

ef = EfficientFrontier(mu, S)
ef.add_constraint(lambda w: esg_scores @ w >= portfolio_min_score)
ef.min_volatility()

限制资产数量

不幸的是,基数约束不是凸的,这使得它们难以实现。

但是,我们可以将其视为混合整数程序并求解(前提是您可以访问求解器)。 对于少于 1000 个变量和约束的小问题,您可以使用社区版本的 CPLEX: pip install cplex 。在下面的示例中,我们将投资组合限制为最多 10 项资产:

import cvxpy as cp

ef = EfficientFrontier(mu, S, solver=cp.CPLEX)
booleans = cp.Variable(len(ef.tickers), boolean=True)
ef.add_constraint(lambda x: x <= booleans)
ef.add_constraint(lambda x: cp.sum(booleans) <= 10)
ef.min_volatility()

这不能很好地配合 max_sharpe ,并且需要针对不同的边界进行修改。 看 本期 以供进一步讨论。

跟踪误差

跟踪误差可以用作目标(如中所述 通用有效前沿 ) 或者 作为约束。这是添加跟踪误差约束的示例:

from objective functions import ex_ante_tracking_error

benchmark_weights = ...  # benchmark

ef = EfficientFrontier(mu, S)
ef.add_constraint(ex_ante_tracking_error, cov_matrix=ef.cov_matrix,
                  benchmark_weights=benchmark_weights)
ef.min_volatility()


回到顶部