Un optimiseur, c'est une fonction plus des règles
scipy.optimize.minimize(fun, x0, method='SLSQP', bounds=..., constraints=...) trouve le vecteur qui rend fun minimale. On lui donne trois sortes d'informations. L'objectif fun(w) renvoie un nombre à minimiser : pour un portefeuille de variance minimale c'est w @ cov @ w, et pour maximiser quelque chose on minimise son opposé. Les bornes sont une liste de paires (bas, haut), une par poids : (0, cap) signifie pas de vente à découvert et pas de position au-dessus du plafond. Les contraintes sont des dictionnaires : {'type': 'eq', 'fun': lambda w: w.sum() - 1} force les poids à totaliser un, car une fonction eq doit valoir zéro, alors qu'une fonction ineq doit rester supérieure ou égale à zéro. Le point de départ x0 compte aussi : des poids égaux forment un départ raisonnable et admissible.
Deux détails décident de l'exactitude de la réponse. D'abord l'échelle : les variances quotidiennes sont des nombres comme 0,0001, et SLSQP s'arrête quand l'objectif varie de moins que sa tolérance ftol (1e-6 par défaut) ; avec des chiffres quotidiens bruts il peut donc s'arrêter au point de départ sans bouger. Annualisez les entrées (fois 252) et passez options={'ftol': 1e-12, 'maxiter': 500}, et vérifiez toujours result.success et que les poids respectent les règles. Ensuite la formulation : maximiser le ratio de Sharpe est un rapport, donc minimisez -(w @ mu) / sqrt(w @ cov @ w) ; la parité de risque demande des parts de risque égales wᵢ(Σw)ᵢ/ wᵀΣw, donc minimisez les écarts au carré à 1/n ; et une frontière efficiente est un problème de variance minimale par rendement cible, avec une seconde contrainte eq w @ mu - cible.
- Échelle et tolérance : annualisez les entrées et resserrez
ftol, sinon SLSQP peut s'arrêter là où il a commencé. - Vérifiez la réponse : les poids doivent totaliser un et respecter les bornes ; regardez
result.success. - Un outil, quatre problèmes : variance minimale, Sharpe négatif, parts de risque égales et un problème par rendement cible sont tous des appels
minimizeavec des objectifs et contraintes différents.
Lab : ce qui est noté
- Entrées annuelles8 pts
- Rendement et risque d'un portefeuille8 pts
- Variance minimale avec plafond18 pts
- Ratio de Sharpe maximal18 pts
- Contributions au risque10 pts
- Parité de risque16 pts
- Une frontière point par point10 pts
- Trois portefeuilles12 pts