-
Notifications
You must be signed in to change notification settings - Fork 0
/
README.Rmd
161 lines (113 loc) · 4.85 KB
/
README.Rmd
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
---
title: "Tarification par Monte Carlo d'une Option Put européenne de type Up-and-Out"
author: "Marcel Héritier K."
date: "2023-12-21"
output:
word_document: default
pdf_document: default
html_document: default
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
## à propos
Dans ce tutoriel, nous voyons comment utiliser la méthode de simulation de Monte Carlo pour évaluer les produits financiers dérivés. La notation mathématique et les exemples sont tirés du livre Implementing Derivatives Models de Les Clewlow et Chris Strickland.
La valorisation des produits financiers dérivés par des simulations de Monte Carlo n'est possible qu'en utilisant les mathématiques financières de l'évaluation neutre du risque et en simulant des trajectoires d'actifs neutres du point de vue du risque. La formule de prix de l'espérance risque-neutre en temps continu est donnée par :
[![\\ \begin{equation}\LARGE \\ \frac{C_t}{B_t} = \mathbb{E}_{\mathbb{Q}}[\frac{C_T}{B_T}\mid F_t] \\ \end{equation}](https://latex.codecogs.com/svg.latex?%5C%5C%20%5Cbegin%7Bequation%7D%5CLARGE%20%5C%5C%20%5Cfrac%7BC_t%7D%7BB_t%7D%20%3D%20%5Cmathbb%7BE%7D_%7B%5Cmathbb%7BQ%7D%7D%5B%5Cfrac%7BC_T%7D%7BB_T%7D%5Cmid%20F_t%5D%20%5C%5C%20%5Cend%7Bequation%7D)](#_)
# Dynamique d'un MBG
Ici, nous disposons d'un taux d'intérêt constant, le facteur d'actualisation est donc $\exp(-rt)$, et la dynamique des actions est modélisée par le mouvement brownien géométrique (GBM).
La solution suivante s'applique au prix de l'action S dans le cadre
d'une dynamique neutre à l'égard du risque :
\[
S_{t+\Delta t}=S_{t}\exp\left(\nu\Delta t+\sigma\sqrt{\Delta t}\epsilon_{i}\right)
\]
où $\nu=r-\frac{1}{2}\sigma^{2}$
## Particularités des options barrières
Lors de la détermination du prix d'options complexes ou exotiques dépendant d'un scénario, un produit très répandu est l'option à barrière. Il s'agit d'options européennes standard à expiration, mais elles cessent d'exister ou n'existent que si le prix du sous-jacent franchit une barrière prédéterminée. Ce niveau de barrière peut avoir un seuil de déclenchement continu ou discret $\tau$.
Pour une option _barrière_ du type *Up-and-out*, nous avons :
\[
C_{T}=f(S_{T})=(K-S_{T})^{+}\times\mathbb{I}_{\left\{ \max\limits _{t\in\tau}S_{t}<H\right\} }
\]
Pour autant que, pour tout $m\in M$,
* Si $t\in\tau$ et $S_t\geq H$, alors $C_T = 0$
* Sinon $t\notin\tau$ et $S_t < H$, alors $C_T = \max (0,\quad K-S_T)$
```{r Données de base, echo=TRUE, message=FALSE, warning=FALSE, paged.print=FALSE}
S0 = 100 # initial stock price
K = 100 # strike price
T = 1 # time to maturity in years
H = 125 # up-and-out barrier price/value
r = 0.01 # annual risk-free rate
vol = 0.2 # volatility (%)
N = 100 # number of time steps
M = 1000 # number of simulations
```
## Simulation
Ici, nous simulons le prix de l'action $S_t$ directement, car nous avons besoin de cette valeur lors du calcul pour la comparer à la barrière $H$.
```{r Simulation lente, echo=TRUE, message=FALSE, warning=FALSE, paged.print=TRUE}
#------------------------#
# Slow Solution - Steps #
#------------------------#
# Initialize variables
dt <- T/N
nudt <- (r - 0.5 * vol^2) * dt
volsdt <- vol * sqrt(dt)
erdt <- exp(r * dt)
# Standard Error Placeholders
sum_CT <- 0
sum_CT2 <- 0
# Monte Carlo Method
for (i in 1:M) {
# Barrier Crossed Flag
BARRIER <- FALSE
St <- S0
for (j in 1:N) {
epsilon <- rnorm(1)
Stn <- St * exp(nudt + volsdt * epsilon)
St <- Stn
if (St >= H) {
BARRIER <- TRUE
break
}
}
if (BARRIER) {
CT <- 0
} else {
CT <- max(0, K - St)
}
sum_CT <- sum_CT + CT
sum_CT2 <- sum_CT2 + CT^2
}
# Compute Expectation and SE
C0 <- exp(-r * T) * sum_CT/M
sigma <- sqrt((sum_CT2 - sum_CT^2/M) * exp(-2 * r * T) / (M - 1))
SE <- sigma / sqrt(M)
cat("Call value is $", round(C0, 2), " with SE +/- ", round(SE, 3), "\n")
```
## Vectorisation (Méthode Longue)
```{r Simulation Vectorisée, echo=TRUE, message=FALSE, warning=FALSE, paged.print=TRUE}
#-----------------------------#
# Vectorized Implementation #
#-----------------------------#
# Set seed for reproducibility
set.seed(689)
# Precompute constants
dt <- T/N
nudt <- (r - 0.5 * vol^2) * dt
volsdt <- vol * sqrt(dt)
erdt <- exp(r * dt)
# Monte Carlo Method
Z <- matrix(rnorm(N * M), nrow = N, ncol = M)
delta_St <- nudt + volsdt * Z
ST <- matrix(S0, nrow = N + 1, ncol = M)
for (i in 2:(N + 1)) {
ST[i,] <- ST[i - 1,] * exp(delta_St[i - 1,])
}
# Apply Barrier Condition to ST matrix
mask <- apply(ST, 2, function(x) any(x >= H))
ST[, mask] <- 0
CT <- pmax(0, K - ST[N + 1, ST[N + 1,] != 0])
C0 <- exp(-r * T) * sum(CT) / M
sigma <- sqrt(sum((exp(-r * T) * CT - C0)^2) / (M - 1))
SE <- sigma / sqrt(M)
cat("Call value is $", round(C0, 2), " with SE +/- ", round(SE, 3), "\n")
```