Calcular portfólios
Agora vamos gerar portfólios para encontrar o melhor de cada mês. O random.random() do numpy gera números aleatórios de uma distribuição uniforme; em seguida, normalizamos esses números para que somem 1 usando o operador /=. Usamos esses pesos para calcular retorno e volatilidade. O retorno é a soma dos pesos multiplicados pelos retornos individuais. A volatilidade é mais complexa e envolve as covariâncias das diferentes ações.
Por fim, vamos armazenar os valores em dicionários para uso posterior, usando as datas dos meses como chaves.
Neste caso, vamos gerar apenas 10 portfólios para cada data para o código rodar mais rápido, mas em um caso de uso real você provavelmente usaria algo entre 1000 e 5000 portfólios gerados aleatoriamente para algumas ações.
Este exercicio faz parte do curso
Machine Learning para Finanças em Python
Instruções do exercicio
- Gere 3 números aleatórios para os pesos usando
np.random.random(). - Calcule
returnsfazendo o produto escalar (np.dot(); multiplica elemento por elemento e soma dois arrays) deweightscom os retornos mensais para adateatual no loop. - Use o método
.setdefault()para adicionar uma lista vazia ([]) ao dicionárioportfolio_weightspara adateatual e, em seguida, acrescenteweightsa essa lista.
exercicio interativo prático
Tente este exercicio completando este código de exemplo.
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])