Pandas scipy优化模型返回所有nan解决方案

Pandas scipy优化模型返回所有nan解决方案,pandas,numpy,linear-programming,scipy-optimize-minimize,Pandas,Numpy,Linear Programming,Scipy Optimize Minimize,我有下面的代码,我试图计算有效边界的最大夏普比解。我试图最小化波动性,最大化夏普比率(通过最小化夏普比率的负数)。但是,我的优化模型解决方案是返回权重的所有nan。我看到std值也是nan。协方差数据帧和平均返回值不包含任何nan值。我在下面提供了一些示例数据。我的实际价格有253条记录和587列,但所有值都与下面的示例类似。对于列数少得多(14)的数据集,下面的代码可以正常工作。有人知道问题可能是什么吗 样本数据: print(prices_df[prices_df.columns[:5]].

我有下面的代码,我试图计算有效边界的最大夏普比解。我试图最小化波动性,最大化夏普比率(通过最小化夏普比率的负数)。但是,我的优化模型解决方案是返回权重的所有nan。我看到std值也是nan。协方差数据帧和平均返回值不包含任何nan值。我在下面提供了一些示例数据。我的实际价格有253条记录和587列,但所有值都与下面的示例类似。对于列数少得多(14)的数据集,下面的代码可以正常工作。有人知道问题可能是什么吗

样本数据:

print(prices_df[prices_df.columns[:5]].head(n=5))

Equity(772 [CY])  Equity(128 [ALL])  \
2014-12-31 00:00:00+00:00            13.733             68.948   
2015-01-02 00:00:00+00:00            13.906             68.820   
2015-01-05 00:00:00+00:00            13.675             67.456   
2015-01-06 00:00:00+00:00            13.165             67.407   
2015-01-07 00:00:00+00:00            13.512             68.516   

                           Equity(445 [BWA])  Equity(926 [EGN])  \
2014-12-31 00:00:00+00:00             54.391             63.678   
2015-01-02 00:00:00+00:00             54.183             63.159   
2015-01-05 00:00:00+00:00             52.619             59.393   
2015-01-06 00:00:00+00:00             52.253             59.044   
2015-01-07 00:00:00+00:00             53.481             58.974   

                           Equity(646 [COL])  
2014-12-31 00:00:00+00:00             83.276  
2015-01-02 00:00:00+00:00             83.414  
2015-01-05 00:00:00+00:00             82.685  
2015-01-06 00:00:00+00:00             82.577  
2015-01-07 00:00:00+00:00             83.710



prices_df.shape

(253, 587)
代码:

更新:

我补充说

def max_sharpe_ratio(mean_returns, cov_matrix, risk_free_rate):
    num_assets = len(mean_returns)
    args = (mean_returns, cov_matrix, risk_free_rate)
    constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
    bound = (0.0,1.0)
    bounds = tuple(bound for asset in range(num_assets))
    result = sco.minimize(neg_sharpe_ratio, num_assets*[1./num_assets,], args=args,
                        method='SLSQP', bounds=bounds, constraints=constraints,options={"disp": True})
    return result
并获得输出消息:

Iteration limit exceeded    (Exit mode 9)
            Current function value: nan
            Iterations: 101
            Function evaluations: 60489
            Gradient evaluations: 101
当我将其更改为:

def max_sharpe_ratio(mean_returns, cov_matrix, risk_free_rate):
    num_assets = len(mean_returns)
    args = (mean_returns, cov_matrix, risk_free_rate)
    constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
    bound = (0.0,1.0)
    bounds = tuple(bound for asset in range(num_assets))
    result = sco.minimize(neg_sharpe_ratio, num_assets*[1./num_assets,], args=args,
                        method='SLSQP', bounds=bounds, constraints=constraints,options={"disp": True,'maxiter':1000})
    return result
我得到:

Iteration limit exceeded    (Exit mode 9)
            Current function value: nan
            Iterations: 1001
            Function evaluations: 599589
            Gradient evaluations: 1001

SLSQP返回的状态是什么?另外,请注意,这个问题通常作为QP解决(经过一些不寻常的重新表述)。@ErwinKalvelagen谢谢您回复我。我添加了options={'disp':True},以便可以看到输出的更多细节。它正在返回状态9,我尝试将迭代次数一直增加到1000次,但没有成功。你知道问题可能是什么吗?mean_returns或cov_matrix中没有任何nan值,而且它适用于更小的数据帧。我根本不相信这种设置
mean\u returns=prices\u df.mean()
实际计算的是平均价格,而不是平均回报。这里似乎有一些基本的误解。
Iteration limit exceeded    (Exit mode 9)
            Current function value: nan
            Iterations: 1001
            Function evaluations: 599589
            Gradient evaluations: 1001