220 likes | 452 Views
Programmation. Construction d’un Call Synthétique. Déclaration des Variables. Option Explicit Dim S_t As Double Dim X As Double Dim S_0 As Double Dim CompteurSimulation As Long Dim Portefeuille As Double Dim Vol As Double
E N D
Programmation Construction d’un Call Synthétique
Déclaration des Variables • Option Explicit • Dim S_t As Double • Dim X As Double • Dim S_0 As Double • Dim CompteurSimulation As Long • Dim Portefeuille As Double • Dim Vol As Double • Dim BT As Double 'Valeur des bons du trésors achetés à escompte à t=0 • Dim PcS_t As Double 'Porportion du portefeuille investi dans S_t en pourcent • Dim PcBT As Double 'Quantité de bons du trésor dans le portefeuille en pourcent • Dim NbBT As Double 'Le nombre d'unité de BT dont la valeur nominale est 100 • Dim NbS_t As Double 'le nombre d'actions détenus dont la valeur est de S_t
Tâches à accomplir • 'On fixe la valeur initiale du portefeuille à 100$ • 'Le delta détermine la proportion investie dans S_t et la différence dans les • 'Bons du trésors. • 'programme pour calculer la valeur d'une option synthétique • Sub CalculePortefeuille() • Dim NombreSimulations As Long • Dim r_f As Double • Dim div As Double • Dim T_t As Double • Dim LongueurPas As Double
Lire les données • ' • 'Lire les données dans le chiffrier Excel avec les définitions de • 'nom de variables • S_0 = Range("S_0").Value • X = Range("Strike").Value • Vol = Range("Vol").Value • r_f = Range("r_f").Value • div = Range("div").Value • T_t = Range("T_t").Value • LongueurPas = Range("LongueurPas").Value • CompteurSimulation = 0 • NombreSimulations = InputBox("Entrer le nombre de simulations", "Simulations des points d'arrivés") • 'NombreSimulations = Range("Nombre_Simulations").Value • Range("Nombre_Simulations").Value = NombreSimulations • '
Pour chaque simulation • For CompteurSimulation = 1 To NombreSimulations • S_t = S_0 • PcS_t = DeltaCall(S_t, X, Vol, r_f, div, T_t) • PcBT = 1# - PcS_t • BT = Exp(-r_f * T_t) * 100 • NbBT = PcBT * 100# / BT • NbS_t = PcS_t * 100# / S_t • Portefeuille = BT * NbBT + NbS_t * S_t • Call VolatiliteConstante(r_f, div, Vol, LongueurPas, T_t) • Next CompteurSimulation • Range("B15").Value = Portefeuille • End Sub
Jour par jour pour la période • Sub VolatiliteConstante(ByVal r_f, ByVal div, ByVal sigma, ByVal LongueurPas, ByVal T_t) • 'Executer une boucle qui nous permet de trouver la valeur • 'de l'actif sous-jacent • Dim CompteurJours As Integer • Dim NombrePas As Integer • Dim Echeance As Double • Dim RendementPortefeuille As Double • Dim RendementS_t As Double • NombrePas = T_t * 365 • For CompteurJours = 0 To NombrePas
Simulation du sous-jacent • 'Calcul de la valeur du sous_jacent • S_t = S_t + dS_t(r_f, div, sigma, LongueurPas) • 'Réévaluation du portefeuille • 'Les bons du trésors valent + cher une journée de moins avant échéance • Echeance = T_t - CompteurJours * LongueurPas • If (Echeance <= 0) Then Echeance = 0.0001 • BT = Exp(-r_f * Echeance) * 100
Calcul des pourcentages • 'portefeuille avant transactions • Portefeuille = NbBT * BT + NbS_t * S_t • 'calcul de la quantité de sous-jacent et BT • PcS_t = DeltaCall(S_t, X, Vol, r_f, div, Echeance) • PcBT = 1# - PcS_t • 'Transactions : faire les transaction pour que la porportion de S_t soit toujours à delta • NbBT = PcBT * Portefeuille / BT • NbS_t = PcS_t * Portefeuille / S_t • Portefeuille = BT * NbBT + NbS_t * S_t • 'Si on veut examiner une trajectoire on affiche les ressultats • 'Call AfficheResultats(Portefeuille, S_t, BT, CompteurJours) • Next CompteurJours
Calcul du rendement du portefeuille • 'Calcul du rendement du portefeuille à la fin de la trajectoire • 'La valeur initiale du portefeuille est de 100 et la valeur • 'Initiale de l'actif sous-jacent de S_0 • RendementPortefeuille = Log(Portefeuille / 100#) • RendementS_t = Log(S_t / S_0) • Call AfficheRendement(RendementS_t, RendementPortefeuille, CompteurSimulation) • End Sub
Variable aléatoire • Function dS_t(ByVal r_f, ByVal div, ByVal sigma, ByVal LongueurPas) • Dim Ei As Integer • Dim sqrdt As Double • Dim dt As Double • dt = LongueurPas • sqrdt = Sqr(LongueurPas) • Ei = N01() • dS_t = (r_f - div) * S_t * LongueurPas + sigma * Ei * sqrdt * S_t • End Function
Nombre selon une normale • Function N01() • Dim r As Double • r = Rnd() • If r < 0.5 Then • r = -1# • Else: r = 1 • End If • N01 = r • End Function
Calcul du Delta • Function DeltaCall(ByVal S, ByVal X, ByVal sigma, ByVal r, ByVal div, ByVal t) • 'Fonction pour calculer le Delta d'un Call • Dim d1 As Double • d1 = d_1(S, X, sigma, r, div, t) • DeltaCall = NombreNormal(d1) * Exp(-div * t) • End Function
Calcul de d1 • Function d_1(ByVal S, ByVal X, ByVal sigma, ByVal r, ByVal div, ByVal t) • 'Calcul de d_1 • d_1 = (Log(S / X) + (r - div + sigma * sigma / 2) * t) / (sigma * Sqr(t)) • End Function
Fonction de densité • Function NombreNormal(ByVal z) • 'Fonction qui calcule la normale cumulative • NombreNormal = Application.NormSDist(z) • End Function
Affiche les résultats • Sub AfficheResultats(ByVal Portefeuille, ByVal S_t, ByVal BT, ByVal Ligne) • Cells(20 + Ligne, 1).Value = Portefeuille • Cells(20 + Ligne, 2).Value = S_t • Cells(20 + Ligne, 3).Value = BT • End Sub
Affiche les rendements • Sub AfficheRendement(ByVal S_t, ByVal Portefeuille, ByVal Compteur) • Cells(20 + Compteur, 1).Value = Compteur • Cells(20 + Compteur, 2).Value = S_t • Cells(20 + Compteur, 3).Value = Portefeuille • End Sub