问题描述
我在下面的代码中尝试计算针对有效边界的最大锐化比解决方案。我正在尝试最小化波动率并最大化锐化率(通过最小化锐化率的负数)。但是,我的优化模型解决方案将返回所有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 (将#修改为@)