---
title: "Cvičenie 3"
author: "Ján Gašper"
date: "27. 02. 2023"
output: html_document
---

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

# Black-Scholesov model

## Úloha 1: Ocenenie *call* opcie

Podľa Black-Scholesovho modelu môžeme 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}
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))
}
```

Vypočítajte cenu európskej *call* opcie s exspiráciou o rok, ak jej
exspiračná cena je 50 USD, súčasná cena akcie je 41 USD a jej volatilita
je 0.3. Úroková miera je 0.5 percenta.

```{r}
s <- 41
e <- 50
r <- 0.005
sigma <- 0.3
tau <- 1

# TODO
```


## Ú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, pmax(s - e, 0), "l", lwd = 2,
     main = "Porovnanie ceny call opcie pre rôzne časy do exspirácie",
     xlab = "Cena podkladového aktíva",
     ylab = "Cena opcie")

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

```{r}
PutValue <- function(s, e, r, sigma, tau){
  # TODO
}
```

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}
# TODO
```


## Ú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. 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.

```{r}
ChooserValue <- function(s, e, r, sigma, tau, tc){
  # TODO
}
```


```{r}
s <- seq(40, 160, length.out = 1001)
e <- 100
r <- 0.005
sigma <- 0.3
tau <- 1
```


## Ú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.

```{r}
ImpliedVolatility <- function(s, e, r, tau, real_value, ModelValue=CallValue){
  # TODO
}
```

Použite túto funkciu na riešenie z úlohy 1. Vyšla volatilita $0,\!3$?


## Ú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, pmax(s - e, 0), "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
```


