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"
using System;
using Imsl.Math;
public class FeynmanKacEx2
{
public static void Main(String[] args)
{
// 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
bool[] timeDependence = new bool[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;
}
Console.Out.WriteLine(" Constant Elasticity of Variance Model" +
" for Vanilla Call");
Console.Out.WriteLine(" Interest Rate:{0,7:f3} Continuous"
+ " Dividend:{1,7:f3}", r, dividend);
Console.Out.WriteLine(" Minimum and Maximum Prices of " +
"Underlying:{0,7:f2}{1,7:f2}", " ", xMin, xMax);
Console.Out.WriteLine(" Number of equally spaced spline knots:"
+ "{0,4:d}", nxGrid - 1);
Console.Out.WriteLine(" Number of unknowns:{0,4:d}", n);
Console.Out.WriteLine(" Time in Years Prior to Expiration: " +
"{0,7:f4}{1,7:f4}{2,7:f4}",
tGrid[0], tGrid[1], tGrid[2]);
Console.Out.WriteLine(" Option valued at Underlying Prices:" +
"{0,7:f2}{1,7:f2}{2,7:f2}\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[] optionTimeCoeffs = new double[n];
double[][] splineValuesOption = new double[ntGrid][];
// Evaluate solution at vector evaluationPoints, at each time
// value prior to expiration.
for (int i = 0; i < ntGrid; i++)
{
for (int j = 0; j < n; j++)
optionTimeCoeffs[j] = optionCoefficients[i + 1, j];
splineValuesOption[i] =
callOption.GetSplineValue(evaluationPoints,
optionTimeCoeffs, 0);
}
Console.Out.WriteLine(" Strike={0,5:f2}, Sigma={1,5:f2}, "
+ "Alpha={2,5:f2}",
strikePrices[i3 - 1],
sigma[i2 - 1],
alpha[i1 - 1]);
for (int i = 0; i < nv; i++)
{
Console.Out.Write(" Call " +
"Option Values ");
for (int j = 0; j < nt; j++)
{
Console.Out.Write("{0,7:f4} ", splineValuesOption[j][i]);
}
Console.Out.WriteLine();
}
Console.Out.WriteLine();
}
}
}
}
internal class MyCoefficients : FeynmanKac.IPdeCoefficients
{
const double zero = 0.0;
const double 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;
}
}
internal class MyBoundaries : FeynmanKac.IBoundaries
{
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 val = Math.Max(x - strikePrice, zero);
return val;
}
}
}
Constant Elasticity of Variance Model for Vanilla Call
Interest Rate: 0.050 Continuous Dividend: 0.000
Minimum and Maximum Prices of Underlying: 0.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.0000
Link to C# source.