Application 1- VBA : Test de comportements d'investissements Notions mobilisées Chapitres 1 à 5 du cours - Exemple de récupération de cours en ligne 1ère approche des objets (feuilles et classeurs). Corps du TD Le but du TD est d'implémenter une étude de comportements d'investissement, d'abord simples, plus complexes. Une fois l'implémentation testée pour le cas de quelques stratégies d'investissement sur 1 seul titre et sans coûts de transaction (ETAPE 1), on passe au cas de plusieurs titres, en testant des stratégies plus complexes et en ajoutant des coûts de transaction (ETAPE 2). Par la suite, on généralise l'algorithme en automatisant la récupération de cours en ligne (ETAPE 3). Au final, on crée une interface permettant à un utilisateur non averti d'utiliser l'application développée (ETAPE 4) et on lance une étude un peu plus large (ETAPE 5). ETAPE 1 : Étude d'un premier cours et définition des premières stratégies Récupérer le classeur du TD en ligne à l'adresse suivante : http://rdorat.free.fr/enseignement/vba/td/td1_e1.xls Dans ce classeur, on donne le cours journalier de l'action ADP sur la période du 19/06/2006 au 12/08/2008. On commence par calculer une série d'éléments caractéristiques qui pourront intervenir dans la définition de plusieurs stratégies financières (moyenne mobile, rentabilité moyenne,...). Dans la suite, on testera notamment une stratégie qui investit en comparant le cours actuel du titre avec sa moyenne mobile et une stratégie qui investit au hasard. 0- Créer un nouveau module et mettre Option Explicit en haut de la feuille de code qui correspond à ce module. Rappeler a quoi cela correspond. 1- Le premier élément caractéristique que l'on veut calculer c'est la rentabilité, on crée une procédure : Sub calculcaracteristiques() On veut construire, en variable globale, un tableau contenant la série des rentabilités du titre. On crée donc un tableau de nombres réels indicié de 2 à 531 et nommé rentabilites. Ce tableau donne pour chaque période la rentabilité associée. Pourquoi ne fait-on pas commencer le tableau à l'indice 1? Proposer un code qui remplit le tableau en utilisant le cours de l'action ADP stocké dans le classeur. Application VBA 1 - Rémi Dorat 1/5
2- On crée un deuxième tableau en variable globale. Celui-ci vise à enregistrer, pour chaque période, la moyenne mobile calculée sur les 5 derniers jours de bourse. Comment doit être indicié ce tableau? On donne le code pour remplir ce tableau : 'Remplissage de moyennemobile5 For i = 2 To 531 moyennemobile5(i) = 0 If i <= 5 Then For j = 1 To i - 1 moyennemobile5(i) = moyennemobile5(i) + Cells(j, 2) moyennemobile5(i) = moyennemobile5(i) / (i - 1) Else For j = 1 To 5 moyennemobile5(i) = moyennemobile5(i) + Cells(i - j, 2) moyennemobile5(i) = moyennemobile5(i) / 5 End If Cells(i, 5) = moyennemobile5(i) Expliquer ce code. 4- On crée une nouvelle procédure : la procédure main : celle-ci va être le cœur de notre algorithme. Elle est celle qui appelle les autres procédures et fonctions. On choisit le nom main parce que dans la plupart des langages, la fonction principale doit s'appeler de cette manière. On donne le code de la procédure principale (le saisir tel quel) : 'La procédure principale Sub main() 'Initialisation du générateur aléatoire. Randomize 'Calcul des éléments caractéristiques Call calculcaracteristique 'Initialisation des stratégies 'jeu des stratégies 'Affichage des résultats 5- On veut tester des stratégies, en commençant par une seule stratégie. On crée, en variable globale, un entier qui est le nombre de titres détenus, initialisé à 0, et le numéraire possédé, initialisé à 1000 au début de la procédure main(). Application VBA 1 - Rémi Dorat 2/5
6- On conçoit une première stratégie. Celle-ci investit dans un titre si le cours de ce titre est inférieur à sa moyenne mobile à 5 jours. Elle vend ses actions si le titre est coté au dessus de sa moyenne mobile à 5 jours. Pour cette stratégie, on l'implémente comme une procédure ayant cette forme : Sub stratmm(periode as Integer) periode est un paramètre qui indique à quelle période la stratégie doit adapter son comportement. Proposer un code pour cette procédure. 7- L'appel de la procédure stratmm( i ) a lieu au sein de la fonction main. Expliquer quel forme doit prendre cet appel, sachant qu'il faut appeler la procédure de mise à jour du portefeuille pour la période 1, puis pour la période 2, puis pour la période 3 etc... 8- On fait évoluer la procédure stratmm. Pour chaque période i, on indique en colonne 7 la quantité du titre détenu, en colonne 8 le niveau du numéraire et en colonne 9 la valeur du portefeuille. 9- On se rend compte que la stratégie MM est trop réactive : on veut rajouter un seuil de réaction. On veut que la stratégie investisse dans le titre si la moyenne mobile à 5 jours est supérieure au cours du titre augmenté d'un coefficient >0. De même, on ne vend le titre que si la moyenne mobile à 5 jours est inférieure au cours du titre diminué d'un coefficient>0. Ce coefficient sera implémenté comme une variable globale. On prend ce coefficient égal à 5% initialement. 10- De la même manière qu'on a défini la stratégie MM, on définit une stratégie Hasard qui vend et achète au hasard à chaque période. Tester une telle stratégie (plusieurs solutions sont possibles pour cette stratégie). 11- (a) (b) Tester la stratégie basée sur la moyenne mobile pour différentes valeurs du coefficient de sensibilité. Quelles modifications faudrait il faire dans le code pour tester l'effet d'une stratégie similaire basée sur une moyenne mobile à 15 jours. Application VBA 1 - Rémi Dorat 3/5
(c) Est ce que la stratégie d'investissement au Hasard est plus efficace? 12- Quelques questions complémentaires sur le code : (a) Quel avantage de faire un tableau rentabilites plutôt que de stocker les valeur de rentabilité dans la feuille? (b) Pour la stratégie d'investissement au hasard, on voudrait qu'elle n'actualise le portefeuille qu'au bout de 10 périodes. Quelle modification du code cela impliquerait? ETAPE 2 : Récupération de nouveaux cours, tests de plusieurs stratégies et rajout des coûts de transaction On veut passer à une implémentation plus massive. Ceci consiste d'abord dans le fait d'utiliser plusieurs cours. On introduira également les coûts de transaction qui n'ont pas été pris en compte dans la partie précédente. On veut enfin définir des stratégies qui ne prennent plus des décisions seulement sur un cours, mais sur les différents cours en constituant des portefeuilles qu'elles font évoluer au cours du temps. La démarche d'implémentation reste globalement la même. 13- On récupère le classeur http://rdorat.free.fr/enseignement/vba/td/td1_e2.xls qui contient différents cours sur la feuille cours. On va construire un code VBA similaire à celui de l'étape 1 en plus complexe. On commence par introduire une constante qui correspond au nombre de cours disponibles. On rappelle que cela se fait par une instruction de la forme : Const nbtitres as Integer = 5 A l'instar de ce qui a été fait dans l'étape 1, on calcule différents éléments caractéristiques. 14- Créer une procédure qui calcule pour chaque cours, chaque période les valeurs d'un tableau de rentabilités sur 5 périodes. 15- On veut également calculer pour chaque période la moyenne des cours précédents, l'écart type sur les cours précédents. Là aussi le stockage se fera dans une variable globale. On veut introduire des coûts d'investissement. Application VBA 1 - Rémi Dorat 4/5
16- Ces cours seront donnés par une fonction : Function couttransaction(montant as double) as double Ce coût se définit de la manière suivante : un coût fixe de 8,5 si on a un montant de transaction inférieur à 2000, un coût de transaction de 0,5% de la transaction sinon. 17- Implémenter une fonction qui sera utilisée par différentes stratégies : une fonction qui renvoie le nombre de titres max que l'on peut acheter en fonction du numéraire disponible et du cours de l'action. 18- Définir une première stratégie d'investissement qui correspond à l'ancienne moyennemoblie5, mais qui généralise cette stratégie au cas de plusieurs titres. On peut bien sûr introduire une composante aléatoire dans la stratégie. 18- Définir une stratégie d'investissement au hasard. 19- Tester les stratégies d'investissement en présence de coût de transaction. 20- Introduire d'autres stratégies et les tester 21- Refaire le test en augmentant les coûts de transaction. 22- Que faudrait-il changer dans le code pour pouvoir tester des stratégies sur un plus grand nombre de cours? 23- Actuellement, l'évaluation des stratégies se fait sur une seule simulation. Or les comportements intégrant des composantes aléatoires ne feront pas la même chose d'une simulation sur l'autre. Comment pourrait-on maîtriser cette limite? Application VBA 1 - Rémi Dorat 5/5