Calcular carteras
Ahora vamos a generar carteras para encontrar la mejor de cada mes. random.random() de numpy genera números aleatorios de una distribución uniforme; después los normalizamos para que sumen 1 usando el operador /=. Usamos estos pesos para calcular rentabilidades y volatilidad. Las rentabilidades son sumas de pesos por rentabilidades individuales. La volatilidad es más compleja e implica las covarianzas de las distintas acciones.
Por último, guardaremos los valores en diccionarios para usarlos más adelante, con las fechas de los meses como claves.
En este caso, solo generaremos 10 carteras para cada fecha para que el código se ejecute más rápido, pero en un caso real querrías usar entre 1000 y 5000 carteras generadas aleatoriamente para unas pocas acciones.
Este ejercicio forma parte del curso
Machine Learning para finanzas con Python
Instrucciones del ejercicio
- Genera 3 números aleatorios para los pesos usando
np.random.random(). - Calcula
returnshaciendo el producto punto (np.dot(); multiplica elemento a elemento y suma dos arrays) deweightscon las rentabilidades mensuales para ladateactual en el bucle. - Usa el método
.setdefault()para añadir una lista vacía ([]) al diccionarioportfolio_weightspara ladateactual y, a continuación, añadeweightsa la lista.
ejercicio interactivo práctico
Prueba este ejercicio completando este código de ejemplo.
portfolio_returns, portfolio_volatility, portfolio_weights = {}, {}, {}
# Get portfolio performances at each month
for date in sorted(covariances.keys()):
cov = covariances[date]
for portfolio in range(10):
weights = np.random.random(____)
weights /= np.sum(weights) # /= divides weights by their sum to normalize
returns = np.dot(____, returns_monthly.loc[____])
volatility = np.sqrt(np.dot(weights.T, np.dot(cov, weights)))
portfolio_returns.setdefault(date, []).append(returns)
portfolio_volatility.setdefault(date, []).append(volatility)
portfolio_weights.setdefault(date, ____).append(____)
print(portfolio_weights[date][0])