Introduction à la théorie
du portefeuille de Markowitz

Bernard Lapeyre
cermics, École des Ponts ParisTech
(last modification date: 7 mai 2018)
Version pdf de ce document
Version sans bandeaux

Le fichier source en Scilab correspondant à ce document est markowitz_scilab_ddi.sci. Il est partiellement mais pas totalement corrigé. Les partie à compléter sont signalées par le préfixe

"QUESTION :".

Il vous revient de changer ces lignes. Le correction complète sera markowitz_scilab_ddi_corrige.sci accessible à la fin du TD.

Le fichier utils.sci définit certaines primitives (graphiques pour l’essentiel) utilisées par la suite. Le télècharger et le sauvegarder sous le nom “utils.sci”. Il devra être accessible par la suite dans votre directory de travail (qui s’obtient par “pwd” dans le shell de Scicoslab).

1 Le cas à deux actifs risqués
2 Le cas d’un nombre d’actifs risqués arbitraire
3 Solution des problèmes d’optimisation

Introduction

On considère d actifs dont les rendements sont donnés pas (R1,,Rd). L’hypothèse de rendement signifie que si on détient à l’instant 0 une quantité d’actif i de valeur V , la valeur de cette même quantité d’actif à l’instant T (égal à T = 1 an par exemple) sera donnée par V (1 + Ri).

On suppose de plus que ces rendements ont des caractéristiques de moyenne et de variance connue. On note μ le vecteur des espérances μi = E(Ri) et Γ la matrice de variance covariance, où Γij = Cov(Ri,Rj). On note σi2 = Var(X i) = Γii.

1 Le cas à deux actifs risqués

On suppose que d = 2, que μ1 = 5% et μ2 = 15%, que σ1 = 10% et σ2 = 30% et ρ étant un paramètre réel, Γ est donnée par

    (     2          )
Γ =     σ 1   ρσ12σ2   .
       ρσ1σ2    σ2

1.
Que représente ρ ? A quelle condition sur ρ la matrice Γ est la matrice de covariance d’un vecteur aléatoire ? Dans la suite, on prendra ρ = 0.

On constitue un portefeuille de valeur initiale X0 = 1 constitué d’une quantité x1 d’actif 1 et x2 d’actif 2 avec x1 0, x2 0 et X0 = x1 + x2 = 1 (i.e. on répartit 1E entre le deux actifs risqués). On note XT la valeur de ce portefeuille en T

Vérifier que si le gain GT est défini par GT = XT X0, E(GT ) = μ1x1 + μ2x2 = μ2 + x1(μ1 μ2) et Var(GT ) = x.Γx = σ12x 12 + σ 22(1 x 1)2 + 2ρσ 1σ2x1(1 x1).

2.
Tracer les caractéristiques des actifs de base dans le plan moyenne,variance.

  exec("utils.sci");// charge les primitives graphiques utiles
  
  // On définit les caracteristiques des actifs
  d=2;
  mu=[0.05,0.15];
  // Matrice de covariance: des 1 sur la diagonale, des rho ailleurs
  rho=0.0;
  covariance=rho*ones(d,d)+(1-rho)*eye(d,d);
  sigma=[0.10,0.30];
  Gamma=diag(sigma)*covariance*diag(sigma);
  
  // Les caractéristiques des actifs de base
  moyenne_actif=mu;
  std_actif=sigma;
  
  // Tracé des points représentant les actifs dans le plan
  //                 (ecart-type,moyenne)
  rectangle=plot_actifs(moyenne_actif,std_actif);
  // On recupére le "rectangle" dans lequel on va dessiner par la suite.
3.
Tracer la courbe x1 [0, 1] (E(GT ),∘ ---------
  Var (GT )).

Vérifier que l’on peut construire un portefeuille de même variance que l’actif 1 mais dont l’espérance du rendement est supérieure à celle de cet actif. Est il rationnel d’investir dans l’actif 1, si l’on cherche à minimiser son risque ?

Quel sont les portefeuilles dans lesquels il paraît rationnel d’investir ?

  // On parcours toutes les valeurs possibles de x_1 et x_2
  // C'est facile lorsque d=2 ...
  N=100;
  x_1=[0:1/N:1];
  x=[x_1;1-x_1];
  
  moyenne_x=0;std_x=0;
  for i=[1:N+1] do
    current_x=x(:,i);
    // QUESTION: moyenne_x(i) = QUE VAUT LA MOYENNE DE CE PORTEFEUILLE
    // QUESTION: std_x(i)= QUE VAUT L'ECART-TYPE DE CE PORTEFEUILLE
  end;
  
  plot2d(std_x,moyenne_x,style = 1,rect = rectangle);
  set_line(bleu,1);// on trace la courbe en bleu, épaisseur=1
4.
Vérifier que l’on peut construire un portefeuille de variance minimum (et inférieure à celle de l’actif de variance minimum). C’est un exemple de l’effet de diversification dans la théorie des portefeuille.
  // Calcul du point de variance minimum
  [m,imin]=min(std_x);
  
  plot2d(std_x(imin),moyenne_x(imin),rect = rectangle);// trace du point
  set_dot(vert,4);// en vert, taille=4
5.
Nous relaxons la condition x1 0, x2 0 tout en continuant à imposer x1 + x2 = 1 (la valeur totale de notre investissement initial reste égale à 1). Nous allons faire varier x1 entre 10 et 0 (lorsque x1 est négatif, on emprunte une quantité |x1| d’actif 1, mais la valeur totale du portefeuille doit toujours rester égale à 1).

Tracer la courbe x1 [5, 0] (E(GT ),∘Var--(G--)
         T). Vérifier que, si l’on accepte une variance grande, on peut constituer des portefeuilles d’espérance aussi grande que souhaitée (cet effet porte le nom d’effet de levier ou leverage effect). On comprend qu’il ne faille pas en abuser !

  moyenne_x=0;std_x=0;
  // On autorise l'emprunt de l'actif 1
  //  -> la quantité d'actif 1 est négative
  
  N=1000;
  
  // QUESTION: générer N x_1 entre -5 et 0 puis les x_2 correspondants;
  x_1=[-5:A_COMPLETER:0];
  x_2=A_COMPLETER;
  x=[x_1;x_2];
  
  for i=[1:N+1] do
    current_x=x(:,i);
    moyenne_x(i+1)=mu*current_x;
    std_x(i+1)=sqrt(current_x'*Gamma*current_x);
  end;
  
  plot2d(std_x,moyenne_x,style = point,rect = rectangle);
  set_line(vert,1);// trace les lignes en vert, taille=1
6.
Tracer la courbe x2 [5, 0] (E(GT ),∘ ---------
  Var (GT )). Vérifier que lorsque l’on emprunte l’actif 2 (x2 négatif), l’on fait décroître l’espérance en augmentant la variance (ce qui est loin d’être optimal !).
  // Que se passe t'il lorsque l'on emprunte de l'actif 2 ?
  moyenne_x=0;std_x=0;
  
  // On autorise l'emprunt de l'actif 2
  //  -> la quantité d'actif 2 est négative
  N=1000;
  // QUESTION: générer N x_2 entre -5 et 0 puis les x_1 correspondants;
  x_2=[-5:A_COMPLETER:0];
  x_1=A_COMPLETER;
  x=[x_1;x_2];
  
  for i=[1:N+1] do
    current_x=x(:,i);
    moyenne_x(i+1)=mu*current_x;
    std_x(i+1)=sqrt(current_x'*Gamma*current_x);
  end;
  
  plot2d(std_x,moyenne_x,style = point,rect = rectangle);
  set_line(rouge,1);// trace les lignes en rouge, taille=1
7.
Recommencer l’expérience précédente avec des valeurs de ρ non nulle. Prendre par exemple
ρ = − 0.5  et  ρ = 0.5

Que peut représenter ces valeurs de ρ ?

  // Matrice de covariance: des 1 sur la diagonale, des rho ailleurs
  rho=0.5;// -0.5
  covariance=rho*ones(d,d)+(1-rho)*eye(d,d);
  Gamma=diag(sigma)*covariance*diag(sigma);
  // etc ...
8.
Nous allons introduire un nouvel actif, l’actif sans risque, qui comme son nom le suggère aura un rendement de variance nulle (ce qui implique que ce rendement n’est pas aléatoire). On supposera que ce rendement déterministe est inférieur à tous les rendements moyens des actifs risqués (pourquoi est-ce une hypothèse raisonnable ?). On prendra, ici, ce rendement égal à 0.

On constitue des portefeuilles avec les 3 actifs (1 non risqué, 2 risqués) en tirant au hasard des coefficients (x1,x2,x3) dans le simplexe {0 ≤ x  ≤ 1,i = 1,2,3 et x  + x  + x  = 1}
       i                  1    2    3. La fonction simplexe(d) figurant dans utils.sci pour d = 3 fait ce travail.

Matérialiser, en tirant un grand nombre points au hasard, la nouvelle frontière efficiente. Vérifier que :

  // On rajoute un actif sans risque de moyenne nulle
  r0=0;
  mu=[r0,mu];
  // comme ce rendement est suppose deterministe, la matrice de
  // variance covariance se complete par une ligne et une colonne de 0
  // QUESTION: Gamma= QUE VAUT GAMMA DANS CE CAS
  
  moyenne_actif=mu;
  std_actif=sqrt(diag(Gamma));
  
  // On materialise les 3 actifs de base
  plot2d(std_actif,moyenne_actif,style = 1,rect = rectangle);
  set_dot(noir,4);
  
  // On considère des portefeuilles *avec l'actif sans risque*
  // mais *sans emprunt*. On les tire au hasard dans le simplexe
  // de dimension 3
  N=1000;
  moyenne_x=0;std_x=0;
  for i=[1:N] do
    x=simplexe(d+1);// tirage au hasard dans le simplexe
    moyenne_x(i)=mu*x;
    std_x(i)=sqrt(x'*Gamma*x);
  end;
  
  plot2d(std_x,moyenne_x,style = -1,rect = rectangle);
  set_dot(bleuclair,2);

Commentaire : On obtient de nouveaux points ”non dominés” entre l’actif sans risque et un portefeuille tangent. La variance reste bornée par la variance de l’actifs de plus grande variance tant que l’on n’emprunte pas.

9.
On va identifier un portefeuille particulier P, le “portefeuille de marché”. P est le portefeuille correspondant au point de tangence de la droite passant par l’actif sans risque et de l’ensemble de tous les portefeuilles a coefficients positifs de la question précédente.

Le point P est caractérisé par le fait qu’il maximise la pente des droites reliant le point (σ0 = 0,r0 = 0) et les points correspondants à des portefeuilles y ne faisant pas intervenir d’actif sans risque.

Toujours en procédant par simulation dans le simplexe, calculer P (en fait une approximation de P).

Vérifier que le portefeuille P fait intervenir les 2 actifs risqués.

  // On genere des portefeuilles sans actifs sans risque
  N=1000;
  moyenne_y=0;std_y=0;
  for i=[1:N] do
    // QUESTION: y = LES PORTEFEUILLES SANS ACTIF SANS RISQUE
  
    // on calcule les moyennes et variances des portefeuilles y
    moyenne_y(i)=mu*y;
    std_y(i)=sqrt(y'*Gamma*y);
  end;
  
  // Le point P maximise la pente de la droite entre (sigma0=0, x_0=r0)
  // et les portefeuilles y (sans actif sans risque)
  r0=mu(1);
  sigma0=0;// sigma0 = Gamma(1,1) = 0
  pente=(moyenne_y-r0) ./(std_y-sigma0);// calcul des pentes
  [lambda,imax]=max(pente);
  
  // Tracé du point P
  x_P=moyenne_y(imax);
  sigma_P=std_y(imax);
  plot2d(sigma_P,x_P,style = 1,rect = rectangle);
  set_dot(vert,4);
  
  // Tracé du segment "Actif sans risque -> P"
  plot2d([sigma0,sigma_P],[r0,x_P],style = 1,rect = rectangle);
  set_line(vert,2);
  
  // Tracé de la droite "actif sans risque -> P" au dela de P
  lambda=(x_P-r0)/(sigma_P-sigma0);//pente de la droite
  sigma=2.0;// arbitraire mais "grand"
  x=r0+lambda*(sigma-sigma0);
  plot2d([sigma0,sigma],[r0,x],rect = rectangle);
  set_line(vert,2);
10.
On autorise la détention d’une quantité de signe arbitraire d’actif sans risque (cela correspond soit à un emprunt, soit à un placement). Pour cela on vous suggère de tirer la quantité d’actif sans risque x0 entre [4, 1] (on peut emprunter jusqu’à 4 fois ce que l’on possède). Puis on tire, les quantités d’actifs risqués uniformément sur le simplexe {x1 + x2 = 1 x0}.

Tirer un grand nombre de portefeuille, calculer leurs moyennes et écarts-type, les tracer sur la figure.

  // L'emprunt en actif sans risque est autorisé
  N=1000;
  moyenne_x=0;variance_x=0;
  for i=[1:N] do
    // On génère des portefeuilles dont la quantité
    // d'actif sans risque est uniforme sur [-4,1]
    x_0=grand(1,1,'unf',-4,1);
    s=simplexe(d);// tirage uniforme dans le simplexe de dim |$d$|.
    // On veut génèrer un portefeuille avec x_0 actifs sans risque
    // et de valeur totale |$x_0 + \sum_{i=1,\ldots,d} x_i = 1$|.
    // QUESTION: x = COMMENT DEFINIR CE PORTEFEUILLE EN UTILISANT s
  
    moyenne_x(i)=mu*x;
    variance_x(i)=sqrt(x'*Gamma*x);
  end;
  
  // Tracé des points tirés au hazard
  plot2d(variance_x,moyenne_x,style = -2,rect = rectangle);
  set_dot(mauve,2);

Vérifier que :

11.
On peut aussi autoriser la détention d’une quantité de signe arbitraire de l’un quelconque des actifs. Pour cela on tire “au hasard” les coefficients (x1,x2,x3) du portefeuille sans imposer de condition de positivité. C’est un peut plus délicat puisque le support des tirages n’est plus compact et la loi uniforme n’a pas de sens. La fonction arbitraire(d,alpha) figurant dans utils.sci pour d = 3 fait ce travail. alpha est un paramètre réel à régler (alpha égal à 1 convient dans ce cas).

Tirer un grand nombre de portefeuille, calculer leurs moyennes et écarts-type, les tracer. On constate que tous ces nouveaux portefeuilles restent en dessous de la droite de marché.

  d=3;
  N=1000;
  moyenne_x=0;variance_x=0;
  for i=[1:N] do
    x=arbitraire(d);
    moyenne_x(i)=mu*x;
    variance_x(i)=sqrt(x'*Gamma*x);
  end;
  
  // Tracé des points tirés au hazard
  plot2d(variance_x,moyenne_x,style = -2,rect = rectangle);
  set_dot(mauve,2);

2 Le cas d’un nombre d’actifs risqués arbitraire

Lorsque d > 2 les phénomènes sont identiques mais moins explicites. On peut recommencer ce qui précède mais il faudra généraliser le choix de la matrice de variance covariance et procéder par simulation dans tous les cas. Notez que les programmes fournis en correction fonctionnent en dimension arbitraire (sauf aux questions 1 et 2).

A titre indicatif voici un exemple du cas d = 3.

1.
Choix des actifs de base.
  // Caracteristiques des actifs sans risque
  
  d=3;rho=0.0;
  
  min_esp=0.05;max_esp=0.15;
  mu=[min_esp:(max_esp-min_esp)/(d-1):max_esp];
  
  // On suppose que tous les actifs risqués ont une
  // corrélation constante égale à |$\rho$|.
  // On doit forcement avoir |$\rho >= -(1/(d-1))$|,
  // sinon la matrice n'est pas une matrice de covariance (exercice!).
  covariance=rho*ones(d,d)+(1-rho)*eye(d,d);
  
  // On choisit un ecart type croissant en fonction de l'actif
  min_sigma=0.1;max_sigma=0.3;
  sigma=[min_sigma:(max_sigma-min_sigma)/(d-1):max_sigma];
  
  // La matrice de variance covariance se calcule par :
  Gamma=diag(sigma)*covariance*diag(sigma);
  
  // Les caractéristiques des actifs de base
  moyenne_actif=mu;
  std_actif=sqrt(diag(Gamma));
  
  // Tracé des actifs dans le plan (ecart-type,moyenne)
  rectangle=plot_actifs(moyenne_actif,std_actif);
2.
Tirages des portefeuilles à coefficients positifs.
  // On simule des valeurs possibles
  N=1000;
  moyenne_x=0;std_x=0;
  for i=[1:N] do
    x=simplexe(d);
    moyenne_x(i)=mu*x;
    std_x(i)=sqrt(x'*Gamma*x);
  end;
  
  plot2d(std_x,moyenne_x,style = 1,rect = rectangle);
  set_dot(bleu,2);
  
  // Le point de variance minimum
  [m,imin]=min(std_x);
  plot2d(std_x(imin),moyenne_x(imin),rect = rectangle);
  set_dot(vert,4);
3.
On autorise l’emprunt de l’actif 1.
  N=1000;
  moyenne_x=0;std_x=0;
  sigma_e=2;
  for i=[1:N] do
    x=arbitraire(d,sigma_e);
    moyenne_x(i)=mu*x;
    std_x(i)=sqrt(x'*Gamma*x);
  end;
  
  plot2d(std_x,moyenne_x,style = point,rect = rectangle);
  f=gcf();Dessin=f.children(1).children(1).children(1);
  set_dot(rouge,2);
4.
On rajoute un actif sans risque de moyenne nulle.
  r0=0;
  mu=[r0,mu];
  // comme le rendement est deterministe, la matrice de
  // variance covariance se complete par
  Gamma=[zeros(1,d+1);zeros(1,d)',Gamma];
  
  // On materialise les 4 actifs de base
  moyenne_actif=mu;
  std_actif=sqrt(diag(Gamma));
  plot2d(std_actif,moyenne_actif,style = 1,rect = rectangle);
  set_dot(noir,4);
5.
On considère des portefeuilles *avec l’actif sans risque* mais sans emprunt. On les tire au hasard dans le simplexe.
  N=1000;
  std_x=0;moyenne_x=0;
  for i=[1:N] do
    x=simplexe(d+1);
    moyenne_x(i)=mu*x;
    std_x(i)=sqrt(x'*Gamma*x);
  end;
  
  plot2d(std_x,moyenne_x,style = -1,rect = rectangle);
  set_dot(bleuclair,2);
6.
Identification du portefeuille de marché P.
  N=1000;
  moyenne_y=0;std_y=0;
  for i=[1:N] do
    y=[0;simplexe(d)];// un portefeuille sans actif sans risque
    moyenne_y(i)=mu*y;// on calcule ses caractéristiques
    std_y(i)=sqrt(y'*Gamma*y);
  end;
  
  r0=mu(1);
  sigma0=sqrt(Gamma(1,1));// sigma0 = Gamma(1,1) = 0
  pente=(moyenne_y-r0) ./(std_y-sigma0);// calcul des pentes
  [lambda,imax]=max(pente);
  x_P=moyenne_y(imax);
  sigma_P=std_y(imax);
7.
Tracé du portefeuille de marché et de la droite de marché associé.
  // Tracé du point P
  plot2d(sigma_P,x_P,style = 1,rect = rectangle);
  set_dot(red,2);
  
  // Tracé du segment "Actif sans risque -> P"
  plot2d([sigma0,sigma_P],[r0,x_P],style = 1,rect = rectangle);
  set_line(vert,2);
  
  // Tracé de la droite "actif sans risque -> P" au dela de P
  sigma=2.0;// arbitraire mais "grand"
  lambda=(x_P-r0)/(sigma_P-sigma0);//pente de la droite
  x=r0+lambda*(sigma-sigma0);
  plot2d([sigma0,sigma],[r0,x],style = -1,rect = rectangle);
  set_line(vert,2);
8.
Avec actif sans risque et emprunt autorisé. On tire au hasard sans imposer le signe de l’actif sans risque. C’est fait par la primitive arbitraire(d+1,sigma_e) qui faitun choix (arbitraire) pour la loi de la quantité d’actif sans risque.
  N=5000;
  moyenne_x=0;variance_x=0;
  for i=[1:N] do
    x=arbitraire(d+1,sigma_e);
    moyenne_x(i)=mu*x;
    variance_x(i)=sqrt(x'*Gamma*x);
  end;
  
  // Tracé des points tirés au hazard
  plot2d(variance_x,moyenne_x,style = -2,rect = rectangle);
  set_dot(mauve,2);

Ce programme est paramétrable pour des valeurs de d et ρ arbitraires, si vous souhaitez expérimenter par vous même. Toutefois des problèmes d’échantillonage se pose lorsque d devient grand (au delà de 5, la loi uniforme sur le simplexe “a du mal à visiter les coins”).

3 Solution des problèmes d’optimisation

1.
Le calcul du portefeuille de marché P, s’exprime sous la forme d’un problème d’optimisation avec contrainte.

Ce poblème se résout avec des techniques classiques implémentées dans Scicoslab et qui utilisent vos cours d’optimisation de 1A (passé) et de 2A (futur !).

La fonction [f,xopt]=optim(cost,x0) minimise une fonction, si on lui fournit une fonction cost qui renvoie la valeur du coût ainsi que de la dérivée du coût en fonction des paramètres. x0 est la valeur initiale de l’algorithme. optim renvoie la valeur de l’optimum dans f et le minimiseur dans xopt.

  // Choix des caracteristiques des actifs sans risque
  d=30;rho=0.0;
  min_esp=0.05;max_esp=0.15;
  mu=[min_esp:(max_esp-min_esp)/(d-1):max_esp];
  min_sigma=0.1;max_sigma=0.3;
  sigma=[min_sigma:(max_sigma-min_sigma)/(d-1):max_sigma];
  correlation=rho*ones(d,d)+(1-rho)*eye(d,d);
  Gamma=diag(sigma)*correlation*diag(sigma);
  
  // Définition de la fonction de cout et de sa dérivée
  // en utilisant la contrainte |$\sum_{i=1}^d \lambda_i=1$|
  function [f,g,ind]=cost(x,ind)
    // On maximise
    //       f = (mu*lambda)^2 / lambda'*Gamma*lambda
    // sous la contrainte |$\sum_{i=1}^d \lambda_i=1$|, |$x=\lambda(2:d)$|
    p=prod(size(x))+1;// dimension de |$\lambda = 1+dim(x)$|
    // x_1 est calculé en fonction de |$\lambda$| à partir de x(2:d)
    // en utilisant la contrainte |$\sum_{i=1}^d \lambda_i = 1$|
    lambda=[1-sum(x);x];
    ps=mu*lambda;
    var=lambda'*Gamma*lambda;
    // On cherche à minimiser (lambda.mu)^2 / lambda'.Gamma.lambda
    f=ps^2/var;
    // le dérivée du coût en fonction de lambda
    k=(2*ps/var)*mu-(2*ps^2/var^2)*lambda'*Gamma;
    // Calcul de la dérivée par rapport a |$x$|
    // en fonction de la derivee en |$\lambda$|.
    g=k(2:p)-k(1);
    f=-f;g=-g;// On maximise mais Scicoslab suppose que l'on minimise ...
  endfunction
  
  x0=ones(d-1,1)/d;
  [f,xopt]=optim(cost,x0);
  Xopt=[1-sum(xopt);xopt];
  Fopt=sqrt(-f)
  
  // Est on bien entre |$0$| et |$1$| ? C'est toujours le cas pour
  // Rho diagonale mais pas toujours dans le cas non diagonal
  ok=and(0 <= Xopt) & and(Xopt <= 1)
  
  // Lorsque rho=0, il y a une solution explicite (exercice)
  // lambda_i = alpha * mu_i/sigma_i^2, renormalisé
  // On verifie ...
  sigma=sqrt(diag(Gamma))';
  x=(mu ./sigma^2);
  x=x'/sum(x);// noramlisation
  norm(x-Xopt),// lorsque la matrice Rho est diagonale
  // ca devrait etre petit
2.
La frontière efficiente peut se calculer en résolvant une famille de problème d’optimisation classique : minimisation de variance à espérance fixée et/ou maximisation d’espérance à variance fixée.
  function lambda=x2lambda(x,R,mu)
    // construction de lambda a partir de x
    // en tenant compte des contraintes |$\sum_i \lambda_i  =1$|, |$r^T \lambda = R$|
    p=prod(size(x))+2;// dimension de lambda = 2+dim x
    alpha0=1-sum(x);
    beta0=R-mu(1:p-2)*x;
    lambda_n_1=(mu(d)*alpha0-beta0)/(mu(d)-mu(d-1));
    lambda_n=(beta0-mu(d-1)*alpha0)/(mu(d)-mu(d-1));
    lambda=[x;lambda_n_1;lambda_n];
  endfunction
  
  function [f,g,ind]=cost(x,ind)
    // On minimise la variance
    //       f = lambda'*Gamma*lambda
    // sous les contraintes |$\sum(\lambda)=1$|, |$r^T \lambda = R$|
    p=prod(size(x))+2;// dimension de lambda = 2+dim x
    lambda=x2lambda(x,R,mu);
    k=Gamma*lambda;// derive en fonction de lambda
    f=lambda'*k;// = lambda'*Gamma*lambda;
    for i=[1:p-2] do
      // derivee par rapport a x (et non lambda)
      g(i)=k(i)+(k(p-1)*(-mu(p)+mu(i))+k(p)*(-mu(i)+mu(p-1)))/(mu(d)-mu(d-1));
    end
  endfunction
  
  // Choix des caracteristiques des actifs sans risque
  d=30;rho=0.0;
  min_esp=0.05;max_esp=0.15;
  mu=[min_esp:(max_esp-min_esp)/(d-1):max_esp];
  min_sigma=0.1;max_sigma=0.3;
  sigma=[min_sigma:(max_sigma-min_sigma)/(d-1):max_sigma];
  correlation=rho*ones(d,d)+(1-rho)*eye(d,d);
  Gamma=diag(sigma)*correlation*diag(sigma);
  
  x0=ones(d-2,1)/d;
  i=0;abscisse=0;ordonnee=0;
  for R=[0.05:0.001:0.15] do
    [f,xopt]=optim(cost,x0);
    Xopt=x2lambda(xopt,R,mu);
    i=i+1;
    abscisse(i)=sqrt(f);
    ordonnee(i)=R;
  end;
  plot2d(abscisse,ordonnee);
3.
Toujours en ignorant les contraintes de positivités, on peut obtenir une forme quasi explicite pour la frontière de Pareto, en utilisant deux multiplicateurs de Lagrange (l’un pour i=1dλ i = 1, l’autre pour i=1dμ iλi = r).

On obtient après quelques calculs simples, si

      ′ −1         ′ −1        ′  −1               2
A =  μΣ   μ, B = μ Σ   1,C  = 1 Σ   1,D  = AC  − B  ,

la paramètrisation suivante de la frontière de Pareto : (λμ,λΣλ) où λ est la fonction de r suivante :

        (       )
    BC--      B-
λ =  D    r − C   (λμ − λg) + λg,

λg = Σ11∕C et λ μ = Σ1μ∕B. On peut vérifier que seule la partie de cette courbe correspondant à r BC- appartient à la frontière de Pareto.

On pourra se convaincre que λg est le point qui minimise la variance des portefeuilles sous la seule contrainte que i=1dλ i = 1 et que λμ est le point qui maximise le ratio de Sharpe μλ∕√ -----
  λ′Σλ sous la même contrainte (utiliser Cauchy-Schwartz pour s’en convaincre).

Voir T.J. Brennan and A.W. Lo, 2010, “Impossible frontiers” ou Merton, R., 1972, “An analytic derivation of the Efficient Portfolio Frontier”.