Calculer des portefeuilles
Nous allons maintenant générer des portefeuilles afin d'identifier le meilleur de chaque mois. La fonction random.random() de numpy génère des nombres aléatoires selon une loi uniforme, puis nous les normalisons pour qu'ils somment à 1 grâce à l'opérateur /=. Nous utilisons ensuite ces pondérations pour calculer le rendement et la volatilité. Le rendement est la somme des pondérations multipliées par les rendements individuels. La volatilité est plus complexe et fait intervenir les covariances entre les différentes actions.
Enfin, nous stockerons les valeurs dans des dictionnaires pour un usage ultérieur, avec les dates des mois comme clés.
Ici, nous ne générerons que 10 portefeuilles par date pour accélérer l'exécution, mais dans un cas d'usage réel, vous voudriez plutôt utiliser entre 1 000 et 5 000 portefeuilles générés aléatoirement pour quelques actions.
Cet exercice fait partie du cours
<cours>Machine Learning pour la finance en Python</cours>Instructions de l’exercice
- Générez 3 nombres aléatoires pour les pondérations avec
np.random.random(). - Calculez
returnsen prenant le produit scalaire (np.dot(); multiplie élément par élément et somme deux tableaux) deweightsavec les rendements mensuels pour ladatecourante dans la boucle. - Utilisez la méthode
.setdefault()pour ajouter une liste vide ([]) au dictionnaireportfolio_weightspour ladatecourante, puis ajoutez-yweightsavecappend.
Exercice interactif pratique
Essayez cet exercice en complétant ce code d’exemple.
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])