---
title: "Cvičenie 7"
author: "Ján Gašper"
date: "03. 04. 2023"
output: html_document
---

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

Teraz sme pripravení na numerické oceňovanie amerických opcií. Postup bude rovnaký ako pri oceňovaní európskych opcií, ale musíme garantovať, že cena neklesne pod payoff – ináč by nastala arbitráž.


# Opakovanie

Predpokladajme, že úroková miera je kladná. Potom:

- Ak akcia nevypláca dividendy, cena európskej *call* opcie leží nad payoffom.
- Ak akcia vypláca dividendy, cena európskej *call* opcie pretne payoff.
- Cena európskej *put* opcie pretne payoff bez ohľadu na dividendy.

(Vedeli by ste tieto tvrdenia dokázať?)

Preto vieme, že cena americkej *call* opcie bez dividend je rovnaká ako cena príslušnej európskej opcie. V ostatných prípadoch je cena americkej opcie iná ako cena príslušnej európskej opcie. a americkú opciu cenu musíme oceniť numericky.

Postup oceňovania bude podobný ako pri európskej opcii:

- Black-Scholesovu rovnicu transformujeme na rovnicu vedenia tepla.
- Vypočítame transformovaný payoff $g(x, \tau)$.
- Vypočítame okrajové podmienky. Zabezpečíme aby boli nad transformovaným payoffom a dosadíme do matice riešenia.
- Vypočítame okrajovú podmienku $g(x, \tau=0)$ a dosadíme do matice riešenia.
- Iterujeme po jednotlivých časových vrstvách pomocou projektovanej metódy (PGS, alebo PSOR). Zvolíme si vhodný počiatočný odhad riešenia, 


## Projektovaná Gauss-Seidelova metóda pre trojdigonálnu maticu

Riešme sústavu komplementárnych lineárnych nerovníc:
$$
\begin{align*}
  (Ax - rhs) \odot (x-g) &= 0\\
  Ax &\geq rhs\\
  x &\geq g\\
\end{align*}
$$
kde $A$ je symetrická trojdiagonálna matica:
$$
  A =   \left[\begin{matrix}
  a & b \\
  b & a & b\\
  & b & a & b\\
  && \ddots & \ddots & \ddots\\
  &&& b & a & b\\
  &&& & b & a\\
  \end{matrix}\right ]
$$



## Úloha

Odvoďte predpis jednej iterácie projektovanej Gauss-Seidelovej metódy.

Opravte nasledujúcu funkciu tak, aby riešila sústavu komplementárnych lineárnych nerovníc.

```{r}
ProjectedGaussSeidelTridiagonal <- function(a, b, rhs, g, x0 = NA, maxiter = 100) {
  # Solve:
  # A %*% x >= rhs
  # x >= g
  # (A %*% x - rhs) * (x -g) = 0
  # where A is symmetric tridiagonal matrix with
  #   a's on diagonal and b's on sub- and superdiagonals.
  
  n <- length(rhs)
  a_ = 1/a
  
  if(any(is.na(x0))) {
    x0 <- rep(0, n)
  }
  
  x_k <- x0
  
  for (k in 1:maxiter) {
    x_k[1] <- 0 # FIXME
    for (j in 2:(n-1)) {
      x_k[j] <- 0 #FIXME
    }
    x_k[n] <- 0 # FIXME
  }
  
  return(xk)
}
```



# Ocenenie americkej *call* opcie

Oceňte americkú *call* opciu s exspiračnou cenou $S=50$, ak má podkladové aktívum volatilitu $\sigma = 40\%$. Bezriziková úroková miera je $r = 4\%$.

Ak akcia nevypláca dividendy, cena by mala vyjsť rovnaká ako cena európskej opcie.

```{r}
E <- 50
r <- 0.04
sigma <- 0.4
q <- 0

# Priestorové delenie
L <- 2
n <- 20   # jemnosť delenia
h <- L/n  # veľkosť kroku

# Časové delenie
tau_max <- 1
m <- 12 # jemnosť delenia
k <- tau_max / m # veľkosť kroku

# Počet iterácii G-S metódy
N <- 100

# Pomocné konštanty
alpha <- (r-q)/(sigma^2) - 0.5
beta  <- (r+q)/2 + sigma^2 / 8 + (r-q)^2/(2*sigma^2)

a <-  -0.5*(sigma^2)*k/(h^2)  # na prednáške -gamma, t.j. člen na vedľajších diagonálach
b <-  1 - 2*a  # na prednáške 1 + 2*gamma, t.j. člen na diagonále

# Diskretizácia času a priestoru
xx <- seq(-L, L, by=h)
tt <- seq(0, tau_max, k)

# Transformovaný payoff
g <- function(x, tau) E*exp(alpha*x + beta*tau) * pmax(0, exp(x)-1)

# Okrajové podmienky
phi <- function(tau) 0 
psi <- function(tau) E*exp(alpha*L + beta*tau)*(exp(L - q*tau) - exp(-r*tau)) # FIXME


# Počiatočná podmienka
u0 <- function(x) E*exp(alpha*x)*pmax(0, exp(x)-1)

# Matica riešení
sol <- matrix(0, nrow=2*n + 1, ncol=m+1)

# Okrajové a počiatočné podmienky
sol[1, ] <- phi(tt)
sol[2*n +1, ] <- psi(tt)
sol[, 1] <- u0(xx)


for (i in 2:(m+1)) { # Ideme naplniť i-ty stĺpec
  # TODO
}

```


## Spätná transformácia

Získané riešenie transformujte naspäť do premenných $S, t$. Vykreslite získané riešenie. Skontrolujte či cena neklesla pod payoff.
```{r}
# TODO
```



## Porovnanie s analytickým riešením

Ak $q=0$, môžeme porovnať výsledok s cenou zistenou analyticky.

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

# TODO
```



# Domáca úloha (10b)

Vypracovanú úlohu odovzdajte do stredy 05. 04. 2023

Naprogramujte funkciu, ktorá numericky ocení americkú *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. Pre nájdenie ceny podľa vstupu bude nutné použiť interpoláciu.

Vyskúšajte vašu funkciu na vstupoch:
```
s <- (10:20) * 5
e <- 70
q <- 0.01
r <- 0.05
sigma <- 0.2
tau <- 0.5
```
Ceny by mali vyjsť:

| S   |  V    |
|:---:|:-----:|
| 50  | 20,00 |
| 55  | 15,00 |
| 60  | 10,09 |
| 65  | 6,13  |
| 70  | 3,37  |
| 75  | 1,67  |
| 80  | 0,75  |
| 85  | 0,31  |
| 90  | 0,12  |
| 95  | 0,04  |
| 100 | 0,01  |


Podrobnosti:

- Musíte zabezpečiť aby cena neklesla pod payoff, ináč bude úloha hodnotená 0 bodmi.
- Vaša metóda musí vrátiť výsledok s presnosťou aspoň na 2 desatinné miesta (t.j. s presnosťou na centy). Zvoľte vhodné parametre delenia $m$, $n$ tak aby bola metóda dostatočne presná.



## Bonus za rýchlosť (max. 12b)

12 bonusových bodov sa rozdelí medzi všetky skupinky ktoré splnili zadanie domácej úlohy v pomere, v akom sú časy potrebné na zbehnutie odovzdanej funkcie pre parametre
```
s <- 10:100;
e <- 70;
q <- 0.01;
r <- 0.05;
sigma <- 0.4;
tau <- 1
```. Uznané budú iba riešenia s ktoré sa od správnej ceny nelíšia o viac ako 5 centov. Môžete použiť rozličné metódy urýchlenia vašej funkcie, napríklad PSOR metódu, podmienku na predčasné zastavenie pri riešení lineárnej sústavy, Crank-Nicolsonovu schému alebo iné.



# Bonusová domáca úloha (2b)

Dokážte, že cena americkej *put* opcie v Black-Scholesovom modeli je ostro väčšia ako cena opcie európskeho typu. Predpokladajme že akcia nevypláca dividendy a úroková miera je kladná.

- Dokážte že pre európsku *put* opciu existuje také $S_0(t)$, že $V_{eur}(S_0(t), t) = E - S_0(t)$, t.j. v každom čase $t$ existuje taká cena $S_0(t)$, že cena *put* opcie je rovná payoff-u.
- Dokážte že pre americkú *put* opciu voľná hranica $S_f(t)$ spĺňa $S_f(t) < S_0(t)$. Pomôžte si deltou a gamou opcie.
- Dokážte že ak by bola cena podkladového aktíva $S_0$, tak cena americkej opcie by bola ostro väčšia ako payoff.
- Na intervale $(S_0, \infty)$ platí Black-Scholesova rovnica aj pre európsku, aj pre americkú opciu. Na hranici $S = S_0$ ale platí: $V_{am}(S_0(t), t) > V_{eur}(S_0(t), t)$. Na základe toho ukážte, že cena americkej *put* opcie je na tomto intervale ostro väčšia ako cena príslušnej európskej opcie.



# Bonusová domáca úloha (5b)

Naprogramujte funkciu, ktorá ocení opciu ktorá:

- Prepadne (vyplatí nulu), ak medzi kúpou opcie a okamihom exspirácie presiahne cena podkladového aktíva hodnotu $E_2$
- Ináč v čase exspirácie dáva právo kúpiť akciu za cenu $E_1$, t.j. vyplatí $\max\{S-E_1, 0\}$.

Transformujte úlohu o ocenení tejto opcie na komplementárnu sústavu lineárnych nerovníc a vyriešte ju. 


