Learn R Programming

NFCP (version 1.0.1)

spot_price_simulate: Simulate spot prices of an N-factor model through Monte Carlo simulation

Description

Simulate risk-neutral price paths of an an N-factor commodity pricing model through Monte Carlo Simulation.

Usage

spot_price_simulate(
  x_0,
  parameters,
  t = 1,
  dt = 1,
  N_simulations = 2,
  antithetic = TRUE,
  verbose = FALSE
)

Arguments

x_0

Initial values of the state vector.

parameters

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

t

the number of years to simulate

dt

discrete time step of simulation

N_simulations

total number of simulations

antithetic

logical. Should antithetic price paths be simulated?

verbose

logical. Should simulated state variables be output? see returns

Value

spot_price_simulate returns a list when verbose = T and a matrix of simulated price paths when verbose = F. The returned objects in the list are:

State_Variables

A matrix of simulated state variables for each factor is returned when verbose = T. The number of factors returned corresponds to the number of factors in the specified N-factor model.

Prices

A matrix of simulated price paths. Each column represents one simulated price path and each row represents one simulated observation.

Details

The spot_price_simulate function is able to quickly simulate a large number of risk-neutral price paths of a commodity following the N-factor model. Simulating risk-neutral price paths of a commodity under an N-factor model through Monte Carlo simulations allows for the valuation of commodity related investments and derivatives, such as American Options and Real Options through dynamic programming methods. The spot_price_simulate function quickly and efficiently simulates an N-factor model over a specified number of years, simulating antithetic price paths as a simple variance reduction technique. The spot_price_simulate function uses the mvrnorm function from the MASS package to draw from a multivariate normal distribution for the simulation shocks.

The N-factor model stochastic differential equation is given by:

Brownian Motion processes (ie. factor one when GBM = T) are simulated using the following solution:

x_1,t+1 = x_1,t + ^* t + _1 t Z_t+1x[1,t+1] = x[1,t] + mu^* * Delta t + sigma[1] * Delta t * Z[t+1]

Where tDelta t is the discrete time step, ^*mu^* is the risk-neutral growth rate and _1sigma[1] is the instantaneous volatility. Z_tZ[t] represents the independent standard normal at time tt.

Ornstein-Uhlenbeck Processes are simulated using the following solution:

x_i,t = x_i,0e^-_it-_i_i(1-e^-_it)+_0^t_ie^_isdW_sx[i,t] = x[i,0] * e^(-kappa[i] * t) - lambda[i]/kappa[i] * (1 - e^(-kappa[i] * t)) + int_0^t (sigma[i] * e^(kappa[i] * s) dW[s])

Where a numerical solution is obtained by numerically discretising and approximating the integral term using the Euler-Maruyama integration scheme: _0^t_ie^_isdW_s = _j=0^t _ie^_ijdW_sint_0^t ( sigma[i] e^(kappa[i] * s) dw[s])

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.

Examples

Run this code
# NOT RUN {

# Example 1
###Simulate a geometric Brownian motion (GBM) process:
## starting price of 20, with a growth of 5% p.a. and
## volatility of 20% p.a.
simulated_spot_prices <- spot_price_simulate(
 x_0 = log(20),
 parameters = c(mu_rn = (0.05 - (1/2) * 0.2^2), sigma_1 = 0.2),
 t = 1,
 dt = 1/12,
 N_simulations = 1e3)

# Example 2
###Simulate future spot price paths under Risk-Neutrality and under the
###Schwartz - Smith two factor model:

##Step 1 - Run the Kalman Filter for the Two-Factor Oil Model:
SS_2F_filtered <- 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 - Simulate spot prices:
##100 antithetic simulations of one year of monthly observations
simulated_spot_prices <- spot_price_simulate(
 x_0 = SS_2F_filtered$x_t,
 parameters = SS_oil$two_factor,
 t = 1,
 dt = 1/12,
 N_simulations = 1e3,
 antithetic = TRUE,
 verbose = TRUE)
# }

Run the code above in your browser using DataLab