optionValues: Values of Options over Finite Moment Log Stable Distributions In FMStable: Finite Moment Stable Distributions

Description

Computes values of European-style call and put options over assets whose future price is expected to follow a finite moment log stable distribution.

Usage

 ```1 2 3``` ```putFMstable(strike, paramObj, rel.tol=1.e-10) callFMstable(strike, paramObj, rel.tol=1.e-10) optionsFMstable(strike, paramObj, rel.tol=1.e-10) ```

Arguments

 `strike` The strike price for an option. `paramObj` An object of class `stableParameters` which describes a maximally skew stable distribution. This is the distribution which describes possible prices for the underlying security at the time of expiry. `rel.tol` The relative tolerance used for numerical integration for finding option values.

Value

`optionsFMstable` returns a list containing the values of put options and the values of call options.

Note

When comparing option values based on finite moment log stable distributions with ones based on log normal distributions, remember that the interest rate and holding cost have been ignored here.

Rather than using functions `putFMstable` and `callFMstable` for options that are extremely in-the-money (i.e. the options are almost certain to be exercised), the values of such options can be computed more accurately by first computing the value of the out-of-the-money option and then using the relationship `spot` + `put` = `call` + `strike`. This is done by function `optionsFMstable`.

An example of how an object of class `stableParameters` may be created is by `setParam`. Procedures for dealing with the log normal model for options pricing include `BSOptionValue`.
 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76``` ```paramObj <- setMomentsFMstable(mean=10, sd=1.5, alpha=1.8) putFMstable(c(10,7), paramObj) callFMstable(c(10,7), paramObj) optionsFMstable(8:12, paramObj) # Note that call - put = mean - strike # Values of some extreme put options paramObj <- setMomentsFMstable(mean=1, sd=1.5, alpha=0.02) putFMstable(1.e-200, paramObj) putFMstable(1.e-100, paramObj) pFMstable(1.e-100, paramObj) putFMstable(1.e-50, paramObj) # Asymptotic behaviour logmlogx <- seq(from=2, to=6, length=30) logx <- -exp(logmlogx) x <- exp(logx) plot(logmlogx , putFMstable(x, paramObj)/(x*pFMstable(x, paramObj)), type="l") # Work out the values of some options using FMstable model spot <- 20 strikes <- c(15,18:20, 20:24, 18:20, 20:23) isCall <- rep(c(FALSE,TRUE,FALSE,TRUE), c(4,5,3,4)) expiry <- rep(c(.2, .5), c(9,7)) # Distributions for 0.2 and 0.5 of a year given distribution describing # multiplicative change in price over a year: annual <- fitGivenQuantile(mean=1, sd=.2, prob=2.e-4, value=.01) timep2 <- iidcombine(.2, annual) timep5 <- iidcombine(.5, annual) imp.vols <- prices <- rep(NA, length(strikes)) use <- isCall & expiry==.2 prices[use] <- callFMstable(strikes[use]/spot, timep2) * spot use <- !isCall & expiry==.2 prices[use] <- putFMstable(strikes[use]/spot, timep2) * spot use <- isCall & expiry==.5 prices[use] <- callFMstable(strikes[use]/spot, timep5) * spot use <- !isCall & expiry==.5 prices[use] <- putFMstable(strikes[use]/spot, timep5) * spot # Compute implied volatilities. imp.vols[isCall] <- ImpliedVol(spot=spot, strike=strikes[isCall], expiry=expiry[isCall], price=prices[isCall], Call=TRUE) imp.vols[!isCall] <- ImpliedVol(spot=spot, strike=strikes[!isCall], expiry=expiry[!isCall], price=prices[!isCall], Call=FALSE) # List values of options cbind(strikes, expiry, isCall, prices, imp.vols) # Can the distribution be recovered from the values of the options? discrepancy <- function(alpha, cv){ annual.fit <- setMomentsFMstable(mean=1, sd=cv, alpha=alpha) timep2.fit <- iidcombine(.2, annual.fit) timep5.fit <- iidcombine(.5, annual.fit) prices.fit <- rep(NA, length(strikes)) use <- isCall & expiry==.2 prices.fit[use] <- callFMstable(strikes[use]/spot, timep2.fit) * spot use <- !isCall & expiry==.2 prices.fit[use] <- putFMstable(strikes[use]/spot, timep2.fit) * spot use <- isCall & expiry==.5 prices.fit[use] <- callFMstable(strikes[use]/spot, timep5.fit) * spot use <- !isCall & expiry==.5 prices.fit[use] <- putFMstable(strikes[use]/spot, timep5.fit) * spot return(sum((prices.fit - prices)^2)) } # Search on scales of log(2-alpha) and log(cv) d <- function(param) discrepancy(2-exp(param[1]), exp(param[2])) system.time(result <- nlm(d, p=c(-2,-1.5))) # Estimated alpha 2-exp(result\$estimate[1]) # Estimated cv exp(result\$estimate[2]) # Searching just for best alpha d <- function(param) discrepancy(param, .2) system.time(result <- optimize(d, lower=1.6, upper=1.98)) # Estimated alpha result\$minimum ```