for the value of a European or American, put or call stock option, with exercise price . In equation (1) is time, is the stock price, is the risk free interest rate, is the continuous dividend, and is the stock volatility. According to the values in the array tdpar, the arguments , and may each be either constant or functions of time. The routine also returns values of various Greeks.
d03ncf uses a finite difference method with a choice of time-stepping schemes. The method is explicit for and implicit for nonzero values of alpha. Second order time accuracy can be obtained by setting . According to the value of the argument mesh the finite difference mesh may be either uniform, or user-defined in both and directions.
4References
Hull J (1989) Options, Futures and Other Derivative Securities Prentice–Hall
Wilmott P, Howison S and Dewynne J (1995) The Mathematics of Financial Derivatives Cambridge University Press
5Arguments
1: – IntegerInput
On entry: specifies the kind of option to be valued.
A European call option.
An American call option.
A European put option.
An American put option.
Constraint:
, , or .
2: – Real (Kind=nag_wp)Input
On entry: the exercise price .
3: – Character(1)Input
On entry: indicates the type of finite difference mesh to be used:
Uniform mesh.
Custom mesh supplied by you.
Constraint:
or .
4: – IntegerInput
On entry: the number of stock prices to be used in the finite difference mesh.
Constraint:
.
5: – Real (Kind=nag_wp) arrayInput/Output
On entry: if , must contain the th stock price in the mesh, for . These values should be in increasing order, with and .
If , must be set to and to , but need not be initialized, as they will be set internally by the routine in order to define a uniform mesh.
On exit: if , the elements of s define a uniform mesh over .
On entry: specifies whether or not various arguments are time-dependent. More precisely, is time-dependent if and constant otherwise. Similarly, specifies whether is time-dependent and specifies whether is time-dependent.
9: – Real (Kind=nag_wp) arrayInput
Note: the dimension of the array r
must be at least
if , and at least otherwise.
On entry: if then
must contain the value of the risk-free interest rate at the th time in the mesh, for .
If then must contain the constant value of the risk-free interest rate . The remaining elements need not be set.
10: – Real (Kind=nag_wp) arrayInput
Note: the dimension of the array q
must be at least
if , and at least otherwise.
On entry: if then
must contain the value of the continuous dividend at the th time in the mesh, for .
If then must contain the constant value of the continuous dividend . The remaining elements need not be set.
11: – Real (Kind=nag_wp) arrayInput
Note: the dimension of the array sigma
must be at least
if , and at least otherwise.
On entry: if then must contain the value of the volatility at the th time in the mesh, for .
If then must contain the constant value of the volatility . The remaining elements need not be set.
12: – Real (Kind=nag_wp)Input
On entry: the value of to be used in the time-stepping scheme. Typical values include:
Explicit forward Euler scheme.
Implicit Crank–Nicolson scheme.
Implicit backward Euler scheme.
The value gives second-order accuracy in time. Values greater than give unconditional stability. Since is at the limit of unconditional stability this value does not damp oscillations.
Suggested value:
.
Constraint:
.
13: – IntegerInput
On entry: the number of solutions to be stored in the time direction. The routine calculates the solution backwards from to at all times in the mesh. These time solutions and the corresponding Greeks will be stored at times
, for , in the arrays f, theta, delta, gamma, lambda and rho. Other time solutions will be discarded. To store all time solutions set .
Constraint:
.
14: – Real (Kind=nag_wp) arrayOutput
On exit: , for and , contains the value of the option at the th mesh point at time .
15: – Real (Kind=nag_wp) arrayOutput
16: – Real (Kind=nag_wp) arrayOutput
17: – Real (Kind=nag_wp) arrayOutput
18: – Real (Kind=nag_wp) arrayOutput
19: – Real (Kind=nag_wp) arrayOutput
On exit: the values of various Greeks at the th mesh point at time , as follows:
20: – IntegerInput
On entry: the first dimension of the arrays f, theta, delta, gamma, lambda and rho as declared in the (sub)program from which d03ncf is called.
Constraint:
.
21: – Real (Kind=nag_wp) arrayWorkspace
22: – Integer arrayWorkspace
23: – IntegerInput/Output
On entry: ifail must be set to , or to set behaviour on detection of an error; these values have no effect when no error is detected.
A value of causes the printing of an error message and program execution will be halted; otherwise program execution continues. A value of means that an error message is printed while a value of means that it is not.
If halting is not appropriate, the value or is recommended. If message printing is undesirable, then the value is recommended. Otherwise, the value is recommended. When the value or is used it is essential to test the value of ifail on exit.
On exit: unless the routine detects an error or a warning has been flagged (see Section 6).
6Error Indicators and Warnings
If on entry or , explanatory error messages are output on the current error message unit (as defined by x04aaf).
Errors or warnings detected by the routine:
On entry, .
Constraint: .
On entry, .
Constraint: .
On entry, .
Constraint: , , or .
On entry, and .
Constraint: .
On entry, .
Constraint: or .
On entry, .
Constraint: .
On entry, .
Constraint: .
On entry, .
Constraint: .
On entry, and .
Constraint: .
On entry, .
Constraint: .
On entry, .
Constraint: .
On entry, and .
Constraint: .
On entry, and .
Constraint: .
On entry, .
Constraint: when , , for .
On entry, .
Constraint: when , , for .
An unexpected error has been triggered by this routine. Please
contact NAG.
See Section 7 in the Introduction to the NAG Library FL Interface for further information.
Your licence key may have expired or may not have been installed correctly.
See Section 8 in the Introduction to the NAG Library FL Interface for further information.
Dynamic memory allocation failed.
See Section 9 in the Introduction to the NAG Library FL Interface for further information.
7Accuracy
The accuracy of the solution and the various derivatives returned by the routine is dependent on the values of ns and nt supplied, the distribution of the mesh points, and the value of alpha chosen. For most choices of alpha the solution has a truncation error which is second-order accurate in and first order accurate in . For the truncation error is also second-order accurate in .
The simplest approach to improving the accuracy is to increase the values of both ns and nt.
8Parallelism and Performance
Background information to multithreading can be found in the Multithreading documentation.
d03ncf is threaded by NAG for parallel execution in multithreaded implementations of the NAG Library.
d03ncf makes calls to BLAS and/or LAPACK routines, which may be threaded within the vendor library used by this implementation. Consult the documentation for the vendor library for further information.
Please consult the X06 Chapter Introduction for information on how to control and interrogate the OpenMP environment used within this routine. Please also consult the Users' Note for your implementation for any additional implementation-specific information.
9Further Comments
9.1Timing
Each time-step requires the construction and solution of a tridiagonal system of linear equations. To calculate each of the derivatives lambda and rho requires a repetition of the entire solution process. The time taken for a call to the routine is, therefore, proportional to .
9.2Algorithmic Details
d03ncf solves equation (1) using a finite difference method. The solution is computed backwards in time from to using a scheme, which is implicit for all nonzero values of , and is unconditionally stable for values of . For each time-step a tridiagonal system is constructed and solved to obtain the solution at the earlier time. For the explicit scheme () this tridiagonal system degenerates to a diagonal matrix and is solved trivially. For American options the solution at each time-step is inspected to check whether early exercise is beneficial, and amended accordingly.
To compute the arrays lambda and rho, which are derivatives of the stock value with respect to the problem arguments and respectively, the entire solution process is repeated with perturbed values of these arguments.
10Example
This example, taken from Hull (1989), solves the one-dimensional Black–Scholes equation for valuation of a -month American put option on a non-dividend-paying stock with an exercise price of $. The risk-free interest rate is 10% per annum, and the stock volatility is 40% per annum.
A fully implicit backward Euler scheme is used, with a mesh of stock price intervals and time intervals.