Sur le marché des capitaux, la sélection d’un titre ou actif dans lequel investir n’a jamais été une question simple. C’est au début des années 50, que H. Markowitz avait proposé le critère d’analyse moyenne – variance et dès lors, avait jeté les bases de ce qui sera appelé plus tard la Théorie moderne du portefeuille. En effet, Markowitz part du principe que les rendements générés par un titre ou actif sont des variables aléatoires, ensuite il propose les deux premiers moments à savoir la moyenne et la variance comme les critères de mesure respectifs de l’espérance et du risque perçus par un investisseur rationnel. Mieux encore, l’étude de la corrélation entre les titres, l’amène à développer la stratégie de diversification du portefeuille souvent plus expressive sous l’adage “Ne jamais mettre tous les yeux dans un même panier“. Intuitivement, il s’agit de combiner des titres ou actifs corrélés négativement, ce qui permet de réduire la variance donc le risque du portefeuille(un portefeuille signifie simple une combinaison ou ensemble d’actifs) sans éroder le rendement espéré. Conceptuellement, c’est bien faisable de créer un portefeuille ou de combiner des actifs mais comme l’investisseur est supposé rationnel, ce dernier ne s’intéressera qu’à la combinaison ou portefeuille (j’abandonne ici le terme combinaison laissons ce concept aux micro-économistes et j’adopte pour de bon le terme portefeuille) offrant le meilleure rendement pour un niveau de risque qu’il tolère ou inversement. On dit d’un tel portefeuille qu’il est efficient.
Ainsi, le problème de l’investisseur face à plusieurs titre serait de déterminer la proportion de ses fonds à investir dans chaque titre pour former le portefeuille efficient qui correspond au mieux à ses goûts vis-à-vis du risque. Dans cet article, nous allons apprendre comment avec R résoudre des problème d’optimisation de portefeuille selon le modèle Markowitzien.
Sommaire
Définition, formulation et résolution mathématiques
Considérons un marché de titres, pour chaque titre ou actif
, on dispose de
rendements historiques notés
ou de façon générale, pour l’ensemble des titres, on a :
où est la matrice des rendements des
titres collectés sur
période. On peut donc déterminer le vecteur colonne des espérances mathématiques
de dimension
et la matrice symétrique de variance
de dimension
comme ceci :
où nous avons sur la diagonale les variance de chaque titre. Il faut également noter que notre matrice de covariance ou de variance est symétrique c’est-à-dire que . Ainsi, il est possible de construire un portefeuille
avec :
qui représente le vecteur des poids de chaque titre ou actif dans le portefeuille dont la somme doit toujours être égale à 1 autrement dit avec :
On peut exprimer l’espérance et la variance
du portefeuille comme ceci :
Le décor étant planté, nous allons formaliser 3 types de questions que se pose un investisseur à l’aune de la Théorie de Markowitz.
Par ailleurs, les développements mathématiques qui vont suivre se basent sur cet article de Robert C. Merton, un autre théoricien de la finance moderne.
Le portefeuille de variance minimale(Minimum Variance Portfolio)
La première question que se pose l’investisseur est évidement de savoir : Quel portefeuille efficient,offre le niveau de risque le plus faible ? Il s’agit d’optimiser le programme quadratique suivant :
Pour résoudre ce programme, nous allons recourir à la méthode du multiplicateur de Lagrange :
où est le multiplicateur de Lagrange. Nous allons ensuite calculer les dérivées partielles que nous allons spécifier égales à 0 :
Nous allons d’abord tirer dans l’équation
, après quoi nous allons le remplacer dans l’équation
par son expression:
Nous allons mettre cette dernière expression de dans l’expression de
. Cela donnera ceci :
(1)
Le portefeuille efficient et la frontière efficiente
Comme mentionné dès l’introduction, il est possible pour un investisseur de constituer des portefeuilles selon ses préférences. Toutefois, ces portefeuilles ne sont pas tous efficients. On appelle portefeuille efficient, tout portefeuille qui offre le rendement espéré le plus élevé pour un niveau donné de volatilité ou risque a.k.a variance, ou inversement tout portefeuille qui expose son détenteur au risque le plus faible pour un niveau donné de rendement espéré. La propriété d’efficience étant ainsi définit, nous comprenons qu’il n’existe qu’un et un seul portefeuille efficient pour un niveau de rendement espéré
. Et l’ensemble des portefeuilles qui satisfont cette propriété forme la frontière efficiente, comme nous pouvons l’observer( la partie de la courbe qui commence à partir du portefeuille de variance minimale, cette dernière est en jaune) sur le graphique suivant :
Notre objectif est de pouvoir déterminer cette frontière efficiente ou du moins exprimer une fonction qui permet de déterminer le portfeuille pour un niveau de rendement cible . Ce problème peut se formuler comme ci-dessous :
Comme précédemment au vue des caractéristiques de ce programme nous allons recourir encore aux multiplicateurs de Lagrange :
Nous allons annuler les dérivées partielles respectivement de :
Ici également nous allons d’abord déterminer une expression de en fonction de
et
, ensuite nous allons l’implémenter dans les équation
et
comme ceci :
Pour venir à bout de ce système, nous allons d’abord définir ,
et
pour rendre le reste des opérations plus accomodant :
Ceci devient une identité de l’algèbre linéaire bien connue Pour
selon la méthode des cofacteurs et . En désignant
nous obtenons finalement :
Ce qui implique que
Nous alors placer ces expressions lambda dans l’expression de . En effet, nous avions précédemment :
Nous pouvons finalement conclure que :
(2)
avec
Maintenant nous pouvons exprimer notre fonction de frontière efficiente qui n’est en fait qu’une expression de en fonction
:
(3)
Ici l’on peut développer encore…
Portefeuille Tangent ou le portefeuille de marché ou super-efficient
Notre dernier portefeuille caractéristique abordé est celui-ci. Pour le comprendre, on raisonne maintenant en tenant compte d’un actif additionnel l’actif sans risque . Théoriquement on peut l’assimiler aux bonds de trésor d’Etats..etc. Quoi qu’il en soit cet actif sans risque procure un rendement
(un rendement qui devrait être très faible comparer à l’espérance de rendement d’un titre risqué,pour respecter l’adage populaire “Qui ne risque rien n’a rien !”, ET oui la finance de marché respecte beaucoup les adages ! ) et une variance ou risque nulle c’est-à-dire que
, donc ne variant pas sa covariance avec les autres titres est nulle,
et subséquemment il est “complètement décorrélation” avec les autres titres. Ici également, l’investisseur va se poser la même question que précédemment à savoir : Déterminer pour un niveau de rendement espéré donné
, quel est le portefeuille qui procure le risque ou la variance minimale ? Rebelote encore un portefeuille efficient à déterminer mais cette fois avec prise en compte de l’actif sans risque !
Supposons que nous appelons , la part des actifs risqués et
, la part de l’actif sans risque dans notre portefeuille, nous devons avoir
. Aussi étant donné que notre actif sans risque a une variance nulle et une corrélation avec les autres actifs risqués nulle, la seule part de risque dans notre nouveau portefeuille
, ne provient que des actifs risqués. Donc nous aurons à résoudre le problème suivant :
En arrangeant la contrainte, nous obtenons le Lagrangien du programme comme ceci :
Nous allons annuler les dérivées partielles respectivement de :
Nous allons comme d’habitude déterminer une expression de en fonction de
de l’équation
:
expression que nous allons placer dans l’équation
:
où les différences et
sont respectivement les excédents de rendements d’abord du portefeuille et ensuite sur les titres. On va maintenant exprimer
sans
et après simplification des 2, nous aurons :
(4)
Notre portfeuille que nous venons d’obtenir appartient en effet, à une vaste famille de portefeuilles se trouvant sur la drote en vert, la droite de marché des capitaux ou Capital Market Line (CML) dont l’expression la plus finie connue grâce aux travaux de W.Sharpe et al.(nous allons pas le démontrer) est :
(5)
Nous savons comment obtenir un portefeuille se situant sur la frontière efficiente (la courbe rouge) et nous savons également comment obtenir un portefeuille se situant sur la droite de marché(la droite verte). Ce qui nous intéresse maintenant, c’est de déterminer le portefeuille tangent celui en bleue. C’est lui qui offre le meilleur excédent de rendement (ou prime ou rémunération) par unité de risque, le meilleur ratio de Sharpe : . C’est l’une des raisons pour laquelle on l’appelle portefeuille super-efficient(parmi les efficients, il est le plus efficient !)
Pour obtenir un tel portefeuille, nous avons la possibilité d’égaliser les dérivés de la droite et de la courbe et ensuite de déterminer qui vérifie cette équation. Mais d’abord cela nous demanderait d’exprimer la frontière efficiente en fonction de
et la droite de marché également. Nous trouvons cela un peu fastidieux. Alors nous pouvons adopter un autre raisonnement, si la droite et la courbe se confondent en ce point c’est qu’en ce point, ils doivent avoir la même composition en titres. Autrement dit le portefeuille en ce point généré grâce à la fonction de la frontière efficiente(en l’absence de l’actif sans risque) est égale au portefeuille en ce point généré grâce à la fonction de la droite de marché( en présence de l’actif sans risque). Cette observation nous conduit à conclure qu’en ce point
et donc que se portefeuille n’est constitué entièrement que d’actif risqué c’est-à-dire
et en se fiant à notre raisonnement, on peut également écrire qu’en ce point
avec
la composition du portefeuille super-efficient . Formellement en ce point :
Cette nouvelle expression de l’excédent du rendement du portefeuille va être implémenter dans l’expression de :
Après simplification, on peut conclure que le portefeuille Tangent , se compose de :
(6)
Ici, nous voyons finalement que la constitution du portefeuille Tangent, ne dépend pas de , donc des préférences de l’investisseur. Cette observation nous entraîne vers les bases de la formalisation du MEDAF. Aussi nous nous arrêtons là, passons à la détermination de ces portefeuilles avec R !
Implémentation avec R
Nous allons pour implémenter ces portefeuilles, d’abord télécharger une séries 20 titres, aux hasards. Vous avez le choix du nombre et des titres mais nous n’aurons pas les mêmes réponses.
Installation de package et importation des données
Nous charger et utiliser les packages cité ci-dessous, s’ils ne sont pas encore télécharger sur votre ordinateur, utiliser la fonction install.packages(‘nom_du_package’) :
1 2 3 4 5 |
library(stockPortfolio) # pour télécharger les données ou bien plus library(ggplot2) # pour réaliser les graphiques library(scales) # pour formater les axes graphiques en % et... library(ggrepel) # complément pour la realisation graphique library(extrafont);loadfonts() # optionnel pour utilisation de police |
La fonction getReturns() qui prend en arguments la liste des symboles des titres qui nous intéressent, va d’abord télécharger les cours selon la périodicité spécifiée à l’argument freq et ensuite calculer les rendements :
1 2 3 4 5 |
assetSymbols <- c('YHO','MSFT','GOOGL','AAPL','NKE','SPGI','AMZN','MMM','BAC','BAX', 'IBM', 'MTB', 'ORCL', 'FDX','AA','DIS','VAR','CAT','USB','JPM') assetReturns <- getReturns(assetSymbols,freq='month',start = '2012-01-01', end = '2016-08-31') mu <- colMeans(assetReturns$R) # rendements espérés covMat <- cov(assetReturns$R) # matrices de covariances |
Usinage des fonctions pour la détermination des portefeuilles
Les fonctions que nous allons construire, découlent directement des formules que nous avons démontré, précédemment dans la première partie et n’exige de ce fait aucun package, que du taï-jutsu, un corps à corps , du calcul matriciel. Nos fonctions ont le même model d’informations renvoyées,en fait, elles renvoient toutes les valeurs des poids de chaque titre dans le(s) portefeuille(s), le(s) rendement(s) espéré(s) et les risque(s) de(s) portefeuille(s) sous format list(). Par ailleurs, nous avons pour les fonctions ayant besoins du taux d’intérêt sans risque pris par défaut un taux annuel de 5% l’an soit un taux mensuel de 0.5% approximativement, bien sûr à vous pour le changer.
Portefeuille de variance minimale
1 2 3 4 5 6 7 8 9 10 11 12 |
## Minimum Variance Portfolio function #### getMinVariancePortfolio <- function(mu,covMat,assetSymbols) { U <- rep(1, length(mu)) # vecteur de 1 O <- solve(covMat) # inverse de la matrice de covariance w <- O%*%U /as.numeric(t(U)%*%O%*% U) Risk <- sqrt(t(w) %*% covMat %*% w) ExpReturn <- t(w) %*% mu Weights <- `names<-`(round(w, 5), assetSymbols) list(Weights = t(Weights), ExpReturn = round(as.numeric(ExpReturn), 5), Risk = round(as.numeric(Risk), 5)) } |
Portefeuille efficient pour un niveau de rendement donné
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
getEfficientPortfolio <- function(mu, covMat, assetSymbols, mu0) { U <- rep(1, length(mu)) O <- solve(covMat) # inverse de la matrice A <- as.numeric(t(U) %*% O %*% mu) B <- as.numeric(t(mu) %*% O %*% mu) C <- as.numeric(t(U) %*% O %*% U) D <- B * C - A * A E <- O %*% ( - A * U + C * mu) / D F <- O %*% (B * U - A * mu) / D w <- E * mu0 + F Risk <- sqrt(t(w) %*% covMat %*% w) # calcul de l'ecart-type ExpReturn <- t(w) %*% mu Weights <- `names<-`(round(w,5), assetSymbols) list(Weights = t(Weights), ExpReturn = as.numeric(round(ExpReturn,5)), Risk = as.numeric(round(Risk,5))) } |
Portefeuille Tangent ou super- efficient
1 2 3 4 5 6 7 8 9 10 11 12 |
getTangentPortfolio <- function(mu,covMat,assetSymbols,Rf = 0.005){ U <- rep(1, length(mu)) muE <- (mu - Rf * U) # excedent de rendement O <- solve(covMat) # inverse de la matrice w <- (O %*% muE)/ as.numeric(t(U)%*%O%*%muE) Risk <- sqrt(t(w) %*% covMat %*% w) ExpReturn <- t(w) %*% mu Weights <- `names<-`(round(w,5), assetSymbols) list(Weights = t(Weights), ExpReturn = as.numeric(ExpReturn), Risk = as.numeric(Risk)) } |
Fonctions graphiques : Frontière Efficiente et la droite de marché
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# Frontière efficiente getEfficientFrontier <- function(mu, covMat, assetSymbols, Nb = 20){ mu0 <- seq(getMinVariancePortfolio(mu, covMat, asset.names)$ExpReturn, 0.08, length.out = Nb) ExpReturn <- NULL Risk <- NULL Weights <- data.frame() for (i in 1:Nb) { list <- getEfficientPortfolio(mu, covMat, asset.names, mu0[i]) ExpReturn <- c(ExpReturn, list$ExpReturn) Risk <- c(Risk, list$Risk) Weights <- rbind(Weights, list$Weights) } list(Weights= data.frame(Weights), ExpReturn = as.vector(ExpReturn), Risk = as.vector(Risk)) } # Droite du marché des capitaux getCML <- function(mu, covMat, assetSymbols, Rf = 0.005) { mu0 <- seq(Rf,0.08,length.out = 20) U <- rep(1, length(mu)) muE <- (mu - Rf * U) # excedent de rendement mu0E <- (mu0 - Rf) # excedent sur le rendement du portefeuille O <- solve(covMat) # inverse de la matrice ExpReturn <- NULL Risk <- NULL Weights <- data.frame() w_r <- sapply(mu0E, function(x, muE, O) { x * ((O %*% muE) / as.numeric(t(muE) %*% O %*% muE)) }, O = O, muE = muE) w_f = 1 - colSums(w_r) w_r <- `rownames<-`(round(w_r, 5), assetSymbols) Weights = cbind(t(w_r),Rf=w_f) ExpReturn = t(w_r) %*% mu + w_f * Rf Risk = sqrt(diag(t(w_r) %*% covMat %*% w_r)) list(Weights = data.frame(Weights), ExpReturn = as.vector(ExpReturn), Risk = Risk) } |
Détermination des portefeuilles et visualisation graphique
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
> # minimum variance portfolio > (MVP <- getMinVariancePortfolio(mu, covMat, assetSymbols)) $Weights YHO MSFT GOOGL AAPL NKE SPGI AMZN MMM [1,] -0.11087 0.14348 -0.02193 -0.04156 0.21401 -0.09068 -0.03054 0.25304 BAC BAX IBM MTB ORCL FDX AA DIS VAR [1,] -0.0178 0.14972 0.15025 0.15848 0.02765 -0.0437 0.04665 -0.03562 0.23541 CAT USB JPM [1,] -0.06276 0.32113 -0.24435 $ExpReturn [1] 0.00744 $Risk [1] 0.02059 > # Efficient portfolio with 5% of expected return > (m0P <- getEfficientPortfolio(mu, covMat, assetSymbols, mu0 = 0.05)) $Weights YHO MSFT GOOGL AAPL NKE SPGI AMZN MMM BAC [1,] 0.03912 0.59996 0.15981 -0.12395 -0.00917 0.43485 0.20777 1.53702 0.26818 BAX IBM MTB ORCL FDX AA DIS VAR [1,] 0.40375 -0.69225 0.7805 -0.36902 -0.16343 0.23225 0.05982 -0.38102 CAT USB JPM [1,] -0.71569 -1.03577 -0.23273 $ExpReturn [1] 0.05 $Risk [1] 0.0721 > # Efficient frontier > EFF <- getEfficientFrontier(mu, covMat, assetSymbols) > # Capital Market line > CML <- getCML(mu, CovMat, assetSymbols) > # Tangent portfolio > (GTP <- getTangentPortfolio(mu, covMat, assetSymbols)) $Weights YHO MSFT GOOGL AAPL NKE SPGI AMZN MMM BAC [1,] 0.12124 0.84989 0.25931 -0.16905 -0.13136 0.72257 0.33824 2.24 0.42475 BAX IBM MTB ORCL FDX AA DIS VAR [1,] 0.54284 -1.15352 1.12105 -0.5862 -0.22897 0.33387 0.11207 -0.71851 CAT USB JPM [1,] -1.07316 -1.77869 -0.22636 $ExpReturn [1] 0.07330112 $Risk [1] 0.1088978 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
data = data.frame(ExpReturn = mu * 100,Risk = sqrt(diag(covMat)) * 100) plot <- ggplot(data, aes(x = Risk, y = ExpReturn)) + theme_bw() + theme(plot.title = element_text(family = "Century Gothic", colour = "red3", face = "bold"), text = element_text(family = "Century Gothic"), plot.background = element_rect(fill = "gray"), axis.line.x = element_line(color = "black", size = 1), axis.line.y = element_line(color = "black", size = 1)) + geom_point(colour = rainbow(20, start = 0.7, end = 0.1),size = 2) + geom_text_repel(label = assetSymbols,size = 2.5) + geom_vline(xintercept = 0, linetype = "dashed") + geom_hline(yintercept = 0, linetype = "dashed") + scale_x_continuous(breaks = seq(0, 12, 1) , limits = c(0,12), labels = dollar_format(suffix = "%", prefix = "")) + scale_y_continuous(breaks = seq(-1,9, 1) , limits = c(-1,9), labels = dollar_format(suffix = "%", prefix = "")) + labs(x = "Monthly Risk", y ="Monthly Expected Return") + ggtitle("Mean-Variance FrameWork Portfolios") # Ajout de la fontière efficiente plot <- plot + geom_line(data = data.frame(Risk = EFF$Risk * 100, ExpReturn = EFF$ExpReturn * 100), aes(x = Risk, y = ExpReturn), colour = "red3", size = 1.2) # Ajout de la droite de marche plot <- plot + geom_line(data = data.frame(Risk = CML$Risk * 100, ExpReturn = CML$ExpReturn * 100), aes(x = Risk, y = ExpReturn), colour = "darkblue", size = 1) # Ajout de tous les portfeuilles allPortfolio <- data.frame(ExpReturn = c(0.005, MVP$ExpReturn, m0P$ExpReturn,GTP$ExpReturn) * 100, Risk = c(0, MVP$Risk, m0P$Risk, GTP$Risk) * 100) plot <- plot + geom_point(data = allPortfolio, shape = "O", colour = "red3", size = 4) + geom_text_repel(data = data.frame(allPortfolio, label = c("Rf", "MinVariance", "Port0.05", "PortTangent")), aes(x = Risk, y = ExpReturn, label = label), size = 3) plot |