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áž.
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:
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 ] \]
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)
}
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.
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
}
Získané riešenie transformujte naspäť do premenných \(S, t\). Vykreslite získané riešenie. Skontrolujte či cena neklesla pod payoff.
# TODO
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
Vo všeobecnom prípade neexistuje explicitný vzorec pre nájdenie ceny americkej opcie.
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.
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é.
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:
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é.
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á.
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.