In Beckers (1980) there is a model for a Stochastic Differential Equation of option pricing. The idea is a "constant elasticity of variance diffusion (or CEV) class"
import com.imsl.math.*; import java.util.*; public class FeynmanKacEx2 { public static void main(String args[]) throws Exception { // Compute Constant Elasticity of Variance Model for Vanilla Call // The set of strike prices double[] strikePrices = {15.0, 20.0, 25.0}; // The set of sigma values double[] sigma = {0.2, 0.3, 0.4}; // The set of model diffusion powers double[] alpha = {2.0, 1.0, 0.0}; // Time values for the options int nt = 3; double[] tGrid = {1.0 / 12.0, 4.0 / 12.0, 7.0 / 12.0}; // Values of the underlying where evaluations are made double[] evaluationPoints = {19.0, 20.0, 21.0}; // Value of the interest rate and continuous dividend double r = 0.05, dividend = 0.0; // Values of the min and max underlying values modeled double xMin = 0.0, xMax = 60.0; // Define parameters for the integration step. */ int nxGrid = 121; int ntGrid = 3; int nv = 3; int nint = nxGrid - 1, n = 3 * nxGrid; double[] xGrid = new double[nxGrid]; double dx; // Number of left/right boundary conditions int nlbcd = 3, nrbcd = 3; // Time dependency boolean[] timeDependence = new boolean[7]; double[] userData = new double[6]; int j; // Define equally-spaced grid of points for the underlying price dx = (xMax - xMin) / ((double) nint); xGrid[0] = xMin; xGrid[nxGrid - 1] = xMax; for (int i = 2; i <= nxGrid - 1; i++) { xGrid[i - 1] = xGrid[i - 2] + dx; } System.out.printf("%2sConstant Elasticity of Variance Model" + " for Vanilla Call%n", " "); System.out.printf(Locale.ENGLISH, "%7sInterest Rate:%7.3f Continuous Dividend:%7.3f%n", " ", r, dividend); System.out.printf(Locale.ENGLISH, "%7sMinimum and Maximum Prices of Underlying:%7.2f%7.2f%n", " ", xMin, xMax); System.out.printf("%7sNumber of equally spaced spline knots:%4d%n", " ", nxGrid - 1); System.out.printf("%7sNumber of unknowns:%4d%n%n", " ", n); System.out.printf(Locale.ENGLISH, "%7sTime in Years Prior to Expiration: %7.4f%7.4f%7.4f%n", " ", tGrid[0], tGrid[1], tGrid[2]); System.out.printf(Locale.ENGLISH, "%7sOption valued at Underlying Prices:%7.2f%7.2f%7.2f%n%n", " ", evaluationPoints[0], evaluationPoints[1], evaluationPoints[2]); for (int i1 = 1; i1 <= 3; i1++) /* Loop over power */ { for (int i2 = 1; i2 <= 3; i2++) /* Loop over volatility */ { for (int i3 = 1; i3 <= 3; i3++) /* Loop over strike price */ { // Pass data through into evaluation routines. userData[0] = strikePrices[i3 - 1]; userData[1] = xMax; userData[2] = sigma[i2 - 1]; userData[3] = alpha[i1 - 1]; userData[4] = r; userData[5] = dividend; FeynmanKac callOption = new FeynmanKac( new MyCoefficients(userData)); // Right boundary condition is time-dependent timeDependence[5] = true; callOption.setTimeDependence(timeDependence); callOption.computeCoefficients(nlbcd, nrbcd, new MyBoundaries(userData), xGrid, tGrid); double[][] optionCoefficients=callOption.getSplineCoefficients(); double[][] splineValuesOption = new double[ntGrid][]; // Evaluate solution at vector evaluationPoints, at each time // value prior to expiration. for (int i = 0; i < ntGrid; i++) { splineValuesOption[i] = callOption.getSplineValue( evaluationPoints, optionCoefficients[i + 1], 0); } System.out.printf(Locale.ENGLISH, "%2sStrike=%5.2f, Sigma=" + "%5.2f, Alpha=%5.2f%n", " ", strikePrices[i3 - 1], sigma[i2 - 1], alpha[i1 - 1]); for (int i = 0; i < nv; i++) { System.out.printf("%23sCall Option Values%2s", " ", " "); for (j = 0; j < nt; j++) { System.out.printf(Locale.ENGLISH, "%7.4f ", splineValuesOption[j][i]); } System.out.printf("%n"); } System.out.printf("%n"); } } } } static class MyCoefficients implements FeynmanKac.PdeCoefficients { final double zero = 0.0, half = 0.5; private double sigma, strikePrice, interestRate; private double alpha, dividend; public MyCoefficients(double[] myData) { this.strikePrice = myData[0]; this.sigma = myData[2]; this.alpha = myData[3]; this.interestRate = myData[4]; this.dividend = myData[5]; } // The coefficient sigma(x) public double sigma(double x, double t) { return (sigma * Math.pow(x, alpha * half)); } // The coefficient derivative d(sigma) / dx public double sigmaPrime(double x, double t) { return (half * alpha * sigma * Math.pow(x, alpha * half - 1.0)); } // The coefficient mu(x) public double mu(double x, double t) { return ((interestRate - dividend) * x); } // The coefficient kappa(x) public double kappa(double x, double t) { return interestRate; } } static class MyBoundaries implements FeynmanKac.Boundaries { private double xMax, df, interestRate, strikePrice; public MyBoundaries(double[] myData) { this.strikePrice = myData[0]; this.xMax = myData[1]; this.interestRate = myData[4]; } public void leftBoundaries(double time, double[][] bndCoeffs) { bndCoeffs[0][0] = 1.0; bndCoeffs[0][1] = 0.0; bndCoeffs[0][2] = 0.0; bndCoeffs[0][3] = 0.0; bndCoeffs[1][0] = 0.0; bndCoeffs[1][1] = 1.0; bndCoeffs[1][2] = 0.0; bndCoeffs[1][3] = 0.0; bndCoeffs[2][0] = 0.0; bndCoeffs[2][1] = 0.0; bndCoeffs[2][2] = 1.0; bndCoeffs[2][3] = 0.0; return; } public void rightBoundaries(double time, double[][] bndCoeffs) { df = Math.exp(interestRate * time); bndCoeffs[0][0] = 1.0; bndCoeffs[0][1] = 0.0; bndCoeffs[0][2] = 0.0; bndCoeffs[0][3] = xMax - df * strikePrice; bndCoeffs[1][0] = 0.0; bndCoeffs[1][1] = 1.0; bndCoeffs[1][2] = 0.0; bndCoeffs[1][3] = 1.0; bndCoeffs[2][0] = 0.0; bndCoeffs[2][1] = 0.0; bndCoeffs[2][2] = 1.0; bndCoeffs[2][3] = 0.0; return; } public double terminal(double x) { double zero = 0.0; // The payoff function double value = Math.max(x - strikePrice, zero); return value; } } }
Constant Elasticity of Variance Model for Vanilla Call Interest Rate: 0.050 Continuous Dividend: 0.000 Minimum and Maximum Prices of Underlying: 0.00 60.00 Number of equally spaced spline knots: 120 Number of unknowns: 363 Time in Years Prior to Expiration: 0.0833 0.3333 0.5833 Option valued at Underlying Prices: 19.00 20.00 21.00 Strike=15.00, Sigma= 0.20, Alpha= 2.00 Call Option Values 4.0624 4.2576 4.4734 Call Option Values 5.0624 5.2505 5.4492 Call Option Values 6.0624 6.2486 6.4386 Strike=20.00, Sigma= 0.20, Alpha= 2.00 Call Option Values 0.1312 0.5951 0.9693 Call Option Values 0.5024 1.0880 1.5093 Call Option Values 1.1980 1.7478 2.1745 Strike=25.00, Sigma= 0.20, Alpha= 2.00 Call Option Values 0.0000 0.0111 0.0751 Call Option Values 0.0000 0.0376 0.1630 Call Option Values 0.0006 0.1036 0.3150 Strike=15.00, Sigma= 0.30, Alpha= 2.00 Call Option Values 4.0636 4.3405 4.6627 Call Option Values 5.0625 5.2951 5.5794 Call Option Values 6.0624 6.2712 6.5248 Strike=20.00, Sigma= 0.30, Alpha= 2.00 Call Option Values 0.3107 1.0261 1.5479 Call Option Values 0.7317 1.5404 2.0999 Call Option Values 1.3762 2.1674 2.7362 Strike=25.00, Sigma= 0.30, Alpha= 2.00 Call Option Values 0.0005 0.1124 0.3564 Call Option Values 0.0035 0.2184 0.5565 Call Option Values 0.0184 0.3869 0.8230 Strike=15.00, Sigma= 0.40, Alpha= 2.00 Call Option Values 4.0755 4.5143 4.9673 Call Option Values 5.0660 5.4210 5.8328 Call Option Values 6.0633 6.3588 6.7306 Strike=20.00, Sigma= 0.40, Alpha= 2.00 Call Option Values 0.5109 1.4625 2.1260 Call Option Values 0.9611 1.9934 2.6915 Call Option Values 1.5807 2.6088 3.3202 Strike=25.00, Sigma= 0.40, Alpha= 2.00 Call Option Values 0.0081 0.3302 0.7795 Call Option Values 0.0287 0.5178 1.0656 Call Option Values 0.0820 0.7690 1.4097 Strike=15.00, Sigma= 0.20, Alpha= 1.00 Call Option Values 4.0624 4.2479 4.4312 Call Option Values 5.0624 5.2479 5.4312 Call Option Values 6.0624 6.2479 6.4312 Strike=20.00, Sigma= 0.20, Alpha= 1.00 Call Option Values 0.0000 0.0219 0.1051 Call Option Values 0.1497 0.4107 0.6484 Call Option Values 1.0832 1.3314 1.5773 Strike=25.00, Sigma= 0.20, Alpha= 1.00 Call Option Values -0.0000 -0.0000 0.0000 Call Option Values -0.0000 -0.0000 0.0000 Call Option Values -0.0000 -0.0000 0.0000 Strike=15.00, Sigma= 0.30, Alpha= 1.00 Call Option Values 4.0624 4.2479 4.4312 Call Option Values 5.0624 5.2479 5.4312 Call Option Values 6.0624 6.2479 6.4312 Strike=20.00, Sigma= 0.30, Alpha= 1.00 Call Option Values 0.0010 0.0786 0.2208 Call Option Values 0.1993 0.4997 0.7539 Call Option Values 1.0835 1.3444 1.6022 Strike=25.00, Sigma= 0.30, Alpha= 1.00 Call Option Values -0.0000 0.0000 0.0000 Call Option Values -0.0000 0.0000 0.0000 Call Option Values -0.0000 0.0000 0.0004 Strike=15.00, Sigma= 0.40, Alpha= 1.00 Call Option Values 4.0624 4.2479 4.4312 Call Option Values 5.0624 5.2479 5.4312 Call Option Values 6.0624 6.2479 6.4312 Strike=20.00, Sigma= 0.40, Alpha= 1.00 Call Option Values 0.0072 0.1540 0.3446 Call Option Values 0.2498 0.5950 0.8728 Call Option Values 1.0868 1.3795 1.6586 Strike=25.00, Sigma= 0.40, Alpha= 1.00 Call Option Values 0.0000 0.0000 0.0000 Call Option Values 0.0000 0.0000 0.0005 Call Option Values 0.0000 0.0002 0.0057 Strike=15.00, Sigma= 0.20, Alpha= 0.00 Call Option Values 4.0624 4.2479 4.4311 Call Option Values 5.0624 5.2479 5.4312 Call Option Values 6.0624 6.2479 6.4312 Strike=20.00, Sigma= 0.20, Alpha= 0.00 Call Option Values 0.0001 0.0001 0.0002 Call Option Values 0.0816 0.3316 0.5748 Call Option Values 1.0817 1.3308 1.5748 Strike=25.00, Sigma= 0.20, Alpha= 0.00 Call Option Values 0.0000 -0.0000 -0.0000 Call Option Values 0.0000 -0.0000 -0.0000 Call Option Values -0.0000 0.0000 -0.0000 Strike=15.00, Sigma= 0.30, Alpha= 0.00 Call Option Values 4.0624 4.2479 4.4312 Call Option Values 5.0624 5.2479 5.4312 Call Option Values 6.0624 6.2479 6.4312 Strike=20.00, Sigma= 0.30, Alpha= 0.00 Call Option Values 0.0000 -0.0000 0.0026 Call Option Values 0.0894 0.3326 0.5753 Call Option Values 1.0826 1.3306 1.5749 Strike=25.00, Sigma= 0.30, Alpha= 0.00 Call Option Values 0.0000 -0.0000 0.0000 Call Option Values 0.0000 -0.0000 0.0000 Call Option Values 0.0000 -0.0000 -0.0000 Strike=15.00, Sigma= 0.40, Alpha= 0.00 Call Option Values 4.0624 4.2479 4.4312 Call Option Values 5.0624 5.2479 5.4312 Call Option Values 6.0624 6.2479 6.4312 Strike=20.00, Sigma= 0.40, Alpha= 0.00 Call Option Values -0.0000 0.0001 0.0108 Call Option Values 0.0985 0.3383 0.5781 Call Option Values 1.0830 1.3306 1.5749 Strike=25.00, Sigma= 0.40, Alpha= 0.00 Call Option Values 0.0000 0.0000 0.0000 Call Option Values 0.0000 -0.0000 0.0000 Call Option Values 0.0000 -0.0000 0.0000Link to Java source.