嗨,我正在尝试绘制一个有效的边界。下面是我用的。 返回参数由投资组合的9列收益组成。我选择了10,000个投资组合,这就是我高效的边界的样子。这不是我们所熟悉的通常的边界形状。
有人可以请我解释一下这个问题。
def monteCarlo_Simulation(returns):
#returns=returns.drop("Date")
returns=returns/100
stocks=list(returns)
stocks1=list(returns)
stocks1.insert(0,"ret")
stocks1.insert(1,"stdev")
stocks1.insert(2,"sharpe")
print (stocks)
#calculate mean daily return and covariance of daily returns
mean_daily_returns = returns.mean()
#print (mean_daily_returns)
cov_matrix = returns.cov()
#set number of runs of random portfolio weights
num_portfolios = 10000
#set up array to hold results
#We have increased the size of the array to hold the weight values for each stock
results = np.zeros((4+len(stocks)-1,num_portfolios))
for i in range(num_portfolios):
#select random weights for portfolio holdings
weights = np.array(np.random.random(len(stocks)))
#rebalance weights to sum to 1
weights /= np.sum(weights)
#calculate portfolio return and volatility
portfolio_return = np.sum(mean_daily_returns * weights) * 252
portfolio_std_dev = np.sqrt(np.dot(weights.T,np.dot(cov_matrix, weights))) * np.sqrt(252)
#store results in results array
results[0,i] = portfolio_return
results[1,i] = portfolio_std_dev
#store Sharpe Ratio (return / volatility) - risk free rate element excluded for simplicity
results[2,i] = results[0,i] / results[1,i]
#iterate through the weight vector and add data to results array
for j in range(len(weights)):
results[j+3,i] = weights[j]
print (results.T.shape)
#convert results array to Pandas DataFrame
results_frame = pd.DataFrame(results.T,columns=stocks1)
#locate position of portfolio with highest Sharpe Ratio
max_sharpe_port = results_frame.iloc[results_frame['sharpe'].idxmax()]
#locate positon of portfolio with minimum standard deviation
min_vol_port = results_frame.iloc[results_frame['stdev'].idxmin()]
#create scatter plot coloured by Sharpe Ratio
plt.figure(figsize=(10,10))
plt.scatter(results_frame.stdev,results_frame.ret,c=results_frame.sharpe,cmap='RdYlBu')
plt.xlabel('Volatility')
plt.ylabel('Returns')
plt.colorbar()
#plot red star to highlight position of portfolio with highest Sharpe Ratio
plt.scatter(max_sharpe_port[1],max_sharpe_port[0],marker=(2,1,0),color='r',s=1000)
#plot green star to highlight position of minimum variance portfolio
plt.scatter(min_vol_port[1],min_vol_port[0],marker=(2,1,0),color='g',s=1000)
print(max_sharpe_port)
答案 0 :(得分:0)
很有可能不是混乱的图形或代码-而是您的输入。尝试玩弄资产。您的优化算法中包含的资产可能是高度正相关的,从而导致多元化的影响可忽略不计。反过来,这会影响有效边界的形状。
编辑:
如果这不是问题的根源。也许使用以下代码行重试该程序:
def monteCarlo_Simulation(returns):
noa = len(tickers)
random_returns = []
random_volatility = []
for i in range (10000):
weights = np.random.random(noa)
weights = weights / np.sum(weights)
random_returns.append(np.sum(returns.mean()*weights)*252)
random_volatility.append(np.sqrt(np.dot(weights.T, np.dot(returns.cov()*252, weights))))
random_returns = np.array(random_returns)
random_volatility = np.array(random_volatility)
fig_random = plt.figure(figsize = [6,4])
plt.scatter(random_volatility, random_returns,
c= random_returns / random_volatility, marker = '.')
plt.grid(True)
plt.xlabel('Expected volatility')
plt.ylabel('Expected return')
plt.colorbar(label='Sharpe ratio')
plt.title('Mean Variance Analysis Plot')
plt.show()
答案 1 :(得分:0)
我遇到了类似的问题,我通过查看 NaN 值解决了这个问题,有些公司的 IPO 很晚,有些是在同一年。因此,您需要收集与您的股票投资组合中最新 IPO 相同的数据。或者剔除在您检索数据之日之前未 IPO 的所有股票。