private MultiFactorSpotSimResults <Day> SimulateForZeroVolatility() { int numSims = 10; var zeroFactorVols = new Dictionary <Day, double> { { new Day(2020, 08, 01), 0.0 }, { new Day(2021, 01, 15), 0.0 }, { new Day(2021, 07, 30), 0.0 } }; var multiFactorParameters = new MultiFactorParameters <Day>(new [, ] { { 1.0, 0.6, 0.3 }, { 0.6, 1.0, 0.4 }, { 0.3, 0.4, 1.0 } }, new Factor <Day>(0.0, zeroFactorVols), new Factor <Day>(2.5, zeroFactorVols), new Factor <Day>(16.2, zeroFactorVols) ); Day[] simulatedPeriods = _dailyForwardCurve.Keys.OrderBy(day => day).ToArray(); var normalSimulator = new MersenneTwisterGenerator(_seed, true); var simulator = new MultiFactorSpotPriceSimulator <Day>(multiFactorParameters, _currentDate, _dailyForwardCurve, simulatedPeriods, TimeFunctions.Act365, normalSimulator); return(simulator.Simulate(numSims)); }
private MultiFactorSpotSimResults <Day> SimulateForTwoNonMeanRevertingFactors(bool antithetic) { int numSims = 100000; double factorCorr = 0.74; _twoNonMeanRevertingFactorsParams = MultiFactorParameters.For2Factors(factorCorr, new Factor <Day>(0.0, new Dictionary <Day, double> { { new Day(2020, 08, 01), 0.15 }, { new Day(2021, 01, 15), 0.12 }, { new Day(2021, 07, 30), 0.13 } }), new Factor <Day>(0.0, new Dictionary <Day, double> { { new Day(2020, 08, 01), 0.11 }, { new Day(2021, 01, 15), 0.19 }, { new Day(2021, 07, 30), 0.15 } }) ); Day[] simulatedPeriods = _dailyForwardCurve.Keys.OrderBy(day => day).ToArray(); var normalSimulator = new MersenneTwisterGenerator(_seed, antithetic); var simulator = new MultiFactorSpotPriceSimulator <Day>(_twoNonMeanRevertingFactorsParams, _currentDate, _dailyForwardCurve, simulatedPeriods, TimeFunctions.Act365, normalSimulator); return(simulator.Simulate(numSims)); }
private MultiFactorSpotSimResults <Day> SimulateForSingleNonMeanRevertingFactor(bool antithetic) { int numSims = 1000000; double meanReversion = 0.0; var spotVols = new Dictionary <Day, double> { { new Day(2020, 08, 01), 0.45 }, { new Day(2021, 01, 15), 0.42 }, { new Day(2021, 07, 30), 0.33 } }; _singleNonMeanRevertingFactorParams = MultiFactorParameters.For1Factor(meanReversion, spotVols); Day[] simulatedPeriods = _dailyForwardCurve.Keys.OrderBy(day => day).ToArray(); var normalSimulator = new MersenneTwisterGenerator(_seed, antithetic); var simulator = new MultiFactorSpotPriceSimulator <Day>(_singleNonMeanRevertingFactorParams, _currentDate, _dailyForwardCurve, simulatedPeriods, TimeFunctions.Act365, normalSimulator); return(simulator.Simulate(numSims)); }
private MultiFactorSpotSimResults <Day> SimulateForMeanAndNonMeanRevertingFactors(bool antithetic) { int numSims = 100000; _meanAndNonMeanRevertingFactorsParams = new MultiFactorParameters <Day>(new[, ] { { 1.0, 0.6, 0.3 }, { 0.6, 1.0, 0.4 }, { 0.3, 0.4, 1.0 } }, new Factor <Day>(0.0, new Dictionary <Day, double> { { new Day(2020, 08, 01), 0.35 }, { new Day(2021, 01, 15), 0.29 }, { new Day(2021, 07, 30), 0.32 } }), new Factor <Day>(2.5, new Dictionary <Day, double> { { new Day(2020, 08, 01), 0.15 }, { new Day(2021, 01, 15), 0.18 }, { new Day(2021, 07, 30), 0.21 } }), new Factor <Day>(16.2, new Dictionary <Day, double> { { new Day(2020, 08, 01), 0.95 }, { new Day(2021, 01, 15), 0.92 }, { new Day(2021, 07, 30), 0.89 } }) ); Day[] simulatedPeriods = _dailyForwardCurve.Keys.OrderBy(day => day).ToArray(); var normalSimulator = new MersenneTwisterGenerator(_seed, antithetic); var simulator = new MultiFactorSpotPriceSimulator <Day>(_meanAndNonMeanRevertingFactorsParams, _currentDate, _dailyForwardCurve, simulatedPeriods, TimeFunctions.Act365, normalSimulator); return(simulator.Simulate(numSims)); }
static void Main(string[] args) { var _seed = 12; var _currentDate = new DateTime(2020, 07, 27); var _dailyForwardCurve = new Dictionary <Day, double> { { new Day(2020, 08, 01), 56.85 }, { new Day(2021, 01, 15), 59.08 }, { new Day(2021, 07, 30), 62.453 } }; int numSims = 1000; double meanReversion = 0.0; bool antithetic = true; var spotVols = new Dictionary <Day, double> { { new Day(2020, 08, 01), 0.45 }, { new Day(2021, 01, 15), 0.42 }, { new Day(2021, 07, 30), 0.33 } }; var _singleNonMeanRevertingFactorParams = MultiFactorParameters.For1Factor(meanReversion, spotVols); Day[] simulatedPeriods = _dailyForwardCurve.Keys.OrderBy(day => day).ToArray(); var normalSimulator = new MersenneTwisterGenerator(_seed, antithetic); var simulator = new MultiFactorSpotPriceSimulator <Day>( _singleNonMeanRevertingFactorParams, _currentDate, _dailyForwardCurve, simulatedPeriods, TimeFunctions.Act365, normalSimulator ); var simResults = simulator.Simulate(numSims); ReadOnlyMemory <double> simulatedSpotPrices0 = simResults.SpotPricesForStepIndex(0); ReadOnlyMemory <double> simulatedSpotPrices1 = simResults.SpotPricesForStepIndex(1); ReadOnlyMemory <double> simulatedSpotPrices2 = simResults.SpotPricesForStepIndex(2); using (StreamWriter file = new StreamWriter("sims.csv")) { foreach (var i in new [] { 0, 1, 2 }) { ReadOnlyMemory <double> simulatedSpotPrices = simResults.SpotPricesForStepIndex(i); foreach (var item in simulatedSpotPrices.ToArray()) { file.Write(item + ","); } file.Write(Environment.NewLine); } } Console.WriteLine("Press any key to exit"); Console.ReadKey(); }