public void DoubleBarrierOptionTest() { //var nsimu = new[] {1000, 10000, 20000, 100000, 500000}; var nsimu = new[] { 100, 200, 300 }; var mcTrials = 6; var mc = new[] { true, false }; var marketInfo = TestMarket(); MarketFunctions.BuildMarket(marketInfo, out QdpMarket market); Console.WriteLine("NSimulation,TrialNum,PV,Delta,Gamma,Vega,Rho,Theta"); for (var k = 0; k < nsimu.Length; k++) { for (var i = 0; i < mc.Length; ++i) { var trial = mc[i] ? mcTrials : 1; for (var j = 0; j < trial; j++) { var barrierOptionInfo = new BarrierOptionInfo ("", strike: 1.05, underlyingTicker: "", underlyingInstrumentType: "EquityIndex", valuationParameter: new OptionValuationParameters("Fr007", "Dividend", "VolSurf", "000300.SH"), startDate: "2016-12-13", exerciseDates: "2017-12-13", optionType: "Call", exercise: "European", calendar: "chn", dayCount: "Act365", notional: 1000000, monteCarlo: mc[i], parallelDegree: 1, nsimulations: nsimu[k] ) { BarrierType = "DoubleTouchOut", Barrier = 0.75, //80% of S0//1e-6 UpperBarrier = 1.25, //120% of S0 //1e6 Coupon = 0.01, ParticipationRate = 1.0, Rebate = 0.02, Fixings = "2016-12-12,0.995;2016-12-13,1.0", UseFourier = true, }; var barrierOptionVf = new BarrierOptionVf(barrierOptionInfo); var result = barrierOptionVf.ValueTrade(market, PricingRequest.All); Console.WriteLine("{0},{1},{2},{3},{4},{5},{6},{7}", nsimu[k], mc[i] ? "MonteCarlo" : "Analytical", result.Pv, result.Delta, result.Gamma, result.Vega, result.Rho, result.Theta); } } } }
public static IValuationFunction ToVf(TradeInfoBase tradeInfo) { IValuationFunction vf; // sean todo // tradeInfo.GetValuationFunction if (tradeInfo is BondInfoBase) { vf = new BondVf((BondInfoBase)tradeInfo); } else if (tradeInfo is VanillaOptionInfo) { vf = new VanillaOptionVf((VanillaOptionInfo)tradeInfo); } else if (tradeInfo is BarrierOptionInfo) { vf = new BarrierOptionVf((BarrierOptionInfo)tradeInfo); } else if (tradeInfo is BinaryOptionInfo) { vf = new BinaryOptionVf((BinaryOptionInfo)tradeInfo); } else if (tradeInfo is AsianOptionInfo) { vf = new AsianOptionVf((AsianOptionInfo)tradeInfo); } else if (tradeInfo is RainbowOptionInfo) { vf = new RainbowOptionVf((RainbowOptionInfo)tradeInfo); } else if (tradeInfo is SpreadOptionInfo) { vf = new SpreadOptionVf((SpreadOptionInfo)tradeInfo); } else if (tradeInfo is InterestRateSwapInfo) { vf = new InterestRateSwapVf((InterestRateSwapInfo)tradeInfo); } else if (tradeInfo is FixedLegInfo) { vf = new FixedLegVf((FixedLegInfo)tradeInfo); } else if (tradeInfo is FloatingLegInfo) { vf = new FloatingLegVf((FloatingLegInfo)tradeInfo); } else if (tradeInfo is BondFuturesInfo) { vf = new BondFuturesVf((BondFuturesInfo)tradeInfo); } else if (tradeInfo is LoanInfo) { vf = new LoanVf((LoanInfo)tradeInfo); } else if (tradeInfo is HoldingPeriodInfo) { vf = new HoldingPeriodVf((HoldingPeriodInfo)tradeInfo); } else if (tradeInfo is AbsWithRepurchaseInfo) { vf = new AbsWithRepurchaseVf((AbsWithRepurchaseInfo)tradeInfo); } else if (tradeInfo is ConvertibleBondInfo) { vf = new ConvertibleBondVf((ConvertibleBondInfo)tradeInfo); } else { throw new PricingLibraryException("Unknowy trade info type"); } return(vf); }