微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scipy优化模型返回所有​​nan解

如何解决scipy优化模型返回所有​​nan解

我在下面的代码中尝试计算针对有效边界的最大锐化比解决方案。我正在尝试最小化波动率并最大化锐化率(通过最小化锐化率的负数)。但是,我的优化模型解决方案将返回所有nan作为权重。我看到std值也是nan。协方差数据帧和mean_return不包含任何nan值。我在下面提供了一些示例数据。我的实际prices_df有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)

代码

import numpy as np 
import pandas as pd

from pandas import Timestamp
import scipy.optimize as sco


mean_returns = prices_df.mean()
cov_matrix = prices_df.cov()
risk_free_rate = 0.0

def portfolio_annualised_performance(weights,mean_returns,cov_matrix):
    returns = np.sum(mean_returns*weights ) *252
    std = np.sqrt(np.dot(weights.T,np.dot(cov_matrix,weights))) * np.sqrt(252)
    print('returns: '+str(returns))
    print('std: '+str(std))
    return std,returns

def neg_sharpe_ratio(weights,cov_matrix,risk_free_rate):
    p_var,p_ret = portfolio_annualised_performance(weights,cov_matrix)
    return -(p_ret - risk_free_rate) / p_var

def max_sharpe_ratio(mean_returns,risk_free_rate):
    num_assets = len(mean_returns)
    args = (mean_returns,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)
    return result






# getting asset allocations from code above
opt_results = max_sharpe_ratio(mean_returns,risk_free_rate)


weights=opt_results.x

更新:

添加

def max_sharpe_ratio(mean_returns,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,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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。