Python投资组合优化efficient_return无报错异常排查
问题现象
- 参考公开教程实现Python投资组合有效前沿计算逻辑时,代码全程无报错抛出,但有效前沿计算、绘制功能完全无法正常执行。
- 核心异常集中在
efficient_return目标收益求解函数段。
根因定位
问题完全由Python代码缩进错误导致,无其他复杂逻辑问题:
- 原代码中嵌套函数
portfolio_return的缩进级别错误,被定义成了和efficient_return平级的全局函数,而非efficient_return的内部函数。 efficient_return函数执行完num_assets、args两个变量赋值后就直接运行结束,默认返回None,后续的约束定义、优化求解、结果返回逻辑完全没有被包含在efficient_return的执行范围内。- 约束定义、
sco.minimize求解、return result这几行代码,错误落在了portfolio_return函数内部、且位于portfolio_return的return语句之后,属于永远不会触发的死代码,因此全程不会抛出变量作用域相关的报错,形成“无错但失效”的现象。
修复方案
调整efficient_return段的代码缩进,将portfolio_return正确嵌套为内部函数,将约束配置、优化求解、结果返回的代码对齐到efficient_return的函数内部层级即可。
修复后的核心函数代码如下:
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] # 以下逻辑均属于efficient_return内部执行代码,和portfolio_return平级 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
修复验证
替换原错误代码段后,efficient_frontier遍历目标收益时可以正常拿到每个收益点对应的最小波动率优化结果,后续绘制有效前沿的plt.plot逻辑可以正常读取结果中的fun值(即最小波动率)完成曲线绘制,不会再出现空值调用、遍历异常的问题。
内容的提问来源于stack exchange,提问作者Espejito
相关产品推荐
相关产品推荐

