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:

(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:

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

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

Úloha: projektovaná Gauss-Seidelova metóda

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.

ProjectedGaussSeidelTridiagonal <- function(d, m, 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
  #   d's on diagonal and m's on sub- and superdiagonals.
  
  n <- length(rhs)
  d_ = 1/d
  
  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\%\).

Pre overenie: ak akcia nevypláca dividendy, cena by mala vyjsť rovnaká ako cena európskej opcie.

Úloha: numerická schéma

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)
gamma <- sigma^2 * k / (2 * h^2)

a <- 1 + 2*gamma  # členy na diagonále
b <- -gamma  # členy na vedľajších diagonálach

# 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
  rhs <- 0 # FIXME
  # SorTridiagonal(a, b, rhs, x0 = NA, maxiter = 1) # FIXME
}

Úloha: 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.

# TODO

Úloha: porovnanie s analytickým riešením

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

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

Solvery pre oceňovanie amerických opcií

Vo všeobecnom prípade neexistuje explicitný vzorec pre nájdenie ceny americkej opcie.

RQuantLib

RQUantLib je štandardnou knižnicou pre kvantitatívne financie v jazyku R. Pomocou funkcie AmericanOption viete numericky oceniť americkú call alebo put opciu. Všetko potrebné sa dočítate v nápovede.

require("RQuantLib")
## Loading required package: RQuantLib
## Warning: package 'RQuantLib' was built under R version 4.1.3
help(AmericanOption)
## starting httpd help server ...
##  done

Ak nešpecifikujeme metódu, použije sa aproximácia Baron-Adesiho a Whaleyho:

AmericanOption("call", underlying = 70, strike = 50, dividendYield = 0,
               riskFreeRate = 0.05, maturity = 1, volatility = 0.2)
## Concise summary of valuation for AmericanOption 
##   value   delta   gamma    vega   theta     rho  divRho 
## 22.5553      NA      NA      NA      NA      NA      NA

Možno však použiť aj Crank-Nicolsonovu numerickú schému engine = "CrankNicolson". Dá sa zvoliť jemnosť delenia priestorovej premennej gridPoints aj časovej premennej timeSteps:

AmericanOption("call", underlying = 70, strike = 50, dividendYield = 0,
               riskFreeRate = 0.05, maturity = 1, volatility = 0.2,
               engine = "CrankNicolson", gridPoints = 1001, timeSteps = 1001)
## Concise summary of valuation for AmericanOption 
##   value   delta   gamma    vega   theta     rho  divRho 
## 22.5555  0.9790  0.0036      NA      NA      NA      NA

Použijúc veľmi veľké hodnoty gridPoints a timeSteps, môžete výsledok považovať za presnú cenu americkej opcie.

Wolfram Mathematica a WoflramAlpha

WolframAlpha dokáže okrem integrálov a derivácií vypočítať aj cenu americkej opcie, napríklad nasledujúcim príkazom:

FinancialDerivative[{"American", "Call"}, {"StrikePrice"->50, "Expiration"->1}, {"InterestRate"->0.05, "Volatility"->0.2, "CurrentPrice"->70, "Dividend"->0.01}, "GridSize"->{5000, 5000}]

Opäť môžete použiť dostatočne jemné delenie GridSize a takto získané ceny môžete považovať za presné.

Domáca úloha (10b)

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:

Bonus za rýchlosť (max. 6b)

6 bonusových bodov sa rozdelí medzi skupinky ktoré splnili zadanie domácej úlohy v pomere, v akom sú prevrátené hodnoty času potrebného 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 2 centy. 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é.

Bonus: Americký put je drahší ako európsky (3b)

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á.

Bonus: Opcia s bariérou (5b)

Naprogramujte funkciu, ktorá ocení opciu ktorá:

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