常见问题解答 ¶
作者:Robert Andrew Martin
译者:片刻小哥哥
项目地址:https://portfolio.apachecn.org/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()