Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中为有效的边界添加额外的约束?_Python_Optimization_Constraints - Fatal编程技术网

如何在Python中为有效的边界添加额外的约束?

如何在Python中为有效的边界添加额外的约束?,python,optimization,constraints,Python,Optimization,Constraints,我有一个每个资产的预期收益和波动率表,还有这些资产的协方差矩阵,最后,这些资产中的一些是寻求回报的一部分,其余的资产是寻求负债的一部分,我想为寻求回报和寻求负债加上权重解释 我正在使用优化方法来解决有效边界,但我想在优化问题中添加两个约束。我的优化问题是: Minimise Volatility x subject to portfolio returns = target

我有一个每个资产的预期收益和波动率表,还有这些资产的协方差矩阵,最后,这些资产中的一些是寻求回报的一部分,其余的资产是寻求负债的一部分,我想为寻求回报和寻求负债加上权重解释

我正在使用优化方法来解决有效边界,但我想在优化问题中添加两个约束。我的优化问题是:

                 Minimise  Volatility 
                    x
                subject to portfolio returns = target
                           Sum of weights = 1
我想添加两个附加约束 搜索权重的返回总和=0.65 寻求权重的负债总额=0.35 我的代码编写为:

def efficient_return(mean_returns, cov_matrix, target):
    num_assets = len(mean_returns)
    args = (mean_returns, cov_matrix)

    def portfolio_return(weights):
        return portfolio_annualised_performance(weights, mean_returns, cov_matrix)[1]

    constraints = ({'type': 'eq', 'fun': lambda x: portfolio_return(x) - target},
                   {'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
    bounds = tuple((0,1) for asset in range(num_assets))
    result = sco.minimize(portfolio_volatility, num_assets*[1./num_assets,], args=args, method='SLSQP', bounds=bounds, constraints=constraints)
    return result


def efficient_frontier(mean_returns, cov_matrix, returns_range):
    efficients = []
    for ret in returns_range:
        efficients.append(efficient_return(mean_returns, cov_matrix, ret))
    return efficients
我的投资组合清单是:

lista_labels = ['Global Equity', 'TIPS','Long Duration Bonds – Gov’t / Credit', 'Long Duration Bonds – Credit',
               'High Yield Bonds','Emerging Market Bonds','Real Estate (Broad Market)','Global REITs',
               'Commodities','Private Infrastructure','25-year Government Bond','Broad Hedge Funds (Universe)'
                ,'Public Infrastructure','Tactical Asset Allocation','Core Plus Fixed Income']
我的寻回名单是:

lista_RS = ['Global Equity','High Yield Bonds','Emerging Market Bonds','Real Estate (Broad Market)',
           'Global REITs','Commodities','Private Infrastructure','Broad Hedge Funds (Universe)',
           'Public Infrastructure','Tactical Asset Allocation']
我的责任是:

lista_LS = ['TIPS','Long Duration Bonds – Gov’t / Credit','Long Duration Bonds – Credit','25-year Government Bond',
           'Core Plus Fixed Income'] 

我想复制这个表。提前感谢。

寻求回报0.65意味着什么?整个投资组合的构成为65%的多头?0.35是什么意思?整个投资组合的构成是35%的空头头寸?寻求回报和寻求负债的成分加起来必须是1吗?嗨,亲爱的开发者。是的,返回搜索列表中资产的权重总和必须为0.65。另一方面,负债表中资产的权重总和必须为0.35。所有资产(寻求回报和寻求负债)的权重之和必须为1。我希望你能帮助我。提前感谢。请不要只发布代码作为答案,还要解释代码的作用以及它是如何解决问题的。带有解释的答案通常更有帮助,质量更好,更容易吸引选票。
constraints = (
{'type': 'eq', 'fun': lambda x: portfolio_return(x) - target},
{'type': 'eq', 'fun': lambda x: np.sum(x) - 1},
{'type': 'eq', 'fun': lambda x: np.sum(x[x>0]) - 0.65},
{'type': 'eq', 'fun': lambda x: np.sum(x[x>0]) - 0.35}
)