1 18 #1 09/01/2020 15h23
- LeWiZ
- Membre (2014)
Top 50 Finance/Économie - Réputation : 30
Bonjour,
Comme mentionné dans ma présentation, je me lance pour détailler l’approche que j’utilise pour calculer la répartition cible des ETF de mon portefeuille via une optimisation linéaire.
Cette approche vous semblera certainement inutilement compliquée. Et je suis d’accord ! Mais ça m’amuse : j’espère mon enthousiasme geek / matheux sera un peu partagé :-). Veuillez m’excuser d’avance pour la longueur de ce post.
L’objectif est le suivant : déterminer mathématiquement l’allocation se rapprochant le plus possible d’une cible donnée tout en minimisant les frais.
Dans mon cas, je souhaitais déterminer l’allocation d’ETF éligibles PEA permettant d’approcher le plus possible l’indice MSCI ACWI IMI tout en minimisant les frais.
Spoiler : le résultat de l’optimisation que j’utilise dans mon portefeuille me rapproche avec une "erreur résiduelle de 17 %" (cf. ci-dessous l’explication de cette distance) du MSCI ACWI IMI pour 0,16 % de frais annuels, via un portefeuille de 7 ETF. C’est quand même 2 fois moins cher qu’un ETF MSCI World.
La démarche s’applique bien entendu quelle que soit la cible et le périmètre d’investissement qu’on se donne.
Modélisation d’un portefeuille
Je modélise un portefeuille comme un vecteur dans un espace des supports d’investissements.
Par exemple, pour mon optimisation vers le MSCI ACWI IMI, je me suis constitué une short-list de 13 ETF éligibles PEA couvrant diverses zones géographiques et diverses tailles de capitalisation. Un portefeuille est alors représenté comme un vecteur à 13 dimensions, où chaque composante est comprise entre 0 et 1 (le pourcentage d’allocation sur chaque ETF) et où la somme des composantes fait 1.
Remarquez que je n’utilise à aucun moment la valorisation "en euros" du portefeuille, puisque seule m’intéresse sa répartition au sein des différents supports d’investissement.
Modélisation des objectifs
Comme le suggère la formulation de l’objectif ci-dessus, le résultat de l’optimisation est nécessairement un compromis entre deux sous-objectifs :
- la minimisation de la "distance" entre le portefeuille et la cible
- la minimisation de coûts
Il convient tout d’abord de modéliser ces deux sous-objectifs.
Objectif de distance
La mesure d’une distance entre deux allocations dépend bien-entendu de l’univers d’investissement qu’on manipule. Dans mon cas, s’agissant d’ETF visant à répliquer un indice monde, j’ai choisi de mesurer cette distance en projetant les allocations sur un espace produit géographie - taille.
Concrètement, je découpe arbitrairement le monde en 7 plaques géographiques :
- Etats-Unis
- Europe (marchés développés) hors France
- France
- Japon
- Autres marchés développés (Canada, Australie, Hong Kong, etc.)
- Marchés émergents Asie
- Marchés émergents hors Asie
Puis je subdivise chaque plaque géographique selon les 3 tailles utilisées par les indices MSCI
- Large cap
- Mid cap
- Small cap
Ce découpage est arbitraire. Et il impacte fortement le résultat de l’optimisation. Mais il n’y a pas à mon sens de découpage canonique : il faut donc faire un choix. Voici les raisons qui m’ont poussé à choisir celui-ci :
- une large proportion des ETF suivent les indices MSCI : il est donc plus facile de les assembler si on reste dans le paradigme MSCI (notamment le facteur taille)
- ce découpage géographique correspond de manière à peine simplifiée aux périmètres géographiques disponibles à l’investissement via des ETF éligibles PEA
- j’ai choisi d’isoler la France en faisant l’hypothèse que des ETF à très bas coût pouvaient un jour être émis par Amundi / Lyxor et qu’il pouvait donc être intéressant d’en faire un cas à part. Ce n’est hélas pas (encore) le cas.
Les 7 plaques géographiques croisées avec les 3 tailles font donc 21 poches d’investissements.
Je modélise alors une allocation comme sa répartition au sein des 21 poches. Par exemple, un ETF suivant l’indice Russell 2000 aurait 100 % dans la poche Etats-Unis - Small et 0 % dans les autres. Un ETF suivant l’indice MSCI France aurait (données MSCI au moment où j’écris ces lignes) 82 % en France - Large et 18 % en France - Mid.
On peut alors représenter une allocation comme un vecteur dans un espace à 21 dimensions, dont chaque composante est comprise entre 0 et 1 et dont la somme des composantes fait exactement 1.
Je définis alors la distance entre deux portefeuille comme la distance L1 entre les deux projections sur l’espace géographie - taille. La distance L1, c’est la somme des valeurs absolues des écarts. Autrement dit, pour deux "vecteurs allocations" a1 et a2 :
distance = |a1 - a2| = sum(|a1_i - a2_i|)
Je note ici a1_i et a2_i les composantes respectives des allocations a1 et a2 pour l’indice i.
Ainsi, quand dans mon spoiler ci-dessus je disais que le résultat de l’optimisation s’approchait du MSCI ACWI IMI avec une erreur résiduelle de 17 %, cela voulait dire qu’après projection du MSCI ACWI IMI et du résultat de l’optimisation dans les 21 poches, la somme des valeurs absolues des différences de % de répartition était d’environ 17 %.
Remarque 1 : les matheux me diront qu’il y a d’autres façons de mesurer la distance, notamment la norme L2 (racine carrée de la somme des carrés des écarts) qui est plus courante dans les exercices d’optimisation. C’est vrai, mais la norme L1 présente des avantages intéressants que je détaille ci-dessous.
Remarque 2 : je regarde uniquement la répartition des ETF ou des allocations dans mes 21 poches, mais pas le taux de couverture de la poche en question. C’est une faiblesse du modèle. En effet, un ETF qui par exemple ne suivrait que les 50 plus petites capitalisations boursières du S&P 500 serait ici catégorisée à 100 % dans Etats-Unis - Large. Mais il serait bien entendu loin de couvrir l’intégralité des grandes capitalisation américaines.
Si je me dote d’une matrice "A" d’allocation de mes supports d’investissement (dans mon exemple, 13 colonnes correspondant à ma short-list d’ETF et 21 lignes correspondant à mes poches) avec dans chaque "case" la part de la poche pour le support d’investissement correspondant, alors je peux calculer l’allocation d’un portefeuille à l’aide d’un produit matriciel :
a = A p
Avec "p" mon vecteur portefeuille à 13 dimensions et "a" l’allocation résultante à 21 dimensions.
C’est une manière de dire que l’allocation d’un portefeuille est la somme pondérée de l’allocation des supports d’investissement qui la compose.
Si je note "c" l’allocation cible (dans mon cas, le MSCI ACWI IMI), la distance géographique d’un portefeuille "p" avec la cible est donnée par :
distance = |A p - c|
Objectif de coûts
Je modélise le coût d’un portefeuille comme un taux fixe annuel, à l’image des frais d’un ETF.
Si je note "f" le "vecteur frais" correspondant à mon espace de supports d’investissements (dans mon cas, les 13 taux de frais annuels correspondant à mes 13 ETF short-listés), alors le taux de frais d’un portefeuille "p" sera donné par :
frais récurrents = p . f
Le "." signifie ici le produit scalaire, c’est-à-dire la somme des produits terme à terme.
Je ne l’ai pas fait chez moi, mais on pourrait tout à faire tenir compte des tracking differences de la même manière, par exemple en créant un "vecteur frais corrigé" dans lequel la tracking difference est ajouté aux frais annuels, en positif ou en négatif. On peut de la même manière y ajouter les éventuels frais récurrents liés à la détention de supports d’investissement hors Euronext (comme chez Bourse Direct).
Je souhaite également tenir compte dans mon modèle des frais de transaction. Pourquoi ? Parce que je sais que ma short-list d’ETF pourra être amenée à évoluer, par exemple suite à l’introduction d’un nouvel ETF à prix compétitif, ou alors suite à la suppression d’un ETF par un émetteur. Je souhaite tenir compte des éventuels compromis à faire entre basculer vers un nouvel ETF moins cher et les coûts de transactions que cela représenterait.
Je modélise les frais de transaction comme un taux fixe sur le volume total échangé. C’est le cas pour la plupart des courtiers si on dépasse certain montant, par exemple 0,09 % chez Bourse Direct au dessus de 4400 €. Supposons pour simplifier que toutes les transactions respectent ce minimum et se font donc à frais de transaction unique.
Notons "t" ce taux des frais de transactions. Passer d’un portefeuille "p0" à un portefeuille "p" implique alors les frais de transaction suivants :
frais transaction = t|p0 - p|
Mais comment rapprocher des frais de transactions ponctuels à des frais récurrents ? En introduisant une hypothèse de temps de retour sur investissement.
Je décide arbitrairement que les frais de transactions peuvent être compensés par un certain nombre d’années de gains sur les frais récurrents. J’appelle "tri" ce nombre d’années. Chez moi, j’utilise "tri" = 3 ans.
On peut alors rassembler dans une même formule l’ensemble des frais :
frais = p . f + (t / tri) |p - p0|
Avec "f" le vecteur frais récurrents, "t" les frais de transactions, "tri" le temps de retour sur investissement, "p0" le portefeuille actuel et "p" le portefeuille cible.
Combinaison des objectifs
Maintenant que les 2 sous-objectifs sont modélisés, il faut les combiner pour former un objectif global qui fera l’objet de l’optimisation. Ceci est fait en introduisant un paramètre de poids relatif de l’objectif de coûts par rapport à l’objectif de distance, que j’appelle "alpha" :
objectif = distance + alpha . frais
Plus "alpha" est grand, plus la réduction des frais sera prioritaire par rapport à la proximité avec l’allocation cible.
Si je développe à présent les deux sous-objectifs :
objectif = |A p - c| + alpha (p . f + (t / tri) |p - p0|)
Autrement dit, connaissant :
- "A" : l’allocation de mes différents supports d’investissements
- "c" : l’allocation cible que je souhaite atteindre
- "alpha" : l’importance de réduire les frais par rapport à l’importance de me rapprocher de mon allocation cible
- "f" : les frais récurrents de mes supports d’investissement
- "t" : mes frais de transaction
- "tri" : le temps de retour sur investissement souhaité des frais de transaction
- "p0" : mon portefeuille actuel avant optimisation
Je souhaite déterminer le portefeuille "p" qui minimise la fonction d’objectif.
Optimisation
Le vecteur "p" recherché doit bien entendu respecter des conditions pour être admissible comme un portefeuille : avoir des composantes entre 0 et 1 et exactement 1 comme somme des composantes.
On cherche donc à résoudre le système :
Trouver (p) qui minimise |A p - c| + alpha (p . f + (t / tri) |p - p0|)
Avec les contraintes 0 <= p <= 1 et sum(p_i) = 1
Comment résoudre un tel système ? La bonne nouvelle, c’est qu’il est résoluble de manière exacte à l’aide d’un algorithme d’optimisation linéaire, par exemple via l’algorithme du simplexe (Algorithme du simplexe ? Wikipédia)
Remarque 1 : certains me diront à juste titre que ma fonction d’optimisation n’a rien de linéaire en raison des valeurs absolues. Il est néanmoins possible de se ramener à un système linéaire en introduisant des variables auxiliaires. Minimiser |a| revient à minimiser b en ajoutant les deux contraintes a <= b et -a <= b. On peut ainsi transformer le système en :
Trouver (p, X, Y) qui minimise X + alpha (p . f + (t / tri) Y)
Avec les contraintes :
0 <= p <= 1
sum(p_i) = 1
-X <= A p - c<= X
-Y <= p - p0 <= Y
Ce système a la même solution "p" que le système précédent (si elle existe), et a le bon goût d’être linéaire.
Remarque 2 : si on utilise la norme L2 (racine carrée de la somme des carrés écarts, ou plus simplement somme des carrés des écarts) pour mesurer la distance au lieu de la norme L1 (somme des valeurs absolues des écarts), le système n’est plus linéaire mais il reste résoluble à l’aide d’algorithmes d’optimisation SDP (Optimisation SDP ? Wikipédia).
Remarque 3 : l’autre avantage de la norme L1, c’est que la solution est stable par rapport à de petites variations du paramètre "alpha". Ceci est expliqué par le fait que sauf cas particulier, la solution du système se trouve sur un sommet du simplexe, qui ne bouge pas suite à de petites variations de "alpha". En effet, le paramètre "alpha" n’est pas utilisé dans les contraintes du systèmes (les inégalités). Ceci a pour conséquence que le nombre de solutions distinctes du système est fini si on balaye toutes les valeurs possibles pour "alpha", en ignorant les valeurs très particulières de "alpha" pour lesquelles on se trouve sur une arête du simplexe. On peut construire du coup un joli graphique (cf. ci-dessous).
Résultats
Univers d’investissement
J’ai utilisé comme univers de supports d’investissements les 13 ETF suivants, short-listés sur la base de leur éligibilité PEA, de leur frais et éventuellement de leur encours. Je n’ai pas regardé leur tracking difference, cf. ma présentation, ce sera une prochaine étape. Je fais donc l’hypothèse abusive que ces ETF suivent parfaitement leurs indices :
- Amundi ETF Euro STOXX Small Cap
- Amundi ETF PEA MSCI Emerging Markets
- Amundi ETF PEA MSCI Europe
- Amundi MSCI World
- Amundi Russell 2000
- Amundi ETF PEA S&P 500
- Lyxor Core Euro STOXX 50
- Lyxor MSCI EMU Small Cap
- BNP Paribas EASY STOXX Europe 600
- BNP Paribas EASY MSCI Europe Small Caps Ex CW
- Amundi ETF PEA Japan TOPIX
- Amundi ETF MSCI France
- Lyxor Core Euro STOXX 300
Il y aurait certainement tout un tas de commentaires à faire sur cette sélection arbitraire. Vous remarquerez notamment que le découpage spécifique de la France et des marchés émergents Asie dans mes 7 géographies est inutile avec cette sélection. Il existe bien un ETF Emerging Asia éligible PEA chez Amundi, mais comme il est au même prix que l’ETF "tout emerging", il n’y pas d’intérêt à le shortlister ici.
Solutions
J’ai représenté l’ensemble des optimums dans le graphique suivant :
J’ai construit ce graphique fin novembre 2019. Comme c’est assez fastidieux, je ne l’ai pas (encore) mis à jour avec les dernières valeurs des indices. Mais les poids relatifs des différentes composantes n’a pas dû trop changer.
Les portefeuilles sont représentés par les colonnes. L’axe horizontal représente les différentes solutions obtenues en faisant varier le paramètre "alpha", c’est à dire l’importance de la proximité avec la cible MSCI ACWI IMI par rapport à l’importance des frais.
Le portefeuille A, tout à gauche, est celui qui s’approche le plus de la cible (6 % de distance L1), mais présente des frais annuels de 0,35 %. C’est tout de même déjà inférieur aux frais d’un unique ETF World.
Le portefeuille H, tout à droite, représente le portefeuille le moins cher, en ne donnant plus aucune importance à la cible MSCI ACWI IMI. Comme on peut s’y attendre, l’optimum est dans ce cas simplement 100 % de l’ETF le moins cher de ma shortlist, en l’occurrence MFED à 0,07 % de frais annuels.
J’ai choisi de mon côté de suivre le portefeuille C, qui me semblait représenter un bon compromis.
Implémentation en pratique
J’ai implémenté l’optimisation à l’aide du module d’optimisation linéaire de Google, disponible en extension Google Spreadsheet (Linear Optimization Add-on for Google Sheets | OR-Tools)
La principale raison de ce choix est que je faisais déjà le suivi de mon portefeuille sur Google Spreadsheet, et cela me permettait donc d’y adjoindre cette optimisation de manière intégrée. Mais il est tout à fait possible (et peut-être plus simple) de le faire en Python à l’aide d’un package d’optimisation mathématique. Il existe des packages qui peuvent gérer directement la fonction d’objectif sans besoin de la transformer (ex : Home — CVXOPT)
Une des difficultés que j’ai rencontré dans l’exercice est de constituer la matrice "A", c’est à dire de projeter l’ensemble des vecteurs d’investissement (chez moi les ETF éligibles PEA) dans les poches (chez moi le croisement géographie - taille). J’ai pour cela développé un petit script de scrapping des données de clôture des indices MSCI, que j’utilise à la fois pour alimenter mon allocation cible (MSCI ACWI IMI) et l’allocation des différents ETF short-listés. Lorsque ces ETF suivent un indice non-MSCI, j’essaye de déterminer leur allocation selon mon découpage en analysant leur factsheets (market cap, taille du plus grand / plus petit composant, etc.).
Je vous aurais bien partagé directement le spreadsheet, mais il est non seulement complètement indigeste et pas autoporteur pour un sou, mais aussi totalement imbriqué avec mon suivi de portefeuille personnel…
Au plaisir d’échanger avec vous sur cette démarche !
LeWiZ
Dernière modification par LeWiZ (09/01/2020 15h38)
Mots-clés : etf, optimisation, portefeuille, simplexe
Hors ligne