Aller au contenu principal

Rendements, diversification et risque de portefeuille

Un prix passe de 100 à 110, puis retombe à 99. Les rendements des deux périodes sont de 10 % et de −10 %, mais la perte totale atteint 1 %. En réunissant deux actifs dans un portefeuille, une autre distinction apparaît : les rendements se combinent selon les poids de début de période, tandis que la volatilité ne s'additionne pas de la même façon. Ces deux distinctions permettent de passer des prix aux rendements, puis de calculer le risque du portefeuille.

Les prix, rendements et paramètres utilisés ci-dessous sont hypothétiques ; tous les montants sont exprimés dans une même unité monétaire. Les frais de transaction et les impôts sont laissés de côté jusqu'à la section consacrée aux coûts. Aucun apport ni retrait externe n'intervient pendant une période de détention. Pour les paiements des options et les hypothèses de valorisation, voir Marchés financiers et modélisation mathématique ; pour les exemples de valorisation par réplication, poursuivre avec Absence d’arbitrage et valorisation binomiale des options.

Des prix aux rendements​

Soit Pt−1>0P_{t-1}>0 le prix initial et PtP_t le prix final. En l'absence de distributions, le rendement simple rtr_t et le rendement logarithmique ℓt\ell_t s'écrivent :

rt=Pt−Pt−1Pt−1,ℓt=ln⁡(1+rt)=ln⁡PtPt−1.r_t=\frac{P_t-P_{t-1}}{P_{t-1}},\qquad \ell_t=\ln(1+r_t)=\ln\frac{P_t}{P_{t-1}}.

Le rendement logarithmique exige 1+rt>01+r_t>0. Si l'actif perd toute sa valeur, le rendement simple vaut −100 % et le rendement logarithmique n'a pas de valeur finie. Les prix doivent rester comparables après un changement d'unité, comme une division d'actions, afin de ne pas prendre un ajustement mécanique pour un gain ou une perte.

Sur plusieurs périodes, on multiplie les facteurs de croissance. Si les sommes obtenues à chaque période restent investies, la richesse après TT périodes est :

WT=W0∏t=1T(1+rt),ln⁡WTW0=∑t=1Tℓt.W_T=W_0\prod_{t=1}^{T}(1+r_t),\qquad \ln\frac{W_T}{W_0}=\sum_{t=1}^{T}\ell_t.

Pour le parcours 100 → 110 → 99, 1.10×0.90=0.991.10\times0.90=0.99. La moyenne arithmétique des rendements vaut 0 %, mais la moyenne géométrique par période vaut 0.99−1≈−0.5013%\sqrt{0.99}-1\approx-0.5013\%, et la somme des rendements logarithmiques est d'environ −0.010050. La moyenne arithmétique décrit le rendement moyen d'une période ; la moyenne géométrique décrit la croissance composée sur ce parcours. Deux périodes ne sont pas nécessairement deux années : leur durée doit être précisée avant de parler de rendement annualisé.

Les rendements logarithmiques s'additionnent dans le temps, tandis que les rendements simples d'un portefeuille se pondèrent entre actifs. Le rendement logarithmique du portefeuille diffère en général de la moyenne pondérée des rendements logarithmiques de ses actifs. Ces deux propriétés ne sont donc pas interchangeables.

Rendement total, distributions et pouvoir d'achat​

Le rendement d'une action peut provenir de la hausse de son prix et des dividendes. La page pédagogique de la SEC rappelle aussi qu'une croissance nominale peut rester inférieure à l'inflation. Comparer des placements demande de tenir compte des distributions et du pouvoir d'achat.

Soit DtD_t la distribution par unité d'actif reçue en fin de période, sans autre flux pendant cette période. Le rendement total est :

rttotal=Pt−Pt−1+DtPt−1.r_t^{\mathrm{total}}=\frac{P_t-P_{t-1}+D_t}{P_{t-1}}.

Un achat à 100, un prix final de 98 et un dividende de 5 donnent un rendement du prix de −2 %, mais un rendement total de (98−100+5)/100=3%(98-100+5)/100=3\%. Si la distribution intervient plus tôt et est immédiatement réinvestie, il faut calculer la richesse à partir de sa date et du prix de réinvestissement effectifs. Avec une série de rendements totaux qui intègre déjà ce réinvestissement, ajouter les dividendes une seconde fois les compterait en double.

Pour une inflation πt>−1\pi_t>-1 sur la même période, ce qui maintient l'indice des prix positif, le rendement réel mesure l'évolution du pouvoir d'achat :

1+rtreal=1+rttotal1+πt.1+r_t^{\mathrm{real}}=\frac{1+r_t^{\mathrm{total}}}{1+\pi_t}.

Avec une inflation de 2 %, le rendement réel de l'exemple vaut 1.03/1.02−1≈0.9804%1.03/1.02-1\approx0.9804\%. Soustraire 2 % de 3 % donne 1 %, une approximation valable pour de petites variations. Sur plusieurs périodes aussi, les rendements totaux et les variations de l'indice des prix doivent concerner la même monnaie et le même intervalle.

Dérive des poids et rééquilibrage​

Le poids wiw_i est la part de la valeur initiale du portefeuille investie dans l'actif ii. Un portefeuille entièrement investi, sans vente à découvert, vérifie ∑iwi=1\sum_iw_i=1 et wi≥0w_i\ge0. Sans transfert entre les positions ni flux externe pendant la période, et avec les distributions réinvesties dans leurs positions respectives, son rendement simple se calcule avec des rendements totaux d'actifs définis de façon cohérente :

rp=∑iwiri.r_p=\sum_iw_ir_i.

Si les distributions restent en liquidités, celles-ci doivent constituer une position distincte dans le calcul des poids de la période suivante.

Supposons une richesse initiale de 10000, répartie à 60 % en A et à 40 % en B. Sur une année, A rapporte 10 % et B perd 5 %, soit un rendement de −5 % :

ÉlémentABTotal
Valeur initiale6000400010000
Valeur finale6600380010400
Poids final63.4615 %36.5385 %100 %
Valeur cible pour revenir à 60/40, avant frais6240416010400

Le rendement du portefeuille vaut 0.60×10%+0.40×(−5%)=4%0.60\times10\%+0.40\times(-5\%)=4\%. Sans transaction, A représente 6600/10400≈63.4615%6600/10400\approx63.4615\% de la richesse au début de l'année suivante. On ne peut plus utiliser son ancien poids de 60 % pour calculer le rendement suivant.

La présentation du rééquilibrage par la SEC décrit les ajustements permettant de retrouver une allocation. Ici, il faut vendre 360 de A et acheter 360 de B. Rééquilibrer à date fixe ou lorsqu'un poids dépasse un seuil d'écart constitue deux règles de transaction différentes. Il faut préciser la règle avant de comparer rendements nets et risques ; retrouver les poids cibles ne garantit pas un meilleur rendement à la période suivante.

Covariance et diversification​

Dans Portfolio Selection (1952), Markowitz formule le choix du portefeuille comme un arbitrage entre espérance et variance du rendement. Le texte original, disponible dans ce PDF lisible, explique que la diversification dépend des covariances, et pas seulement du nombre de titres détenus. Les définitions statistiques se trouvent dans Statistiques et probabilités.

Notons rr le vecteur aléatoire des rendements, μ\mu sa moyenne et Σ\Sigma sa matrice de covariance. Pour des poids ww fixés avant la période :

E[rp]=wTμ,Var⁡(rp)=wTΣw.\mathbb E[r_p]=w^\mathsf T\mu,\qquad \operatorname{Var}(r_p)=w^\mathsf T\Sigma w.

La volatilité est l'écart-type des rendements, σp=Var⁡(rp)\sigma_p=\sqrt{\operatorname{Var}(r_p)}. Lorsque les deux écarts-types sont positifs, Cov⁡(rA,rB)=ρσAσB\operatorname{Cov}(r_A,r_B)=\rho\sigma_A\sigma_B, où ρ∈[−1,1]\rho\in[-1,1] désigne leur corrélation. Ainsi :

σp2=wA2σA2+wB2σB2+2wAwBρσAσB.\sigma_p^2=w_A^2\sigma_A^2+w_B^2\sigma_B^2 +2w_Aw_B\rho\sigma_A\sigma_B.

Gardons les poids 60/40, mais utilisons maintenant des paramètres hypothétiques pour un modèle prévisionnel, tous sur une année :

ParamètreAB
Espérance du rendement total simple8 %4 %
Écart-type des rendements20 %10 %

Ces paramètres ne sont pas estimés à partir des rendements réalisés de la section précédente. Posons ρ=0.25\rho=0.25 : la covariance vaut 0.25×0.20×0.10=0.0050.25\times0.20\times0.10=0.005.

Σ=(0.040.0050.0050.01),E[rp]=0.60×0.08+0.40×0.04=0.064.\Sigma=\begin{pmatrix}0.04&0.005\\0.005&0.01\end{pmatrix},\qquad \mathbb E[r_p]=0.60\times0.08+0.40\times0.04=0.064. σp2=0.602×0.202+0.402×0.102+2×0.60×0.40×0.005=0.0184,σp≈13.5647%.\sigma_p^2=0.60^2\times0.20^2+0.40^2\times0.10^2 +2\times0.60\times0.40\times0.005=0.0184, \qquad \sigma_p\approx13.5647\%.

L'espérance de rendement est de 6.4 % et la volatilité d'environ 13.5647 %. Pondérer directement les deux volatilités donne 16 %, résultat correct ici uniquement avec une corrélation positive parfaite. Gardons les poids et les volatilités individuelles fixes, puis changeons la corrélation :

ρ\rhoVariance du portefeuilleVolatilité du portefeuille
10.025616.0000 %
0.250.018413.5647 %
00.016012.6491 %
−10.00648.0000 %

La diversification abaisse la volatilité sous les 16 % obtenus par pondération directe, mais elle peut rester supérieure aux 10 % de B détenu seul. Même avec une corrélation négative parfaite, ces poids n'annulent pas le risque : les amplitudes de volatilité pondérées ne se compensent pas.

La fréquence d'observation doit rester explicite lors de l'estimation. Si les rendements logarithmiques ont des variances identiques et une covariance nulle entre chaque paire de périodes, l'écart-type de leur somme sur mm périodes vaut l'écart-type d'une période multiplié par m\sqrt m. Ces conditions sont suffisantes, mais ne sont pas nécessaires : les covariances temporelles peuvent aussi se compenser. Cette règle ne donne pas directement la volatilité annuelle exacte des rendements simples composés.

Volatilité, drawdown et pertes​

La volatilité compte les écarts au-dessus comme au-dessous de la moyenne. Elle ne décrit ni la perte maximale ni l'ordre des pertes, et la moyenne et la variance ne suffisent généralement pas à déterminer la probabilité de perdre de l'argent.

Le drawdown mesure la baisse par rapport au plus haut niveau de richesse atteint auparavant. Pour un parcours de richesse fondé sur le rendement total, avec W0>0W_0>0 et sans flux externes, posons Ht=max⁡0≤s≤tWsH_t=\max_{0\le s\le t}W_s et exprimons cette baisse par une fraction positive ou nulle :

DDt=1−WtHt,MDD=max⁡tDDt.\mathrm{DD}_t=1-\frac{W_t}{H_t},\qquad \mathrm{MDD}=\max_t\mathrm{DD}_t.
DateRichesse WtW_tPlus haut atteint HtH_tDrawdown
01001000 %
11101100 %
28811020 %
39911010 %
41121120 %

La richesse finale dépasse de 12 % la valeur initiale, malgré un drawdown maximal de 20 % en cours de route. Revenir de 88 à l'ancien sommet de 110 exige une hausse de 25 %, et non de 20 %. Un apport augmente mécaniquement le solde du compte ; en présence de flux externes, le drawdown doit être calculé sur un indice de rendement qui neutralise leur effet.

Un scénario de stress précise l'exposition aux pertes. Si A perd 30 % et B perd 10 % la même année, le rendement du portefeuille 60/40 est de −22 %, soit une perte de 2200 pour une richesse initiale de 10000. Ce calcul n'attribue aucune probabilité au scénario. La volatilité modélisée de 13.5647 % ne plafonne pas non plus les pertes. Estimer une probabilité de perte ou la perte moyenne au-delà d'un seuil demande des hypothèses supplémentaires sur la distribution des queues ou sur les probabilités des scénarios.

Optimisation moyenne–variance et sensibilité des estimations​

Le cours CVX sur l'optimisation de portefeuille présente un objectif moyenne–variance sur une période : l'espérance de rendement moins une pénalité de variance. Sans vente à découvert, il s'écrit :

max⁡w  μTw−γwTΣw,1Tw=1,wi≥0,γ>0.\max_w\;\mu^\mathsf T w-\gamma w^\mathsf T\Sigma w, \qquad \mathbf1^\mathsf T w=1,\quad w_i\ge0,\quad\gamma>0.

Le paramètre γ\gamma règle l'arbitrage entre rendement et variance. Moyenne et covariance doivent porter sur le même horizon, avec des rendements exprimés en décimales. Passer aux pourcentages change l'échelle relative des deux termes : on ne peut donc pas conserver γ\gamma sans adaptation. Si la matrice de covariance est semi-définie positive, l'objectif est concave et ces contraintes définissent un ensemble admissible convexe ; l'optimisation convexe permet de trouver un optimum global. La frontière efficiente moyenne–variance réunit les portefeuilles admissibles qu'aucun autre portefeuille admissible ne domine en espérance de rendement et en variance. Elle dépend des paramètres et des contraintes.

Avec la matrice de covariance précédente, écrivons wA=xw_A=x et wB=1−xw_B=1-x. La variance développée est :

σp2(x)=0.04x2−0.01x+0.01.\sigma_p^2(x)=0.04x^2-0.01x+0.01.

Pour minimiser uniquement la variance, on annule la dérivée 0.08x−0.01=00.08x-0.01=0. On obtient x=0.125x=0.125, soit 12.5 % en A et 87.5 % en B. Cette solution n'utilise pas les espérances de rendement.

Pour maximiser plutôt le rendement moins la pénalité de variance, prenons γ=1\gamma=1, dérivons par rapport à xx et imposons 0≤x≤10\le x\le1 :

x∗=min⁡(1,max⁡(0,μA−μB+0.01γ0.08γ)).x^*=\min\left(1,\max\left(0, \frac{\mu_A-\mu_B+0.01\gamma}{0.08\gamma}\right)\right).
Espérances annuelles retenuesPoids optimal de APoids optimal de B
A à 8 %, B à 4 %62.5 %37.5 %
A à 6 %, B à 4 %37.5 %62.5 %

Réduire de 2 points de pourcentage la seule espérance de A modifie l'allocation de 25 points. Résoudre précisément le problème ne rend pas ses paramètres précis. Les moyennes, covariances et corrélations estimées changent avec la fenêtre d'observation ; les relations lors d'un choc commun peuvent différer de celles des périodes ordinaires. On peut faire varier les espérances, changer la fenêtre d'estimation des covariances et ajouter des plafonds de position pour voir si les allocations restent stables. La variance minimale évite d'estimer les moyennes, mais dépend toujours des covariances estimées.

Coûts, liquidité et limites du modèle​

Le cours inclut aussi des pénalités de transaction fondées sur les variations de poids. Avec des coûts linéaires :

C(w)=∑iκi∣wi−wiprev∣,κi≥0.C(w)=\sum_i\kappa_i\left|w_i-w_i^{\mathrm{prev}}\right|, \qquad \kappa_i\ge0.

Il faut utiliser pour wprevw^{\mathrm{prev}} les poids qui ont déjà dérivé, juste avant la transaction. Chaque κi\kappa_i est le coût par unité de valeur achetée ou vendue. Les deux vecteurs de poids sont ici normalisés par la richesse avant transaction : C(w)C(w) est une fraction de cette richesse et les montants cibles sont calculés avant frais. Déduire C(w)C(w) de l'objectif de rendement, ou limiter le volume total négocié, peut modifier les poids optimaux obtenus sans coûts. Si les poids cibles sont définis par rapport à la richesse après frais, il faut aussi intégrer les coûts à la contrainte budgétaire.

Le rééquilibrage précédent achète et vend 360 de chaque côté. Avec des frais de 0.1 % sur chaque opération, le coût estimé est (360+360)×0.001=0.72(360+360)\times0.001=0.72. Les frais portent ici sur la somme des achats et des ventes. Diviser le montant total négocié par deux avant de lui appliquer le même taux ne compterait que la moitié des frais. Les valeurs cibles de 6240 et 4160 sont calculées avant frais ; lorsque ceux-ci sont prélevés sur le portefeuille, il faut recalculer cibles et transactions à partir de la richesse après coûts.

Un taux linéaire fixe ne décrit pas les variations de l'écart entre prix acheteur et vendeur, l'impact d'un ordre sur les prix ou l'impossibilité d'exécuter rapidement une transaction. La définition de la liquidité par la SEC souligne la rapidité des transactions et leur impact sur les prix ; son guide des ordres rappelle aussi que le dernier prix négocié n'est pas nécessairement le prix d'exécution d'un ordre au marché. Sur un marché peu liquide, le prix affiché peut ne pas être disponible pour l'ordre entier. Un besoin de vendre à court terme appelle des limites sur les positions et les montants négociables. Impôts, coûts de financement et besoins de trésorerie sur plusieurs périodes modifient aussi les possibilités.

Le modèle moyenne–variance retient les deux premiers moments sur un horizon donné. Les pertes extrêmes, les parcours de drawdown, les changements de paramètres et les contraintes d'exécution demandent d'autres modèles. Pour comparer des portefeuilles, rapprocher leurs parcours de rendement total, hypothèses de corrélation, pertes sous stress et plans de transaction après coûts. La vue d'ensemble de la finance quantitative permet ensuite de poursuivre vers les options ou les scénarios macroéconomiques.

Reproduire les calculs en Python​

Enregistrer le code dans portfolio_example.py, puis lancer python3 portfolio_example.py avec Python 3.8 ou une version ultérieure. La documentation de la bibliothèque standard précise que math.prod a été ajouté dans Python 3.8. L'optimisation reprend la solution analytique avec la matrice de covariance fixée ci-dessus ; les autres calculs reproduisent la capitalisation, le rendement réel, le rééquilibrage, la diversification, le drawdown et les pertes sous stress.

returns doit être une suite non vide de rendements sur des périodes de même durée, tous finis et supérieurs à −1, afin que les rendements logarithmiques soient finis ; sinon le code lève ValueError. Un montant de transaction positif désigne un achat, un montant négatif une vente. Les frais estimés portent sur les montants échangés en valeur absolue.

from math import isfinite, log1p, prod, sqrt

returns = [0.10, -0.10]
if not returns or any(not isfinite(r) or r <= -1 for r in returns):
raise ValueError("returns must be nonempty and finite, with each return > -1")
growth = prod(1 + r for r in returns)
print(f"compound={growth - 1:.4%}; log_sum={sum(log1p(r) for r in returns):.6f}")
print(f"arithmetic={sum(returns) / len(returns):.4%}; geometric={growth**(1 / len(returns)) - 1:.4%}")
total_return = (98 + 5) / 100 - 1
print(f"total={total_return:.4%}; real={(1 + total_return) / 1.02 - 1:.4%}")

holdings = [6000 * 1.10, 4000 * 0.95]
wealth = sum(holdings)
trade_a = 0.60 * wealth - holdings[0]
trade_b = -trade_a
print(f"wealth={wealth:.2f}; return={wealth / 10000 - 1:.4%}; weight_A={holdings[0] / wealth:.4%}")
print(f"trade_A={trade_a:.2f}; trade_B={trade_b:.2f}; estimated_fee={(abs(trade_a) + abs(trade_b)) * 0.001:.2f}")

sigma_a, sigma_b = 0.20, 0.10
w = 0.60
for rho in [1.0, 0.25, 0.0, -1.0]:
variance = (w * sigma_a)**2 + ((1 - w) * sigma_b)**2
variance += 2 * w * (1 - w) * rho * sigma_a * sigma_b
print(f"rho={rho:.2f}; variance={variance:.6f}; volatility={sqrt(variance):.4%}")

cov = 0.25 * sigma_a * sigma_b
den = sigma_a**2 + sigma_b**2 - 2 * cov
x_min = (sigma_b**2 - cov) / den
print(f"min_variance_weight_A={x_min:.4%}")
for mu_a in [0.08, 0.06]:
mu_b, gamma = 0.04, 1.0
x = ((mu_a - mu_b) / (2 * gamma) + sigma_b**2 - cov) / den
x = min(1.0, max(0.0, x))
print(f"mu_A={mu_a:.2%}; optimal_weight_A={x:.4%}")

path = [100, 110, 88, 99, 112]
peak, max_drawdown = path[0], 0.0
for value in path:
peak = max(peak, value)
max_drawdown = max(max_drawdown, 1 - value / peak)
print(f"max_drawdown={max_drawdown:.4%}; recovery={110 / 88 - 1:.4%}")
stress = 0.60 * (-0.30) + 0.40 * (-0.10)
print(f"stress_return={stress:.4%}; stress_loss={-10000 * stress:.2f}")
compound=-1.0000%; log_sum=-0.010050
arithmetic=0.0000%; geometric=-0.5013%
total=3.0000%; real=0.9804%
wealth=10400.00; return=4.0000%; weight_A=63.4615%
trade_A=-360.00; trade_B=360.00; estimated_fee=0.72
rho=1.00; variance=0.025600; volatility=16.0000%
rho=0.25; variance=0.018400; volatility=13.5647%
rho=0.00; variance=0.016000; volatility=12.6491%
rho=-1.00; variance=0.006400; volatility=8.0000%
min_variance_weight_A=12.5000%
mu_A=8.00%; optimal_weight_A=62.5000%
mu_A=6.00%; optimal_weight_A=37.5000%
max_drawdown=20.0000%; recovery=25.0000%
stress_return=-22.0000%; stress_loss=2200.00
Explorer les liensOuvrir le réseau