Black-Scholesov model

Úloha 1: Ocenenie call opcie

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))
}

Úloha 2: Rôzne časy do exspirácie

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.

Úloha 3: Ocenenie put opcie

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=)

Úloha 4: Ocenenie chooser opcie

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.

Riešenie (začiatok)

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\)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
}

Bonus: chooser a dividendy

Odvoďte a implementujte ocenenie chooser opcie na podkladové aktíum, ktoré vypláca dividendy.

Úloha 5: Implikovaná volatilita

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
}

Úloha 6: Dividendy

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?

Bonus: R-ko a dve funkcie

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)?

Odovzdanie bonusov

Bonusové úlohy odovzdajte do 6 dní mailom s predmetom FD24 – nick, kde nick je vami zvolená prezývka skupiny.