Sujet – Investir selon Markowitz 1/8

Transcription

Sujet – Investir selon Markowitz 1/8
Sujet – Investir selon Markowitz
On veut introduire un logiciel qui teste un comportement d'investissement à la Markowitz. Pour préciser, on veut savoir si un
acteur qui investit en reconfigurant périodiquement son portefeuille en tentant de se rapprocher des pondérations optimales indiquées
par Markowitz va être ou non performant. Les deux parties principales sont les parties E2 et E3. Elles sont à traiter. Les parties E1 et
E4 sont des parties optionnelles qui peuvent permettre d'optimiser la note.
Les 4 étapes du programmes :
•
E1 : récupération de quelques titres
•
E2 : détermination du comportement d'investissement qui suit Markowitz
•
E3 : création d'une interface de test
•
E4 : benchmark de la stratégie Markowitz
On demande, pour chaque question, de rédiger un minimum pour expliquer comment a été résolue la question.
E1 : récupération de quelques titres qui sont sur la frontière optimale
E1 : Sélection des titres et préparation des données. On organise une recherche au sein des titres du CAC 40. On a récupéré
la liste des titres du CAC : cf le classeur et les deux variables globales. On veut, sur une période donnée, ne retenir que les titres qui
sont sur la frontière efficiente.
1- Créer un répertoire sur le disque dur : ProjetVBA. Dans ce répertoire, on mettra les différents projets relevant du projet. Le chemin
permettant d'accéder à ce répertoire est gérer comme une constante globale de type string. Ce sera une instruction du type :
Const chemin As String = "E:\Documents and Settings\Dorat\Bureau\ProjetVBA\"
Cette instruction est bien sûr à adapter en fonction du répertoire de destination effectivement choisi.
2- On considère l'instruction suivante (à écrire sur une seule ligne) :
Workbooks.Open
"http://ichart.finance.yahoo.com/table.csv?
s=ACA.PA&a=00&b=1&c=2005&d=10&e=31&f=2011&g=d&ignore=.csv"
Après l'avoir testée, expliquer ce que produit cette instruction ? Expliquez éventuellement cette instruction.
3- On peut modifier l'instruction proposée à la question précédente. On se contentera de changer le code du cours dans ce qui suit.
Dans l'instruction précédente, le code du cours est ACA.PA. Il suffit de mettre à la place le code du cours désiré et d'exécuter
l'instruction pour télécharger le cours. On demande de mettre en place l'ensemble des instructions pour télécharger le cours pour un
code donné et mettre en forme les données, de manière à les obtenir sous forme de données date et numérique et d'avoir les données
dans l'ordre chronologique.
1/8
4- On donne l'ensemble des codes pour les cours du CAC40 (dont on a retiré des titres côtés depuis une période récente)
Option Explicit
Dim codes(1 To 40) As String, noms(1 To 40) As String
Sub remplissageTableauxCodes()
codes(1) = "AC.PA"
codes(2) = "ACA.PA"
codes(3) = "AI.PA"
codes(4) = "ALO.PA"
codes(5) = "ALU.PA"
codes(6) = "BN.PA"
codes(7) = "BNP.PA"
codes(8) = "CA.PA"
codes(9) = "CAP.PA"
codes(10) = "CS.PA"
codes(11) = "DG.PA"
codes(12) = "EAD.PA"
codes(13) = "EDF.PA"
codes(14) = "EI.PA"
codes(15) = "EN.PA"
codes(16) = "FP.PA"
codes(17) = "FTE.PA"
codes(18) = "GLE.PA"
codes(19) = "GSZ.PA"
codes(20) = "KN.PA"
codes(21) = "LG.PA"
codes(22) = "MC.PA"
codes(23) = "ML.PA"
codes(24) = "MT.PA"
codes(25) = "OR.PA"
codes(26) = "PP.PA"
codes(27) = "PUB.PA"
codes(28) = "RI.PA"
codes(29) = "RNO.PA"
codes(30) = "SAN.PA"
codes(31) = "SEV.PA"
codes(32) = "SGO.PA"
codes(33) = "STM.PA"
codes(34) = "SU.PA"
codes(35) = "TEC.PA"
codes(36) = "UG.PA"
codes(37) = "UL.PA"
codes(38) = "VIE.PA"
codes(39) = "VIV.PA"
codes(40) = "VK.PA"
noms(1) = "ACCOR"
2/8
noms(2) = "CREDIT AGRICOLE"
noms(3) = "AIR LIQUIDE"
noms(4) = "ALSTOM"
noms(5) = "ALCATEL-LUCENT"
noms(6) = "DANONE"
noms(7) = "BNP PARIBAS"
noms(8) = "CARREFOUR"
noms(9) = "CAP GEMINI"
noms(10) = "AXA"
noms(11) = "VINCI "
noms(12) = "EADS"
noms(13) = "EDF"
noms(14) = "ESSILOR INTL"
noms(15) = "BOUYGUES"
noms(16) = "TOTAL"
noms(17) = "FRANCE TELECOM"
noms(18) = "STE GENERALE-A-"
noms(19) = "GDF SUEZ"
noms(20) = "NATIXIS"
noms(21) = "LAFARGE"
noms(22) = "LVMH"
noms(23) = "MICHELIN"
noms(24) = "ARCELORMITTAL REG"
noms(25) = "L'OREAL"
noms(26) = "PPR"
noms(27) = "PUBLICIS GROUPE"
noms(28) = "PERNOD RICARD"
noms(29) = "RENAULT"
noms(30) = "SANOFI"
noms(31) = "SUEZ ENV. CPY"
noms(32) = "SAINT GOBAIN"
noms(33) = "STMICROELECTRONICS "
noms(34) = "SCHNEIDER ELECTRIC"
noms(35) = "TECHNIP"
noms(36) = "PEUGEOT"
noms(37) = "UNIBAIL-RODAMCO"
noms(38) = "VEOLIA ENVIRONN."
noms(39) = "VIVENDI"
noms(40) = "VALLOUREC"
End Sub
A partir de là et des instructions mises en évidences à la question précédente, on demande de créer une procédure pour télécharger
l'ensemble des cours du CAC40 et tous les mettre dans un fichier unique avec une feuille contenant dans sa première colonne les
dates de la période retenue (en l'occurence, les cours sont données par semaine sur la période du 01/01/2005 au 31/11/2011) et dans
sa deuxième colonne le cours de l'action. A noter qu'on retient le cours de clôture pour chaque titre.
Note : columns(i) désigne la collection de cases correspondant à la ième colonne dans un fichier VBA.
Note : il faut exécuter la fonction de remplissage des tableaux avant utilisation de ces tableaux.
3/8
5- Question sur le retraitement des données.
6- Si vous avez pu répondre à la question 2), expliquez comment on aurait pu généraliser la procédure pour télécharger tous les cours,
mais sur une plage de date définie par l'utilisateur et non plus donnée, et en proposant également à l'utilisateur de choisir la périodicité
des cours.
E2 : Détermination de la série des portefeuilles
Quoiqu'il ait été fait à l'étape E1, on part du fichier Cours.xlsm pour l'étape E2. Ce fichier contient les titres du CAC 40 dont on
a ôté les trois titres les plus récemment intégrés à l'indice (ArcelorMital, CapGemini et Suez Env CPY) pour éviter d'avoir des titres
seulement côtés sur une partie de la période considérée. Le but est ici de simuler le comportement d'un investisseur qui prendrait sa
décision en fonction d'une stratégie Markowitz.
1- On crée une feuille Rdt. Dans cette feuille, on va faire apparaître l'ensemble des rendements correspondant aux cours de la feuille
"Cours". On crée une procédure pour compléter l'ensemble des rendements à partir des cours. La feuille Rdt doit être invisible
2- Faire en sorte que la procédure qui permet de déterminer l'ensemble des rendements soit déclenchée lors de l'ouverture du
classeur, ou à chaque modification de la feuille Cours (ainsi on s'assure que les rendements soient toujours corrects par rapport aux
cours)
3- On demande de créer d'une fonction qui, à partir d'un numéro de colonne (soit la donnée d'un titre) et à partir de la donnée d'un
numéro de période N calcul la moyenne des rendements du titre, pour la période 2 à la période N. On recommande d'utiliser la forme
suivante pour la fonction :
Function rendementMoyen(numTitre As Integer, numPeriode As Integer) As Double
Cette fonction utilise la feuille dans laquelle sont contenus les rendements.
4- De la même manière, on créer une fonction qui permet de calculer le risque lié à un titre pour une période donnée. De manière
classique, le risque est pris comme l'écart type sur la série des rendements.
Function ecartType(numTitre As Integer, numPeriode As Integer) As Double
5- On crée une nouvelle feuille Opt. Dans cette feuille, on va chercher le portefeuille optimal pour une période donnée. On crée une
procédure qui permet de remplir cette feuille pour une période donnée. Sur cette feuille, on fait apparaître, pour l'ensemble des titres
4/8
leur rendement, leur risque pour la période donnée. On fait également apparaître la matrice de variance-covariance des titres pour
cette période. On laissera les 10 premières lignes vides. On peut nommer la procédure qui permet de remplir cette feuille en utilisant
les données de la feuille Rdt et les fonctions qui ont été précédemment implémentées :
Sub remplissageOpt(numPeriode As Integer)
6- On crée une procédure d'optimisation pour déterminer le portefeuille optimal à partir des éléments introduits dans la feuille Opt.
Dans la feuille Opt, on fait apparaître les pondérations de portefeuille. A noter que la dernière pondération est déterminée comme 1
diminué de la somme des autres pondérations. Pour calculer le risque et le rendement du portefeuille, on peut utiliser les deux
fonctions suivantes :
Function rendementPortefeuille(ponderation As Range, rendementsTitres As Range) As Double
Dim i As Integer
rendementPortefeuille = 0
For i = 1 To ponderation.Count
rendementPortefeuille = rendementPortefeuille + ponderation(i) * rendementsTitres(i)
Next
End Function
Function risquePortefeuille(ponderation As Range, matriceVarCov As Range) As Double
Dim i As Integer, j As Integer
risquePortefeuille = 0
For i = 1 To matriceVarCov.Columns.Count
For j = 1 To matriceVarCov.Rows.Count
risquePortefeuille
=
risquePortefeuille
+
ponderation(i)
*
ponderation(j)
*
matriceVarCov(i, j)
Next
Next
risquePortefeuille = risquePortefeuille ^ (0.5)
End Function
Il suffit d'implémenter ces deux fonctions dans deux cases Excel pour avoir le calcul actualisé du risque et de la rentabilité du
portefeuille. On fait également apparaître le ration de Sharpe (rendement du portefeuille / risque du portefeuille). La feuille obtenue
peut ressembler à cela :
5/8
Soit en affichant les formules :
6/8
7- A partir d'une macro, on utilise le solveur pour déterminer le portefeuille optimal, soit le portefeuille qui maximise le ratio de Sharpe
(on recherche le portefeuille optimal en utilisant le solveur et en plaçant des contraintes de manière à ce que les pondérations soient
toujours comprises entre 0 et 1, soit qu'il n'y ait pas de vente à découvert). On pourra appeler cette macro Optimisation. On constate
qu'au vu du nombre des différentes pondérations, le solveur met un certain temps à résoudre l'optimisation.
NB : il faut activer le solveur parmi les objets Excel pour que cette macro puisse ensuite fonctionner.
8- La présente procédure repose sur les procédures créées aux questions 5) et 6) On créer une nouvelle feuille "Marko"qui va contenir
la simulation d'une stratégie fondée sur Markowitz que l'on affichera dans une feuille "Marko".. On base cette stratégie sur une certaine
échéance : hebdomadaire, mensuelle, annuelle... Ce qui suit dépend de la périodicité retenue, mais on pourrait généraliser au cas de
chacune des périodicités. Supposons que l'on retienne une periodicité mensuelle. On simule le comportement suivant : lors de la
période 10 (choix arbitraire), on remplit la feuille Opt, en utilisant la procédure de la question 5), puis on trouve le portefeuille optimal
pour cette période. On l'affiche dans la feuille "Marko". On passe à la période suivante, la période 40, on fait la même chose etc... On
7/8
obtient la série des portefeuilles retenus. On calcule ce qu'aurait gagné un individu qui à chaque période d'investissement aurait vendu
le portefeuille dont il disposait pour acheter le nouveau portefeuille calculé.
E3 : Création d'une interface
On veut utiliser ce qui a été produit dans la partie E2 pour pouvoir faire des simulations.
1- On crée une interface UserForm qui permet de choisir une périodicité, un niveau de risque et qui permet de faire la simulation
correspondante. La périodicité devra être exprimée comme un entier qui correspond au délai avant l'actualisation du portefeuille. Le
risque indiqué correspondra au niveau de risque à ne pas dépasser. Ce userForm doit également contenir deux boutons : l'un permet
de lancer la procédure qui actualise les rendements à partir des cours et l'autre permet de lancer la simulation. Dessiner ce UserForm.
2- Pour le UserForm, il doit être lancé au démarrage du classeur
3- Il faut s'assurer que les champs textes dans lesquels sont introduits la périodicité et le niveau de risque ne contiennent que des
valeurs numériques.
4- Pour le niveau de risque, il doit être intégré dans la simulation : il faut que les portefeuilles sélectionnés à chaque période ne
dépassent pas le niveau de risque déterminé par l'utilisateur.
5- Faire que le UserForm affiche les résultats de la simulation après qu'elle ait été lancée. Pour cela, faire deux onglets dans le
UserForm, une fois que la simulation est lancée, l'onglet de résultats apparaît et indique la progression de la simulation, puis au final,
les résultats de la simulation.
E4 : benchmark de la stratégie Markowitz
On rajoute sur l'interface la possibilité de tester d'autres stratégies (investissement selon la moyenne mobile, investissement
au hasard, ….). Ces stratégies sont simulées en même temps que la stratégie markowitz. Le logiciel affiche au final quelle est la
meilleure stratégie et permet de consulter les différentes stratégies.
8/8