Hola estoy intentando dibujar una frontera eficiente. A continuación se muestra lo que he utilizado. El parámetro de retornos consiste en 9 columnas de retornos de cartera. Seleccioné 10.000 carteras y así es como quedó mi frontera eficiente. Esta no es la forma de frontera habitual que nos es familiar.
El conjunto de datos es 48_Industry_Portfolios_daily.csv, obtenido de ( http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html ). Se seleccionaron las 9 primeras columnas
¿Puede alguien explicarme el problema?
def portfolio_annualised_performance(weights, mean_returns, cov_matrix):
returns = np.sum(mean_returns*weights ) *252
#print ('weights shape',weights.shape)
#print (' Returns ',returns)
std = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights))) * np.sqrt(252)
#print ('Std ',std)
return std, returns
def random_portfolios(num_portfolios, mean_returns, cov_matrix, risk_free_rate):
results = np.zeros((3,num_portfolios))
weights_record = []
for i in range(num_portfolios):
weights = np.random.random(48)
weights /= np.sum(weights)
weights_record.append(weights)
portfolio_std_dev, portfolio_return = portfolio_annualised_performance(weights, mean_returns, cov_matrix)
results[0,i] = portfolio_std_dev
results[1,i] = portfolio_return
results[2,i] = (portfolio_return - risk_free_rate) / portfolio_std_dev
return results, weights_record
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)
respuesta actualizada
También me piden que compare la varianza de la cartera utilizando diferentes regularizaciones y que utilice un método de validación para encontrar los parámetros óptimos. ¿Podemos utilizar python para hacer esto?
2 votos
Sería de gran ayuda que otros tuvieran tu parámetro returns para poder ejecutar el código y depurarlo.
0 votos
¿Hay alguna forma de adjuntar mi excel?
0 votos
Puedes subir un csv a algún sitio y enlazarlo.
1 votos
¿Qué has hecho para preprocesar los muchos valores erróneos/que faltan en la columna "refresco"? Los comentarios de abajo sobre tomar más muestras no los considero correctos, ya deberías ver una forma razonable con no tantas muestras debido a su distribución. Pero si sus datos de entrada son erróneos, entonces no estoy seguro de lo que obtendrá...
0 votos
Hola.... He seleccionado datos a partir de 2005. Así que no hay valores perdidos a partir de 2005
0 votos
El mío se parecía al tuyo cuando aumenté el número de activos. Podrías considerar la contracción. Además, lo más probable es que sus datos estén en días, intente utilizar Meses. Estoy teniendo dificultades para llegar a la contracción.