private static double StepVol(double start, double end, OrnsteinUhlenbeck ouProcess) { var step = end - start; Debug.Assert(step >= 0.0); var stepIntegralVar = OrnsteinUhlenbeckUtils.IntegratedVariance(ouProcess.Volatility, ouProcess.MeanReversion, start) .Eval(end); return(step > 0.0 ? Math.Sqrt(stepIntegralVar / step) : 0.0); }
public static OrnsteinUhlenbeck1DGenerator Build(double[] dates, OrnsteinUhlenbeck ouProcess) { var stepSlopes = new double[dates.Length]; var stepDrifts = new double[dates.Length]; var stepVols = new double[dates.Length]; for (int i = 0; i < dates.Length; i++) { var previous = (i == 0) ? 0.0 : dates[i - 1]; var step = dates[i] - previous; stepSlopes[i] = Math.Exp(-ouProcess.MeanReversion * step); stepDrifts[i] = StepDrift(previous, dates[i], ouProcess); stepVols[i] = StepVol(previous, dates[i], ouProcess); } return(new OrnsteinUhlenbeck1DGenerator(dates, ouProcess.Value0, stepSlopes, stepDrifts, stepVols)); }
private static double StepDrift(double start, double end, OrnsteinUhlenbeck ouProcess) { return(OrnsteinUhlenbeckUtils.IntegratedDrift(ouProcess.Drift, ouProcess.MeanReversion, start).Eval(end)); }