Ak akcia nevypláca dividendy, môžeme podľa Black-Scholesovho modelu oceniť call opciu pomocou vzťahu \[ S \cdot \Phi(d_1) - E e^{-r \tau}\cdot\Phi(d_2), \] kde \[ d_{1,2} = \frac{\ln\left(\frac S E\right) + \left(r \pm \frac{\sigma^2}{2}\right)\cdot\tau}{\sigma \sqrt \tau} \]
CallPayoff <- function(S, E) {
return(pmax(S - E, 0))
}
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))
}
Nakreslite graf, ktorý má na zvislej osi cenu akcie a zobrazuje ceny call opcie pre niekoľko rôznych časov do exspirácie.
S <- seq(40, 160, length.out = 1001)
E <- 100
sigma <- 0.3
r <- 0.005
taus <- c(1/12, 1/4, 1/2, 1, 2, 5)
# Vykreslíme aj payoff
plot(S, CallPayoff(S, E), "l", lwd = 2,
main = "Porovnanie ceny call opcie pre rôzne časy do exspirácie",
xlab = "Cena podkladového aktíva",
ylab = "Cena opcie")
for (tau in taus) {
# TODO
}
Zdôvodnite prečo by sme mali intuitívne očakávať takýto výsledok.
Napíšte funkciu, ktorá počíta Black-Scholesovu cenu put opcie pomocou put-call parity. \[ Call - Put = S - E e^{-r\tau}, \] teda \[ Put = Call + E e^{-r\tau} - S \] Vypočítajte cenu put opcie s exspiračnou cenou 105 USD a exspiráciou o pol roka, ak je aktuálna cena opcie 100 USD a jej volatilita je 0,3. Úroková miera je znovu 0,5 percenta.
PutValue <- function(S,E,r,sigma,tau){
# TODO
}
# TODO Put(S=, E=, r=, sigma=, tau=)
Jednou z exotických opcií je aj chooser. Táto opcia má payoff buď ako call opcia, alebo put opcia s exspiračnou cenou \(E\). O tom ktorý payoff sa uplatní, rozhodne držiteľ opcie v čase \(T_c\). Nájdite replikačné portfólio k tejto opcii a napíšte funkciu, ktorá nájde jej cenu.
Označme si: - \(S_t\) – cena akcie v čase \(t\), - \(E\) – exspiračná cena chooser opcie, - \(r\) – bezriziková úroková miera, - \(\sigma\) – volatilita akcie, - \(T_c\) – čas v ktorom sa vyberie či bude opcia typu put alebo call, - \(T_e\) – čas exspirácie. - \(\Delta t\) – dĺžka časového intervalu medzi \(T_c\) a \(T_e\), resp. \(T_e - T_c\).
\(Call(E, T)\) nech znamená cenu call opcie s exspiračnou cenou \(E\) ktorá exspiruje v čase \(T\), ak je dnešná hodnota podkladového aktíva rovná \(S\). Podobne budeme značiť \(Put\).
V čase \(T_c\) si držiteľ vyberie tú opciu, ktorá má pri aktuálnej cene podkladového aktíva vyššiu hodnotu. Teda v čase \(T_c\) má chooser opcia hodnotu \(Chooser = \max\{Put(S_{T_c}, E, T_e), Call(S_{T_c}, E, T_e)\}\).
Použijeme put-call paritu na put a dostaneme: \[ Chooser = \max\{Call(E, T_e) + E e^{-r \Delta t} - S, Call(E, T_e)\} \]
Využijeme vlastnosť maxima, že \(\max\{a+b, a\} = a + \max\{b, 0\}\), kde \(a = Call(E, T_e)\): \[ Chooser = Call(E, T_e) + \max\{E e^{-r \Delta t} - S, 0\} \]
Druhý člen, \(\max\{E e^{-r \Delta t} - S, 0\}\) je vlastne cena put opcie, ktorá práve exspiruje práve teraz a má exspiračnú cenu \(E e^{-r \Delta t}\): \[ Chooser = Call(E, T_e) + Put(E e^{-r \Delta t}, T_c) \]
Našli sme teda portfólio, ktoré má v časovom okamihu \(T_c\) rovnakú hodnotu ako chooser opcia. Podľa princípu no aribitrage teda musí mať chooser opcia rovnakú hodnotu v každom okamihu (rozmyslite si).
ChooserValue <- function(S, E, r, sigma, T_e, T_c){
# TODO
}
Odvoďte a implementujte ocenenie chooser opcie na podkladové aktíum, ktoré vypláca dividendy.
Implementuje výpočet implikovanej volatility call opcie na akciu, ktorá nevypláca dividendy. Tento výpočet budeme potrebovať pri nelineárnom Lelandovom modeli, ktorý berie do úvahy transakčné náklady.
V R-ku využite funkciu hľadania koreňov uniroot
. Jej
signatúru si môžete pozrieť v nápovede.
Použite túto funkciu na riešenie z úlohy 1. Vyšla volatilita \(0,\!3\)?
ImpliedVolatility <- function(S, E, r, tau, V_real) {
# TODO
}
Predpokladajme, že akcia vypláca dividendy so spojitou dividendovou mierou \(q\). Naprogramujte funkciu, ktorá vypočíta hodnotu call opcie:
CallValue <- function(S, E, r, sigma, tau, q = 0){
# TODO
}
Put-call parita má pri dividendách tvar: \[ Call - Put = Se^{-q \tau} - Ee^{-r\tau} \]
Naprogramujte funkciu, ktorá ocení put opciu na podkladové aktívum, ktoré vypláca dividendy:
PutValue <- function(S, E, r, sigma, tau, q = 0){
# TODO
}
Porovnajte ceny opcie v prípade že podkladové aktívum nevypláca dividendy a v prípade že ich vypláca:
S <- seq(40, 160, length.out = 1001)
E <- 100
r <- 0.005
sigma <- 0.3
tau <- 1
# Vykreslíme payoff pre lepšiu orientáciu
plot(S, CallPayoff(S, E), "l", lwd = 2,
main = "Porovnanie ceny call opcie s dividendami a bez nich",
xlab = "Cena podkladového aktíva",
ylab = "Cena opcie")
lines(S, CallValue(S, E, r, sigma, tau),
lwd = 2, col = rgb(.7, .3, .3, .7))
lines(S, CallValue(S, E, r, sigma, tau, q = 0.1),
lwd = 2, col = rgb(.3, .7, .3, .7))
legend("topleft", col = c(rgb(.7, .3, .3, .7), rgb(.3, .7, .3, .7)),
lwd = 2, legend = c("Bez dividend", "S dividendami"))
Urobte podobný obrázok pre put opcie:
# TODO
Aký vplyv majú dividendy na graf hodnoty opcie?
Na tejto hodine sme implementovali dve funkcie na ocenenie
Call opcie. Jedna mala signatúru
CallValue(S, E, r, sigma, tau)
a druhá
CallValue(S, E, r, sigma, tau, q = 0)
. Ktorá z týchto
funkcií sa zavolá príkazom
CallValue(50, 50, 0.05, 0.25, 1/12)
?
Bonusové úlohy odovzdajte do 6 dní mailom s predmetom FD24 – nick, kde nick je vami zvolená prezývka skupiny.