public double[,] Analytic(Parameters parameters, Types.OptionType optionType) { var pVArray = default(double[, ]); switch (optionType) { case Types.OptionType.Vanilla: pVArray = OptionVanilla.MakeAnalyticPVArray( new double[parameters.TNum, parameters.XNum[0]], parameters.BoundaryPrice, parameters.Strike, parameters.Maturity, parameters.DomesticRate, parameters.ForeignRate, parameters.Volatility, parameters.IsCall); break; case Types.OptionType.Barrier: pVArray = OptionBarrier.MakeAnalyticPVArray( new double[parameters.TNum, parameters.XNum[0]], parameters.BoundaryPrice, parameters.Strike, parameters.Maturity, parameters.DomesticRate, parameters.ForeignRate, parameters.Volatility, parameters.Barrier, parameters.IsCall); break; } return(pVArray); }
public double[,] FDM(Parameters parameters, Types.OptionType optionType, Types.MethodType methodType) { var pVArray = default(double[, ]); switch (optionType) { case Types.OptionType.Vanilla: pVArray = OptionVanilla.SetInitialCondition( new double[parameters.TNum, parameters.XNum[0]], parameters.BoundaryPrice, parameters.Strike, parameters.IsCall); pVArray = OptionVanilla.SetBoundaryCondition( pVArray, parameters.BoundaryPrice, parameters.Strike, parameters.IsCall); pVArray = MethodTheta.CalculatePVArray( methodType, pVArray, parameters.BoundaryPrice, parameters.Maturity, parameters.DomesticRate, parameters.ForeignRate, parameters.Volatility); break; case Types.OptionType.Barrier: pVArray = OptionBarrier.SetInitialCondition( new double[parameters.TNum, parameters.XNum[0]], parameters.BoundaryPrice, parameters.Strike, parameters.Barrier, parameters.IsCall); pVArray = OptionBarrier.SetBoundaryCondition(pVArray); pVArray = MethodTheta.CalculatePVArray( methodType, pVArray, parameters.BoundaryPrice, parameters.Maturity, parameters.DomesticRate, parameters.ForeignRate, parameters.Volatility); break; } return(pVArray); }
public static Parameters[] ForVerification(Types.OptionType optionType) { var xNumArray = MakeXNumArray(); int xNumNum = xNumArray.GetLength(0); var parameters = Original(optionType); var parametersArray = new Parameters[xNumNum]; for (int j = 0; j < xNumNum; j++) { switch (optionType) { case Types.OptionType.Vanilla: parametersArray[j] = new Parameters( parameters.TNum, new int[] { xNumArray[j] }, parameters.Maturity, parameters.BoundaryPrice, parameters.Strike, parameters.DomesticRate, parameters.ForeignRate, parameters.Volatility, parameters.IsCall); break; case Types.OptionType.Barrier: parametersArray[j] = new Parameters( parameters.TNum, new int[] { xNumArray[j] }, parameters.Maturity, parameters.BoundaryPrice, parameters.Strike, parameters.DomesticRate, parameters.ForeignRate, parameters.Volatility, parameters.Barrier, parameters.IsCall); break; case Types.OptionType.Exchange: parametersArray[j] = new Parameters( parameters.TNum, new int[] { xNumArray[j] }, parameters.Maturity, parameters.BoundaryPrice, parameters.DomesticRate, parameters.ForeignRate, parameters.Volatility, parameters.Correlation); break; } } return(parametersArray); }
private static void MergeIndexAndValue( StreamWriter file, Types.OptionType optionType) { WriteIndex(file, optionType); WriteError(file, optionType, Types.MethodType.Explicit); WriteError(file, optionType, Types.MethodType.Implicit); WriteError(file, optionType, Types.MethodType.CrankNicolson); file.Close(); }
private static void WriteIndex(StreamWriter file, Types.OptionType optionType) { var parameters = ParametersFactory.Original(optionType); var xArray = ParametersFactory.MakeXArray(parameters); int xNum = xArray.GetLength(0); file.Write(","); for (int j = 0; j < xNum; j++) { file.Write(xArray[j] + ","); } file.WriteLine(); }
private static void WriteError(StreamWriter file, Types.OptionType optionType, Types.MethodType methodType) { var parameters = ParametersFactory.ForVerification(optionType); var xNumArray = ParametersFactory.MakeXNumArray(); int xNumNum = xNumArray.GetLength(0); file.Write(","); for (int j = 0; j < xNumNum; j++) { var makePVArray = new MakePVArrayOneAsset(); var analyticArray = makePVArray.Analytic(parameters[j], optionType); var fDMArray = makePVArray.FDM(parameters[j], optionType, methodType); double error = CalculateErrorOneAsset.MaxAbsolute(fDMArray, analyticArray); file.Write(error + ","); } file.WriteLine(); }
private static void WriteError(StreamWriter file, Types.OptionType optionType, Types.MethodType methodType) { var parameters = ParametersFactory.Original(optionType); var xArray = ParametersFactory.MakeXArray(parameters); int xNum = xArray.GetLength(0); var errorArray = new double[xNum]; file.Write(","); for (int j = 0; j < xNum; j++) { var makePVArray = new MakePVArrayOneAsset(); var analyticArray = makePVArray.Analytic(parameters, optionType); var fDMArray = makePVArray.FDM(parameters, optionType, methodType); errorArray[j] = CalculateErrorOneAsset.AbsoluteArray(fDMArray, analyticArray)[j]; file.Write(errorArray[j] + ","); } file.WriteLine(); }
public static Parameters Original(Types.OptionType optionType) { var parameters = default(Parameters); switch (optionType) { case Types.OptionType.Vanilla: parameters = new Parameters( 10, // tNum new int[] { 400 }, // xNum 0.4, // maturity new double[] { Math.Log(200) }, // boundaryPrice 100, // strike 0, // domesticRate new double[] { 2e-2 }, // foreignRate new double[] { 0.2 }, // volatility true // isCall ); break; case Types.OptionType.Barrier: parameters = new Parameters( 10, // tNum new int[] { 400 }, // xNum 0.4, // maturity new double[] { Math.Log(200) }, // boundaryPrice 100, // strike 0, // domesticRate new double[] { 2e-2 }, // foreignRate new double[] { 0.2 }, // volatility 110, // barrier true // isCall ); break; } return(parameters); }