Learn R Programming

NFCP (version 1.2.1)

European_option_value: N-factor model European options on futures contracts valuation

Description

Value European Option Put and Calls under the parameters of an N-factor model.

Usage

European_option_value(
  x_0,
  parameters,
  futures_maturity,
  option_maturity,
  K,
  r,
  call = FALSE,
  verbose = FALSE
)

Arguments

x_0

vector. Initial values of the state variables, where the length must correspond to the number of factors specified in the parameters.

parameters

vector. A named vector of parameter values of a specified N-factor model. Function NFCP_parameters is recommended.

futures_maturity

numeric. Time, in years, when the underlying futures contract matures.

option_maturity

numeric. Time, in years, when the American option expires.

K

numeric. Strike price of the American Option.

r

numeric. Annualized risk-free interest rate.

call

logical. Is the American option a call or put option?

verbose

logical. Should additional option value information be output? see details.

Value

The European_option_value function returns a numeric value corresponding to the present value of an option when verbose = F. When verbose = T, European_option_value returns a list with three objects:

option value

Present value of the option.

annualized volatility

Annualized volatility of the option.

parameter sensitivity

Sensitivity of option value to model parameters.

greeks

Sensitivity of option value to option parameters.

Details

The European_option_value function calculates analytic expressions of the value of European call and put options on futures contracts within the N-factor model. A European option on a commodity futures contract gives the holder the right, but not the obligation, to buy (call) or sell (put) the underlying asset at option maturity. If the European option is exercised, the option devolves into buying or selling of the underlying futures asset.

State variables (i.e., the states of the factors of an N-factor model) are generally unobservable. Filtering the commodity pricing model using term structure data will provide the most recent optimal estimates of state variables, which can then be used to forecast and value European options.

Under the assumption that future futures prices are log-normally distributed under the risk-neutral process, there exist analytic expressions of the value of European call and put options on futures contracts. The value of a European option on a futures contract is given by calculating the current expected futures price and the average instantaneous variance of the futures return innovations over the life of the option.

Consider a European option with strike price KK and a risk-free interest rate of r_fr_f. The option maturity is at time T_0T_0 and futures maturity at time T_1T_1. The particular model features a state vector of length NN (i.e., N-factors) x(t)x(t)

The value of a European call option would thus be:

e^-r T_0 E^*[max(F(x(T_0),T_0,T_1) - K, 0)]e^(-r T_0) E^*[max(F(x(T_0),T_0,T_1) - K, 0)]

The analytic solution to call and put options are given by:

Call options: e^-r T_0(F(x(0), 0, T_1) N(d_1) - KN(d_2))e^(-r T_0) (F(x(0), 0, T_1) N(d_1) - KN(d_2))

Put options: e^-r T_0(KN(-d_2) - F(x(0), 0, T_1) N(-d_1))e^(-r T_0) (KN(-d_2) - F(x(0), 0, T_1) N(-d_1))

Where:

Where: d_1 = (F/K) + 12 v^2vd_1 = (ln(F/K) + 1/2 v^2) / v

d_2 = d_1 - vd_2 = d_1 - v

Parameter N(d) N(d) indicates cumulative probabilities for the standard normal distribution (i.e. P(Z < d)P(Z<d)).

Finally, parameter vv, the annualized option volatility, is given by:

Var^*[(F(x(T_0), T_0, T_1))] v^2 = _i.j=1 e^(-_i + _j)(T_1 - T_0)Cov^*(x_i(T_0), x_j(T_0))Var^*[ln(F(x(T_0), T_0, T_0))] = v^2 = sum_(i.j=1) e^((-kappa[i] + kappa[j])(T_1 - T_0)) Cov(x_i(T_0), x_j(T_0))

The annualized option volatility approaches _1^2 T_0sigma[1]^2 T_0 as both T_0T_0 and T_1T_1 increase, as most uncertainty about spot prices at futures contract maturity and option expiration are a result of uncertainty about spot prices, rather than the cost of carry (Schwartz and Smith, 2000).

The presented option valuation formulas are analogous to the Black-Scholes formulas for valuing European options on stocks that do not pay dividends

When verbose = T, the European_option_value function numerically calculates the sensitivity of option prices to underlying option and model parameters. Gradients are calculated numerically through the grad function of the numDeriv package.

References

Schwartz, E. S., and J. E. Smith, (2000). Short-Term Variations and Long-Term Dynamics in Commodity Prices. Manage. Sci., 46, 893-911.

Cortazar, G., and L. Naranjo, (2006). An N-factor Gaussian model of oil futures prices. Journal of Futures Markets: Futures, Options, and Other Derivative Products, 26(3), 243-268.

Paul Gilbert and Ravi Varadhan (2016). numDeriv: Accurate Numerical Derivatives. R package version 2016.8-1. https://CRAN.R-project.org/package=numDeriv

Examples

Run this code
# NOT RUN {
##Example 1 - A European 'put' option on a futures contract following 'GBM'

European_option_value(x_0 = log(20), parameters = c(mu_rn = 0.06, sigma_1 = 0.2),
                     futures_maturity = 1, option_maturity = 1,
                     K = 20, r = 0.06, call = FALSE, verbose = TRUE)

##Example 2 - A European put option under a two-factor crude oil model:

##Step 1 - Obtain current (i.e. most recent) state vector by filtering the
##two-factor oil model:
Schwartz_Smith_oil <- NFCP_Kalman_filter(parameter_values = SS_oil$two_factor,
                                        parameter_names = names(SS_oil$two_factor),
                                        log_futures = log(SS_oil$stitched_futures),
                                        dt = SS_oil$dt,
                                        futures_TTM = SS_oil$stitched_TTM,
                                        verbose = TRUE)

##Step 2 - Calculate 'call' option price:
European_option_value(x_0 = Schwartz_Smith_oil$x_t,
                     parameters = SS_oil$two_factor,
                     futures_maturity = 2,
                     option_maturity = 1,
                     K = 20,
                     r = 0.05,
                     call = FALSE,
                     verbose = FALSE)
# }

Run the code above in your browser using DataLab