How to add additional constraints for an Efficient Frontier in Python?

I have a table with expected returns and volatility by each asset, also I have the covariance matrix of these assets, and for last, some of these assets being part of Returns Seeking and the remaining assets being part of Liabilities Seeking, I want to add weigh constraitns for Return Seeking and Liabilities Seeking.

I'm using an optimization method to solve an efficient frontier but I want to add two constraints in my optimization problem. My optimization problem is:

                 Minimise  Volatility 
                    x
                subject to portfolio returns = target
                           Sum of weights = 1

And I want to add two additional constraints Sum of Returns Seeking Weights = 0.65 Sum of Liabilities Seeking Weights = 0.35 My code is written as:

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

My portfolio list is:

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']

My Return Seeking list is:

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']

And my Liabilities Seeking is:

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

I want to replicate this table http://prntscr.com/twredz. Thanks in advance.

Upvotes: 1

Views: 1132

Answers (1)

develarist
develarist

Reputation: 1375

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}
)

Upvotes: 1

Related Questions