python - 投资组合优化 - 无法检索“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'。感谢您的任何建议!
解决方案
首先,两个重要的建议:
- 始终检查状态代码以查看对 Model.optimize() 的调用状态
- 对于调试,永远不要禁用日志记录,所以注释掉设置参数 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"。
推荐阅读
- julia - 在强化学习.jl 中使用神经网络逼近器
- java - 如何在 MapBox Android Studio 中的多个标记之间绘制优化路线
- adaptive-cards - 如何在 Power Virtual Agents 中使用自适应卡?
- android - 如何在 Android Espresso 测试中避免文本输入布局建议?
- javascript - 用另一个数组javascript对一个对象数组进行排序
- python - 驴车模拟器连接 - macOS 错误 (loggerinfo)
- ssl - SignTool:获取退出代码 0x1 错误,因为它找不到我的代码签名证书
- user-interface - 是否可以在 Visual Studio 2019 社区版中将 GUI 添加到我的 C# 项目?
- html -
使用 CSS 在添加到购物车按钮之间添加一个 - c - C - getopt 错误地将下一个选项解释为上一个选项的参数