Budeme riešiť Black-Scholesovu parciálnu diferenciálnu rovnicu numericky pomocou explicitnej metódy. Máme k tomu dva dôvody: - nie pre každý payoff sa dá Black-Sholesova rovnica riešiť explicite, - potrebujeme začať budovať aparát na numerické oceňovanie amerických opcií.
Budeme sa zaoberať prípadom, v ktorom podkladové aktívum nevypláca dividendy. Rovnica \[ \frac{\partial V}{\partial t} + \frac{1}{2}\sigma^2 S^2 \frac{\partial^2 V}{\partial S^2} + rS\frac{\partial V}{\partial S} - rV = 0 \] platí pre \(S \in (0, \infty)\), a \(t \in [0, T]\) a má koncovú podmienku \(V(S, T) = payoff(S)\).
Namiesto rovnice pre \(V\) budeme riešiť transformovanú rovnicu pre funkciu \(Z(x, \tau)\), pričom \(Z(x, \tau) = V(S, t)\), kde \(x = \ln(S/E)\) a \(\tau = T - t\). V pôvodnej rovnici \(S \in (0, \infty)\). Po transformácii bude \(x \in (-\infty, \infty)\). Premennú \(x\) budeme nazývať priestorová premenná a premennú \(\tau\) zas časová premenná.
Dokončite túto transformáciu (štátnicová otázka): \[ \begin{align*} \frac{\partial V}{\partial t} &= \frac{\partial Z}{\partial \tau} \frac{\partial \tau}{\partial t} \\ &=- \frac{\partial Z}{\partial \tau} \\ & \\ \frac{\partial V}{\partial S} &= \frac{\partial Z}{\partial x} \frac{\partial x}{\partial S} \\ &= \frac{\partial Z}{\partial x} \frac{1}{S} \\ & \\ \frac{\partial^2 V}{\partial S^2} &= \frac{\partial}{\partial S} \left(\frac{\partial V}{\partial S} \right) \\ &= \frac{\partial}{\partial S} \left( \frac{\partial Z}{\partial x} \frac{1}{S} \right) \\ &= \dots \end{align*} \]
Transformovanú rovnicu môžeme po prenásobení \(\exp(-\alpha x - \beta \tau)\) previesť na rovnicu vedenia tepla. \(V(S, t) = \exp(-\alpha x - \beta \tau) u(x, \tau)\), kde \(\alpha = \frac{r}{\sigma^2} - \frac12\), \(\beta = \frac{r}{2} + \frac{\sigma^2}{8} + \frac{r^2}{2\sigma^2}\). Funkcia \(u\) potom spĺňa: \[ \frac{\partial u}{\partial \tau} - \frac{\sigma^2}{2} \frac{\partial^2 u}{\partial x^2} = 0 \]
Rozmyslite si tvar počiatočnej podmienky \(u(x,0) = u_0(x)\). Návod: \(u(x, \tau) = \exp(\alpha x + \beta \tau) V(S, t)\), kde \(S = E e^x\) a \(t = T - \tau\).
Namiesto hodnôt funkcie \(u\) pre všetky (spojité) hodnoty \(x\) budeme funkciu \(u\) počítať iba v bodoch \(\ldots, -2, -h, 0, h, 2h, \ldots\). Podobne budeme uvažovať iba časové body \(\tau = 0, k, 2k, 3k, \ldots\).
Namiesto parciálnej derivácie podľa času použijeme doprednú diferenciu: \[ \frac{\partial u}{\partial \tau} \approx \frac{u(x, \tau + k) - u(x, \tau)}{k} \] Všimnime si, že v limite pre \(k \to 0^+\) je pravá strana definíciou parciálnej derivácie.
Namiesto druhej parcálnej derivácie podľa priestorovej premennej použijeme diferenciu \[ \frac{\partial^2 u}{\partial x^2} \approx \frac{u(x - h, \tau) - 2 u(x, \tau) + u(x + h, \tau)}{h^2} \] Na skúške z matematickej analýzy (1) sa vyskytol príklad, v ktorom bolo treba ukázať, že v limite \(h\to 0^+\) pravá strana konverguje ku druhej derivácii.
Dokopy teda máme približnú rovnosť: \[ \frac{u(x, \tau + k) - u(x, \tau)}{k} - \frac{\sigma^2}{2}\frac{u(x - h, \tau) - 2 u(x, \tau) + u(x + h, \tau)}{h^2} \approx 0, \] resp. \[ u(x, \tau + k) \approx u(x, \tau) + \frac{k \sigma^2}{2}\frac{u(x - h, \tau) - 2 u(x, \tau) + u(x + h, \tau)}{h^2}. \]
Veľkosti krokov musia spĺňať tzv. Courant–Friedrichs–Lewyho podmienku: \[ k < \frac{h^2}{\sigma^2}. \] Ak by táto podmienka nebola splnená, metóda nebude stabilná. Viac o tejto podmienke sa dozviete na predmete Numerické modelovanie.
Numericky však nevieme riešiť pre \(x \in (-\infty, \infty)\). Namiesto toho budeme riešiť na dostatočne dlhom symetrickom intervale \(x \in [-L, L]\), t.j. v bodoch \(x= -L, -L+h, \ldots, -h, 0, h, 2h, \ldots, L-h, L\).
V reči pôvodných premenných \(S\) a \(E\) to znamená, že rovnicu riešime na oblasti: \[ \ln(S/E) \in [-L, L] \\ S \in [E \cdot e^{-L}; E \cdot e^L] \] Ak napríklad \(L = 2\), tak \[ S \in [0,\!135 E;\ 7,\!389E] \]
Pre hodnoty \(x = \pm L\) musíme ešte doplniť okrajové podmienky. Nazveme ich \(u(-L, \tau) = \phi(\tau)\) pre \(x=-L\) a \(u(L, \tau) = \psi(\tau)\) pre \(x=L\). Odvodíme ich tvar:
Pomocou asymptotickej aproximácie \(N(x)\) pre \(x \to -\infty\) ukážte že lepší odhad ceny call opcie pre malé hodnoty \(S\) je: \[ Call(S) \overset{S \to 0^+}{\sim} \frac{2 \sqrt{2} S \sigma^{3} \tau^{\frac{3}{2}} \exp\left({- \frac{r^{2} \tau}{2 \sigma^{2}} - \frac{r \tau}{2} - \frac{r \ln{\left(\frac{S}{E} \right)}}{\sigma^{2}} - \frac{\sigma^{2} \tau}{8} - \frac{\ln{\left(\frac{S}{E} \right)}^{2}}{2 \sigma^{2} \tau}}\right)}{\sqrt{\pi} \sqrt{\frac{S}{E}} \left(4 r^{2} \tau^{2} + 8 r \tau \ln{\left(\frac{S}{E} \right)} - \sigma^{4} \tau^{2} + 4 \ln{\left(\frac{S}{E} \right)}^{2}\right)}, \]
Oceňte európsku call opciu s exspiračnou cenou \(E=50\), ktorá exspiruje o rok. Podkladové aktívum má volatilitu \(\sigma = 40\%\) a bezriziková úroková miera je \(r = 4\%\).
Pri výpočte sa oplatí predrátať konštantu \(\frac{k \sigma^2}{2h^2}\).
E <- 50
r <- 0.04
sigma <- 0.4
# Priestorové delenie
L <- 2
n <- 20
h <- L/n
# Časové delenie
tau_max <- 1
m <- 52
k <- tau_max/m
# pomocné konštanty
alpha <- r/(sigma^2) - 0.5
beta <- r/2 + sigma^2 / 8 + r^2/(2*sigma^2)
# Priestorová a časová diskretizácia
xx <- seq(-L, L, by=h)
tt <- seq(0, tau_max, by=k)
# Okrajové podmienky
phi <- function(tau) 0# TODO
psi <- function(tau) 0# TODO
# Počiatočná podmienka
u0 <- function(x) 0# TODO
# Matica riešení
u <- matrix(0, nrow=2*n + 1, ncol=m+1)
# Okrajové a počiatočné podmienky
u[1, ] <- phi(tt)
u[2*n +1, ] <- psi(tt)
u[, 1] <- u0(xx)
# sol:
# x = -L # # # # # # # #
#
# x = 0 # # # # # # # #
#
# X = +L # # # # # # # #
# ^ ^
# tau=0 tau=tau_max
k <= h^2/(sigma^2) # Podmienka stability
## [1] TRUE
gamma <- k*sigma^2/(2*h^2) # Predrátaná konštanta
for (j in 2:(m+1)) {
for (i in 2:(2*n)) {
u[i, j] <- 0 # TODO
}
}
Transformujte získané riešenie späť do premenných \(S\), \(t\). Vykreslite získané riešenie.
# TODO
Porovnajte získané numerické riešenie s riešením získaným pomocou vzorca.
CallValue <- function(S, E, r, sigma, tau) {
d1 <- (log(S/E) + (r + 0.5*sigma^2)*tau)/(sigma * sqrt(tau))
d2 <- (log(S/E) + (r - 0.5*sigma^2)*tau)/(sigma * sqrt(tau))
return(S*pnorm(d1) - E*exp(-r*tau)*pnorm(d2))
}
# TODO
Vykreslite graf, ktorý bude mať na vodorovnej osi \(S\) a na zvislej osi rozdiel \(V_{numeric} - V_{analytic}\).
#TODO
Namiesto transformácie \(x := \ln(S/E)\) sme mohli použiť transformáciu \(x := \ln(S)\). Podrobne popíšte čo všetko by sa zmenilo v implementácii.
Naprogramujte funkciu, ktorá numericky ocení európsku put
opciu, ak akcia vypláca dividendy. Signatúra funkcie nech má tvar:
PutValueNumeric <- function(S, E, r, sigma, tau, q=0)
Funkcia musí zbehnúť aj ak je argument S vektor. Možno bude
potrebné použiť interpoláciu.
Zvoľte vhodné parametre delenia \(m\), \(n\) tak aby metóda bola stabilná a dostatočne presná.
Pomôžte si prednáškou
V kóde sme čas do exspirácie nazvali tau_max namiesto
(na prvý pohľad jednoduchšieho) označenia T. Vysvetlite
prečo nie je vhodné nazvať premennú s časom do exspirácie (ani žiadnu
inú premennú či funkciu) ako T.
Odvoďte iteračnú schému, ak sa použije krok \(h = \sigma \sqrt k\). Vysvetlite ako táto voľba kroku zjednoduší výpočet.
Implementujte funkciu
CallValueNumeric(S, E, r, sigma, tau) pre výpočet ceny
call opcie, ak je dnešná cena podkladového aktíva
S. Stačí ak výpočet zbehne pre skalárnu hodnotu
S (teda nie vektor).
Skúste zvoliť také veľkosti krokov, že:
Vykreslite grafy cien opcií, ktoré vzniknú takýmito metódami.
Bonusové úlohy odovzdajte do 6 dní mailom s predmetom FD24 – nick, kde nick je vami zvolená prezývka skupiny.