/// <summary> /// Method for calibrating the heston model. /// </summary> /// <param name="guessModelParameters">Object implementing IHestonModelParameters interface containing the risk-free rate, initial stock price /// and initial guess parameters to be used in the calibration.</param> /// <param name="referenceData">A collection of objects implementing IOptionMarketData<IEuropeanOption> interface. These should contain the reference data used for calibration.</param> /// <param name="calibrationSettings">An object implementing ICalibrationSettings interface.</param> /// <returns>Object implementing IHestonCalibrationResult interface which contains calibrated model parameters and additional diagnostic information</returns> public static IHestonCalibrationResult CalibrateHestonParameters(IHestonModelParameters guessModelParameters, IEnumerable <IOptionMarketData <IEuropeanOption> > referenceData, ICalibrationSettings calibrationSettings) { try { // Copy Linked List LinkedList <OptionMarketData <EuropeanOption> > data = new LinkedList <OptionMarketData <EuropeanOption> >(); foreach (OptionMarketData <IEuropeanOption> marketData in referenceData) { OptionMarketData <EuropeanOption> newMarketData = new OptionMarketData <EuropeanOption>((EuropeanOption)marketData.Option, marketData.Price); data.AddLast(newMarketData); } // Heston Calibrator HestonCalibrator calibrator = new HestonCalibrator((HestonModelParameters)guessModelParameters, data, (CalibrationSettings)calibrationSettings); // Calibration procedure calibrator.Calibrate(); // Retrieve outcome double error = 0; CalibrationOutcome outcome = CalibrationOutcome.NotStarted; calibrator.GetCalibrationStatus(ref outcome, ref error); HestonModelParameters parameters = calibrator.GetCalibratedModel(); // Form calibration result object HestonCalibrationResult result = new HestonCalibrationResult(error, outcome, parameters); return(result); } catch (Exception ex) { throw ex; } }
public void PriceOption() { // le mock de la volatilé, Mock <Volatility> volMock = new Mock <Volatility>(); volMock.Setup(x => x.Vol()).Returns(0.25); // utilsation des linq lambda expression. var maturity = DateTime.Parse("01/5/2019"); var paramDate = DateTime.Now; var option = new OptionInstrument(100, maturity); var optionData = new OptionMarketData(120, paramDate, 0.05, volMock.Object.Vol()); var pricer = new OptionPricer(option, optionData); var prix = 0.0; Assert.AreEqual(prix, 0); }
public void Task_2_5() { // Variance Process Values double Kappa = 1.5768; double Theta = 0.398; double Sigma = 0.5751; double V0 = 0.0175; double Rho = -0.5711; // Heston Model Params double InitialStockPrice = 100; double RiskFreeRate = 0.025; // Callibration Settings double accuracy = 0.001; int maxIter = 1000; VarianceProcessParameters varParams = new VarianceProcessParameters(Kappa, Theta, Sigma, V0, Rho); HestonModelParameters hestonModel = new HestonModelParameters(InitialStockPrice, RiskFreeRate, varParams); CalibrationSettings calibrationSettings = new CalibrationSettings(accuracy, maxIter); // Market Data LinkedList <OptionMarketData <EuropeanOption> > observedOptions = new LinkedList <OptionMarketData <EuropeanOption> >(); EuropeanOption eu1 = new EuropeanOption(80, PayoffType.Call, 1); OptionMarketData <EuropeanOption> marketData1 = new OptionMarketData <EuropeanOption>(eu1, 25.72); observedOptions.AddLast(marketData1); EuropeanOption eu2 = new EuropeanOption(90, PayoffType.Call, 1); OptionMarketData <EuropeanOption> marketData2 = new OptionMarketData <EuropeanOption>(eu2, 18.93); observedOptions.AddLast(marketData2); EuropeanOption eu3 = new EuropeanOption(80, PayoffType.Call, 2); OptionMarketData <EuropeanOption> marketData3 = new OptionMarketData <EuropeanOption>(eu3, 30.49); observedOptions.AddLast(marketData3); EuropeanOption eu4 = new EuropeanOption(100, PayoffType.Call, 2); OptionMarketData <EuropeanOption> marketData4 = new OptionMarketData <EuropeanOption>(eu4, 19.36); observedOptions.AddLast(marketData4); EuropeanOption eu5 = new EuropeanOption(100, PayoffType.Call, 1.5); OptionMarketData <EuropeanOption> marketData5 = new OptionMarketData <EuropeanOption>(eu5, 16.58); observedOptions.AddLast(marketData5); // Heston Calibrator HestonCalibrator calibrator = new HestonCalibrator(hestonModel, observedOptions, calibrationSettings); calibrator.Calibrate(); double error = 0; CalibrationOutcome outcome = CalibrationOutcome.NotStarted; calibrator.GetCalibrationStatus(ref outcome, ref error); Console.WriteLine("Calibration outcome: {0} and error: {1}", outcome, error); }
private List<OptionMarketData> GetOptionsMarketData(string filePath) { List<OptionMarketData> resultList = new List<OptionMarketData>(); string line; System.IO.StreamReader file = new System.IO.StreamReader(filePath); while ((line = file.ReadLine()) != null) { string[] tokens = line.Split(';'); string symbol = tokens[0]; OptionType optionType = (tokens[1].Equals("C")) ? OptionType.Call : OptionType.Put; double strike = Double.Parse(tokens[2], CultureInfo.InvariantCulture); DateTime maturity = DateTime.ParseExact(tokens[3], "yyyyMMdd", null); OptionInfo optionInfo = new OptionInfo(symbol, string.Empty, optionType, strike, maturity); double? bid = null; double? bidSize = null; double? ask = null; double? askSize = null; if (tokens[4] != string.Empty) bid = Double.Parse(tokens[4], CultureInfo.InvariantCulture); if (tokens[5] != string.Empty) bidSize = Double.Parse(tokens[5], CultureInfo.InvariantCulture); if (tokens[6] != string.Empty) ask = Double.Parse(tokens[6], CultureInfo.InvariantCulture); if (tokens[7] != string.Empty) askSize = Double.Parse(tokens[7], CultureInfo.InvariantCulture); OrderBook orderBook = new OrderBook(symbol, bid, ask, bidSize, askSize); OptionMarketData marketData = new OptionMarketData(optionInfo, orderBook); resultList.Add(marketData); } file.Close(); return resultList; }
public static void Task6() { Console.WriteLine("********Task 6*********"); // Variance Process Values double Kappa = 1.5768; double Theta = 0.398; double Sigma = 0.5751; double V0 = 0.0175; double Rho = -0.5711; // Heston Model Params double InitialStockPrice = 100; double RiskFreeRate = 0.025; // Callibration Settings double accuracy = 1.0e-3; int maxIter = 1000; VarianceProcessParameters varParams = new VarianceProcessParameters(Kappa, Theta, Sigma, V0, Rho); HestonModelParameters hestonModel = new HestonModelParameters(InitialStockPrice, RiskFreeRate, varParams); HestonModelParameters guess = new HestonModelParameters(InitialStockPrice, RiskFreeRate, new VarianceProcessParameters(1.55, 0.88, 1.5999, 0.4, -0.55)); CalibrationSettings calibrationSettings = new CalibrationSettings(accuracy, maxIter); // Market Data LinkedList <IOptionMarketData <IEuropeanOption> > observedOptions = new LinkedList <IOptionMarketData <IEuropeanOption> >(); EuropeanOption eu1 = new EuropeanOption(80, PayoffType.Call, 1); EuropeanOptionFormula eu1Form = new EuropeanOptionFormula(hestonModel, eu1); OptionMarketData <IEuropeanOption> marketData1 = new OptionMarketData <IEuropeanOption>(eu1, eu1Form.Price()); observedOptions.AddLast(marketData1); EuropeanOption eu2 = new EuropeanOption(90, PayoffType.Call, 1); EuropeanOptionFormula eu2Form = new EuropeanOptionFormula(hestonModel, eu2); OptionMarketData <IEuropeanOption> marketData2 = new OptionMarketData <IEuropeanOption>(eu2, eu2Form.Price()); observedOptions.AddLast(marketData2); EuropeanOption eu3 = new EuropeanOption(80, PayoffType.Call, 2); EuropeanOptionFormula eu3Form = new EuropeanOptionFormula(hestonModel, eu3); OptionMarketData <IEuropeanOption> marketData3 = new OptionMarketData <IEuropeanOption>(eu3, eu3Form.Price()); observedOptions.AddLast(marketData3); EuropeanOption eu4 = new EuropeanOption(100, PayoffType.Call, 2); EuropeanOptionFormula eu4Form = new EuropeanOptionFormula(hestonModel, eu4); OptionMarketData <IEuropeanOption> marketData4 = new OptionMarketData <IEuropeanOption>(eu4, eu4Form.Price()); observedOptions.AddLast(marketData4); EuropeanOption eu5 = new EuropeanOption(100, PayoffType.Call, 1.5); EuropeanOptionFormula eu5Form = new EuropeanOptionFormula(hestonModel, eu5); OptionMarketData <IEuropeanOption> marketData5 = new OptionMarketData <IEuropeanOption>(eu5, eu5Form.Price()); observedOptions.AddLast(marketData5); HestonCalibrationResult result; result = (HestonCalibrationResult) Heston.CalibrateHestonParameters(guess, observedOptions, calibrationSettings); Console.WriteLine("Calibration outcome: {0} and error: {1}", result.MinimizerStatus, result.PricingError); }
public static void Task5() { // Variance Process Values double Kappa = 1.5768; double Theta = 0.398; double Sigma = 0.5751; double V0 = 1.0175; double Rho = -0.5711; // Heston Model Params double InitialStockPrice = 100; double RiskFreeRate = 0.025; // Callibration Settings double accuracy = 0.001; int maxIter = 1000; VarianceProcessParameters varParams = new VarianceProcessParameters(Kappa, Theta, Sigma, V0, Rho); HestonModelParameters hestonModel = new HestonModelParameters(InitialStockPrice, RiskFreeRate, varParams); CalibrationSettings calibrationSettings = new CalibrationSettings(accuracy, maxIter); // Market Data LinkedList <IOptionMarketData <IEuropeanOption> > observedOptions = new LinkedList <IOptionMarketData <IEuropeanOption> >(); EuropeanOption eu1 = new EuropeanOption(80, PayoffType.Call, 1); OptionMarketData <IEuropeanOption> marketData1 = new OptionMarketData <IEuropeanOption>(eu1, 25.72); observedOptions.AddLast(marketData1); EuropeanOption eu2 = new EuropeanOption(90, PayoffType.Call, 1); OptionMarketData <IEuropeanOption> marketData2 = new OptionMarketData <IEuropeanOption>(eu2, 18.93); observedOptions.AddLast(marketData2); EuropeanOption eu3 = new EuropeanOption(80, PayoffType.Call, 2); OptionMarketData <IEuropeanOption> marketData3 = new OptionMarketData <IEuropeanOption>(eu3, 30.49); observedOptions.AddLast(marketData3); EuropeanOption eu4 = new EuropeanOption(100, PayoffType.Call, 2); OptionMarketData <IEuropeanOption> marketData4 = new OptionMarketData <IEuropeanOption>(eu4, 19.36); observedOptions.AddLast(marketData4); EuropeanOption eu5 = new EuropeanOption(100, PayoffType.Call, 1.5); OptionMarketData <IEuropeanOption> marketData5 = new OptionMarketData <IEuropeanOption>(eu5, 16.58); observedOptions.AddLast(marketData5); HestonCalibrationResult result; result = (HestonCalibrationResult) Heston.CalibrateHestonParameters(hestonModel, observedOptions, calibrationSettings); Console.WriteLine("Calibration outcome: {0} and error: {1}", result.MinimizerStatus, result.PricingError); }
/// <summary> /// Add new market data. /// </summary> /// <param name="euOption">European option.</param> /// <param name="price">European option Price</param> public void AddObservedOption(EuropeanOption euOption, double price) { OptionMarketData <EuropeanOption> newMarketOption = new OptionMarketData <EuropeanOption>(euOption, price); marketOptionsList.AddLast(newMarketOption); }