---
title: "Cvičenie 3"
author: "Finančné deriváty"
#date: "22. 4. 2021"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

# 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}
$$

```{r}
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.

```{r}
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.


```{r uloha_3}
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$ 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).


```{r}
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$?

```{r uloha_4}
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:

```{r}
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:
```{r}
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:
```{r}
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:

```{r}
# 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.