首页 > 解决方案 > 投资组合优化 - 无法检索“x”的属性

问题描述

我正在学习如何使用 Gurobi 优化器,这里是投资组合优化的示例代码。

import gurobipy as gp
from gurobipy import GRB
from math import sqrt
import pandas as pd
import numpy as np

# Create historical return data for two stocks
equity1 = [0.0107, 0.0122, 0.076, 0.084, 0.0207]
equity2 = [0.0133, 0.0278, 0.0719, 0.0353, 0.0163]
data = pd.DataFrame(list(zip(equity1, equity2)), columns = ['SPX', 'FXAIX']) 
stocks = data.columns

# Calculate basic summary statistics for individual stocks
stock_volatility = data.std()
stock_return = data.mean()

# Create an empty model
m = gp.Model('portfolio')

# Add a variable for each stock
vars = pd.Series(m.addVars(stocks), index=stocks)

# Objective is to minimize risk (squared).  This is modeled using the
# covariance matrix, which measures the historical correlation between stocks.

sigma = data.cov()
portfolio_risk = sigma.dot(vars).dot(vars)
m.setObjective(portfolio_risk, GRB.MINIMIZE)

# Fix budget with a constraint
m.addConstr(vars.sum() == 1, 'budget')

# Optimize model to find the minimum risk portfolio
m.setParam('OutputFlag', 0)
m.optimize()

# Create an expression representing the expected return for the portfolio
portfolio_return = stock_return.dot(vars)

# Display minimum risk portfolio
print('Minimum Risk Portfolio:\n')
for v in vars:
    if v.x > 0:
        print('\t%s\t: %g' % (v.varname, v.x))

minrisk_volatility = sqrt(portfolio_risk.getValue())

minrisk_return = portfolio_return.getValue()

# Solve for efficient frontier by varying target return
frontier = pd.Series(dtype=np.float64)

for r in np.linspace(stock_return.min(), stock_return.max(), 100):
    m.addConstr(portfolio_return == r, 'target')  
    m.optimize()
    print(portfolio_risk.getValue()) 
    #frontier.loc[sqrt(portfolio_risk.getValue())] = r

当我尝试创建有效的边界时,我收到错误“无法以某种方式检索最后一行代码的属性'x'。感谢您的任何建议!

标签: pythonpandasgurobi

解决方案


首先,两个重要的建议:

  1. 始终检查状态代码以查看对 Model.optimize() 的调用状态
  2. 对于调试,永远不要禁用日志记录,所以注释掉设置参数 OutputFlag=0 的行

通过日志记录,我得到以下输出:

Barrier solved model in 0 iterations and 0.00 seconds
Model is infeasible or unbounded
Traceback (most recent call last):
  File "so.py", line 56, in <module>
    print(portfolio_risk.getValue()) 
  File "src/gurobipy/quadexpr.pxi", line 404, in gurobipy.QuadExpr.getValue
  File "src/gurobipy/var.pxi", line 125, in gurobipy.Var.__getattr__
  File "src/gurobipy/var.pxi", line 153, in gurobipy.Var.getAttr
  File "src/gurobipy/attrutil.pxi", line 100, in gurobipy.__getattr
AttributeError: Unable to retrieve attribute 'x'

因此,要解决根本问题,请按照 Gurobi 知识库文章中的说明操作:How do I resolve the error "Model is infeasible or unbounded"


推荐阅读