private YieldTermStructure Zerocurve(List <Date> dates, List <double> yields, DayCounter dayCounter) { YieldTermStructure yieldts; // = FastActivator<YieldTermStructure>.Create(); switch (_interpolationMethod) { case InterpolationMethod.Linear: yieldts = new InterpolatedZeroCurve <Linear>(dates, yields, dayCounter, new Linear()); break; case InterpolationMethod.LogLinear: yieldts = new InterpolatedZeroCurve <LogLinear>(dates, yields, dayCounter, new LogLinear()); break; case InterpolationMethod.NaturalCubic: yieldts = new InterpolatedZeroCurve <Cubic>(dates, yields, dayCounter, new Cubic(CubicInterpolation.DerivativeApprox.Kruger, true, CubicInterpolation.BoundaryCondition.SecondDerivative, 0.0, CubicInterpolation.BoundaryCondition.SecondDerivative, 0.0)); break; case InterpolationMethod.FinancialCubic: yieldts = new InterpolatedZeroCurve <Cubic>( dates, yields, dayCounter, new Cubic(CubicInterpolation.DerivativeApprox.Kruger, true, CubicInterpolation.BoundaryCondition.SecondDerivative, 0.0, CubicInterpolation.BoundaryCondition.FirstDerivative, 0.0)); break; case InterpolationMethod.ConvexMonotone: yieldts = new InterpolatedZeroCurve <ConvexMonotone>(dates, yields, dayCounter); break; default: Utils.QL_FAIL("Interpolation method not recognised."); throw new Exception(); } return(yieldts); }
public void testFixing() { Date tradeDate = new Date(17, Month.April, 2015); Calendar calendar = new UnitedKingdom(); Date settlementDate = calendar.advance(tradeDate, 2, TimeUnit.Days, BusinessDayConvention.Following); Date maturityDate = calendar.advance(settlementDate, 5, TimeUnit.Years, BusinessDayConvention.Following); Date valueDate = new Date(20, Month.April, 2015); Settings.setEvaluationDate(valueDate); List <Date> dates = new List <Date>(); dates.Add(valueDate); dates.Add(valueDate + new Period(1, TimeUnit.Years)); dates.Add(valueDate + new Period(2, TimeUnit.Years)); dates.Add(valueDate + new Period(5, TimeUnit.Years)); dates.Add(valueDate + new Period(10, TimeUnit.Years)); dates.Add(valueDate + new Period(20, TimeUnit.Years)); List <double> rates = new List <double>(); rates.Add(0.01); rates.Add(0.01); rates.Add(0.01); rates.Add(0.01); rates.Add(0.01); rates.Add(0.01); var discountCurveHandle = new RelinkableHandle <YieldTermStructure>(); var forecastCurveHandle = new RelinkableHandle <YieldTermStructure>(); GBPLibor index = new GBPLibor(new Period(6, TimeUnit.Months), forecastCurveHandle); InterpolatedZeroCurve <Linear> zeroCurve = new InterpolatedZeroCurve <Linear>(dates, rates, new Actual360(), new Linear()); var fixedSchedule = new Schedule(settlementDate, maturityDate, new Period(1, TimeUnit.Years), calendar, BusinessDayConvention.Following, BusinessDayConvention.Following, DateGeneration.Rule.Forward, false); var floatSchedule = new Schedule(settlementDate, maturityDate, index.tenor(), calendar, BusinessDayConvention.Following, BusinessDayConvention.Following, DateGeneration.Rule.Forward, false); VanillaSwap swap = new VanillaSwap(VanillaSwap.Type.Payer, 1000000, fixedSchedule, 0.01, new Actual360(), floatSchedule, index, 0, new Actual360()); discountCurveHandle.linkTo(zeroCurve); forecastCurveHandle.linkTo(zeroCurve); var swapEngine = new DiscountingSwapEngine(discountCurveHandle, false, null); swap.setPricingEngine(swapEngine); try { double npv = swap.NPV(); } catch (Exception ex) { Assert.Fail(ex.Message); Console.WriteLine(ex); } }
// *********************************** // EXTRACTING DIVIDEND TERM STRUCTURE // *********************************** public Handle <YieldTermStructure> dividend_FwdCrv() { YieldTermStructure crv; if (_isNewFormat == false) { QLNet_Results res = dividend.GetDividendDF_TermStructure(impliedSpot, forward.data, DF.data); crv = new InterpolatedDiscountCurve <Cubic>(res.timeStamps(), res.dataPoints(), dayCounter()); //InterpolatedDiscountCurve<Cubic> } else { QLNet_Results res = dividend.GetDividendDF_TermStructure_NewFormat(); crv = new InterpolatedZeroCurve <Linear>(res.timeStamps(), res.dataPoints(), _dayCounter, _calendar); //InterpolatedZeroCurve<Linear> //(res.timeStamps(), res.dataPoints(), dayCounter()); } return(new Handle <YieldTermStructure>(crv)); }
public void testInterpolatedZeroCurveWithRefDateAndTenorDates() { CommonVars vars = new CommonVars(); // Create the interpolated curve var refDate = new Date(1, 10, 2015); var dates = new List <Date>() { new Date(30, 12, 2015), new Date(30, 3, 2016), new Date(30, 9, 2016), new Date(29, 9, 2017), new Date(28, 9, 2018), new Date(30, 9, 2019), new Date(30, 9, 2020), new Date(30, 9, 2021), new Date(30, 9, 2022), new Date(29, 9, 2023), new Date(30, 9, 2024), new Date(30, 9, 2025), new Date(30, 9, 2030), new Date(28, 9, 2035), new Date(29, 9, 2045), }; var yields = new List <double>() { -0.002558362, -0.002478462, -0.00248845, -0.002498437, -0.00196903, -0.001219628, -0.000209989, 0.000940221, 0.00220121, 0.003493045, 0.004785712, 0.00602906, 0.010909594, 0.013132837, 0.01403893 }; var curve = new InterpolatedZeroCurve <Linear>(dates, yields, new ActualActual(ActualActual.Convention.ISMA), new Linear(), Compounding.Continuous, Frequency.Annual, refDate); Dictionary <Date, double> tenors2 = new Dictionary <Date, double> { { new Date(30, 12, 2015), -0.002558362 }, { new Date(30, 3, 2016), -0.002478462 }, { new Date(30, 9, 2016), -0.00248845 }, { new Date(29, 9, 2017), -0.002498437 }, { new Date(28, 9, 2018), -0.00196903 }, { new Date(30, 9, 2019), -0.001219628 }, { new Date(30, 9, 2020), -0.000209989 }, { new Date(30, 9, 2021), 0.000940221 }, { new Date(30, 9, 2022), 0.00220121 }, { new Date(29, 9, 2023), 0.003493045 }, { new Date(30, 9, 2024), 0.004785712 }, { new Date(30, 9, 2025), 0.00602906 }, { new Date(30, 9, 2030), 0.010909594 }, { new Date(28, 9, 2035), 0.013132837 }, { new Date(29, 9, 2045), 0.01403893 } }; // Make sure the points come back as expected var tenors = new[] { 0.25, 0.5, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 15.0, 20.0, 30.0 }; for (int i = 0; i < tenors.Length; i++) { var test = curve.interpolation_.value(tenors[i], true); QAssert.AreEqual(yields[i], test); } QAssert.AreNotEqual(yields[0], curve.interpolation_.value(0.0, true)); }
// setup public CommonVars() { backup = new SavedSettings(); nominalUK = new RelinkableHandle <YieldTermStructure>(); cpiUK = new RelinkableHandle <ZeroInflationTermStructure>(); hcpi = new RelinkableHandle <ZeroInflationTermStructure>(); zciisD = new List <Date>(); zciisR = new List <double>(); hii = new RelinkableHandle <ZeroInflationIndex>(); nominals = new InitializedList <double>(1, 1000000); // option variables frequency = Frequency.Annual; // usual setup volatility = 0.01; length = 7; calendar = new UnitedKingdom(); convention = BusinessDayConvention.ModifiedFollowing; Date today = new Date(1, Month.June, 2010); evaluationDate = calendar.adjust(today); Settings.setEvaluationDate(evaluationDate); settlementDays = 0; fixingDays = 0; settlement = calendar.advance(today, settlementDays, TimeUnit.Days); startDate = settlement; dcZCIIS = new ActualActual(); dcNominal = new ActualActual(); // uk rpi index // fixing data Date from = new Date(1, Month.July, 2007); Date to = new Date(1, Month.June, 2010); Schedule rpiSchedule = new MakeSchedule().from(from).to(to) .withTenor(new Period(1, TimeUnit.Months)) .withCalendar(new UnitedKingdom()) .withConvention(BusinessDayConvention.ModifiedFollowing).value(); double[] fixData = { 206.1, 207.3, 208.0, 208.9, 209.7, 210.9, 209.8, 211.4, 212.1, 214.0, 215.1, 216.8, // 2008 216.5, 217.2, 218.4, 217.7, 216.0, 212.9, 210.1, 211.4, 211.3, 211.5, 212.8, 213.4, // 2009 213.4, 214.4, 215.3, 216.0, 216.6, 218.0, 217.9, 219.2, 220.7, 222.8, -999, -999, // 2010 -999 }; // link from cpi index to cpi TS bool interp = false;// this MUST be false because the observation lag is only 2 months // for ZCIIS; but not for contract if the contract uses a bigger lag. ii = new UKRPI(interp, hcpi); for (int i = 0; i < rpiSchedule.Count; i++) { ii.addFixing(rpiSchedule[i], fixData[i], true);// force overwrite in case multiple use } Datum[] nominalData = { new Datum(new Date(2, Month.June, 2010), 0.499997), new Datum(new Date(3, Month.June, 2010), 0.524992), new Datum(new Date(8, Month.June, 2010), 0.524974), new Datum(new Date(15, Month.June, 2010), 0.549942), new Datum(new Date(22, Month.June, 2010), 0.549913), new Datum(new Date(1, Month.July, 2010), 0.574864), new Datum(new Date(2, Month.August, 2010), 0.624668), new Datum(new Date(1, Month.September, 2010), 0.724338), new Datum(new Date(16, Month.September, 2010), 0.769461), new Datum(new Date(1, Month.December, 2010), 0.997501), //{ Date( 16, December, 2010), 0.838164 ), new Datum(new Date(17, Month.March, 2011), 0.916996), new Datum(new Date(16, Month.June, 2011), 0.984339), new Datum(new Date(22, Month.September, 2011), 1.06085), new Datum(new Date(22, Month.December, 2011), 1.141788), new Datum(new Date(1, Month.June, 2012), 1.504426), new Datum(new Date(3, Month.June, 2013), 1.92064), new Datum(new Date(2, Month.June, 2014), 2.290824), new Datum(new Date(1, Month.June, 2015), 2.614394), new Datum(new Date(1, Month.June, 2016), 2.887445), new Datum(new Date(1, Month.June, 2017), 3.122128), new Datum(new Date(1, Month.June, 2018), 3.322511), new Datum(new Date(3, Month.June, 2019), 3.483997), new Datum(new Date(1, Month.June, 2020), 3.616896), new Datum(new Date(1, Month.June, 2022), 3.8281), new Datum(new Date(2, Month.June, 2025), 4.0341), new Datum(new Date(3, Month.June, 2030), 4.070854), new Datum(new Date(1, Month.June, 2035), 4.023202), new Datum(new Date(1, Month.June, 2040), 3.954748), new Datum(new Date(1, Month.June, 2050), 3.870953), new Datum(new Date(1, Month.June, 2060), 3.85298), new Datum(new Date(2, Month.June, 2070), 3.757542), new Datum(new Date(3, Month.June, 2080), 3.651379) }; int nominalDataLength = 33 - 1; List <Date> nomD = new List <Date>(); List <double> nomR = new List <double>(); for (int i = 0; i < nominalDataLength; i++) { nomD.Add(nominalData[i].date); nomR.Add(nominalData[i].rate / 100.0); } YieldTermStructure nominalTS = new InterpolatedZeroCurve <Linear>(nomD, nomR, dcNominal); nominalUK.linkTo(nominalTS); // now build the zero inflation curve observationLag = new Period(2, TimeUnit.Months); contractObservationLag = new Period(3, TimeUnit.Months); contractObservationInterpolation = InterpolationType.Flat; Datum[] zciisData = { new Datum(new Date(1, Month.June, 2011), 3.087), new Datum(new Date(1, Month.June, 2012), 3.12), new Datum(new Date(1, Month.June, 2013), 3.059), new Datum(new Date(1, Month.June, 2014), 3.11), new Datum(new Date(1, Month.June, 2015), 3.15), new Datum(new Date(1, Month.June, 2016), 3.207), new Datum(new Date(1, Month.June, 2017), 3.253), new Datum(new Date(1, Month.June, 2018), 3.288), new Datum(new Date(1, Month.June, 2019), 3.314), new Datum(new Date(1, Month.June, 2020), 3.401), new Datum(new Date(1, Month.June, 2022), 3.458), new Datum(new Date(1, Month.June, 2025), 3.52), new Datum(new Date(1, Month.June, 2030), 3.655), new Datum(new Date(1, Month.June, 2035), 3.668), new Datum(new Date(1, Month.June, 2040), 3.695), new Datum(new Date(1, Month.June, 2050), 3.634), new Datum(new Date(1, Month.June, 2060), 3.629), }; zciisDataLength = 17; for (int i = 0; i < zciisDataLength; i++) { zciisD.Add(zciisData[i].date); zciisR.Add(zciisData[i].rate); } // now build the helpers ... List <BootstrapHelper <ZeroInflationTermStructure> > helpers = makeHelpers(zciisData, zciisDataLength, ii, observationLag, calendar, convention, dcZCIIS); // we can use historical or first ZCIIS for this // we know historical is WAY off market-implied, so use market implied flat. baseZeroRate = zciisData[0].rate / 100.0; PiecewiseZeroInflationCurve <Linear> pCPIts = new PiecewiseZeroInflationCurve <Linear>( evaluationDate, calendar, dcZCIIS, observationLag, ii.frequency(), ii.interpolated(), baseZeroRate, new Handle <YieldTermStructure>(nominalTS), helpers); pCPIts.recalculate(); cpiUK.linkTo(pCPIts); hii.linkTo(ii); // make sure that the index has the latest zero inflation term structure hcpi.linkTo(pCPIts); // cpi CF price surf data Period[] cfMat = { new Period(3, TimeUnit.Years), new Period(5, TimeUnit.Years), new Period(7, TimeUnit.Years), new Period(10, TimeUnit.Years), new Period(15, TimeUnit.Years), new Period(20, TimeUnit.Years), new Period(30, TimeUnit.Years) }; double[] cStrike = { 3, 4, 5, 6 }; double[] fStrike = { -1, 0, 1, 2 }; int ncStrikes = 4, nfStrikes = 4, ncfMaturities = 7; double[][] cPrice = { new double[4] { 227.6, 100.27, 38.8, 14.94 }, new double[4] { 345.32, 127.9, 40.59, 14.11 }, new double[4] { 477.95, 170.19, 50.62, 16.88 }, new double[4] { 757.81, 303.95, 107.62, 43.61 }, new double[4] { 1140.73, 481.89, 168.4, 63.65 }, new double[4] { 1537.6, 607.72, 172.27, 54.87 }, new double[4] { 2211.67, 839.24, 184.75, 45.03 } }; double[][] fPrice = { new double[4] { 15.62, 28.38, 53.61, 104.6 }, new double[4] { 21.45, 36.73, 66.66, 129.6 }, new double[4] { 24.45, 42.08, 77.04, 152.24 }, new double[4] { 39.25, 63.52, 109.2, 203.44 }, new double[4] { 36.82, 63.62, 116.97, 232.73 }, new double[4] { 39.7, 67.47, 121.79, 238.56 }, new double[4] { 41.48, 73.9, 139.75, 286.75 } }; // now load the data into vector and Matrix classes cStrikesUK = new List <double>(); fStrikesUK = new List <double>(); cfMaturitiesUK = new List <Period>(); for (int i = 0; i < ncStrikes; i++) { cStrikesUK.Add(cStrike[i]); } for (int i = 0; i < nfStrikes; i++) { fStrikesUK.Add(fStrike[i]); } for (int i = 0; i < ncfMaturities; i++) { cfMaturitiesUK.Add(cfMat[i]); } cPriceUK = new Matrix(ncStrikes, ncfMaturities); fPriceUK = new Matrix(nfStrikes, ncfMaturities); for (int i = 0; i < ncStrikes; i++) { for (int j = 0; j < ncfMaturities; j++) { (cPriceUK)[i, j] = cPrice[j][i] / 10000.0; } } for (int i = 0; i < nfStrikes; i++) { for (int j = 0; j < ncfMaturities; j++) { (fPriceUK)[i, j] = fPrice[j][i] / 10000.0; } } }
public QLNet.YieldTermStructure yieldCurve(CurveShift curveShift = null) { if (curveShift == null) curveShift = new ParallelCurveShift(0.0); QLNet.DayCounter dc = new QLNet.Actual365Fixed(); List<Handle<Quote>> quotes = new List<Handle<Quote>>(); List<double> datas = new List<double>(); List<Date> dates = new List<Date>(); CalendarManager cm = new CalendarManager(this.ReferenceDate_, CalendarManager.CountryType.SOUTH_KOREA); foreach (clsHDAT_CURVEDATA_TB tb in this.ResultCuveData_) { DateTime dt = cm.adjust(this.ReferenceDate_,tb.TENOR); double? rate = tb.RATE + curveShift.shift(dt); dates.Add(dt); SimpleQuote quote = new SimpleQuote(rate); Handle<Quote> handleQuote = new Handle<Quote>(quote); quotes.Add(handleQuote); datas.Add(rate.Value); } InterpolatedZeroCurve<ConvexMonotone> yiels_ts = new InterpolatedZeroCurve<ConvexMonotone>( this.ReferenceDate_, dates, datas, dc, new ConvexMonotone(), Compounding.Compounded, Frequency.Annual); return yiels_ts; }
// setup public CommonVars() { backup = new SavedSettings(); cleaner = new IndexHistoryCleaner(); nominalUK = new RelinkableHandle <YieldTermStructure>(); cpiUK = new RelinkableHandle <ZeroInflationTermStructure>(); hcpi = new RelinkableHandle <ZeroInflationTermStructure>(); zciisD = new List <Date>(); zciisR = new List <double>(); hii = new RelinkableHandle <ZeroInflationIndex>(); nominals = new InitializedList <double>(1, 1000000); // option variables frequency = Frequency.Annual; // usual setup volatility = 0.01; length = 7; calendar = new UnitedKingdom(); convention = BusinessDayConvention.ModifiedFollowing; Date today = new Date(25, Month.November, 2009); evaluationDate = calendar.adjust(today); Settings.setEvaluationDate(evaluationDate); settlementDays = 0; fixingDays = 0; settlement = calendar.advance(today, settlementDays, TimeUnit.Days); startDate = settlement; dcZCIIS = new ActualActual(); dcNominal = new ActualActual(); // uk rpi index // fixing data Date from = new Date(20, Month.July, 2007); Date to = new Date(20, Month.November, 2009); Schedule rpiSchedule = new MakeSchedule().from(from).to(to) .withTenor(new Period(1, TimeUnit.Months)) .withCalendar(new UnitedKingdom()) .withConvention(BusinessDayConvention.ModifiedFollowing).value(); double[] fixData = { 206.1, 207.3, 208.0, 208.9, 209.7, 210.9, 209.8, 211.4, 212.1, 214.0, 215.1, 216.8, 216.5, 217.2, 218.4, 217.7, 216, 212.9, 210.1, 211.4, 211.3, 211.5, 212.8, 213.4, 213.4, 213.4, 214.4, -999.0, -999.0 }; // link from cpi index to cpi TS bool interp = false;// this MUST be false because the observation lag is only 2 months // for ZCIIS; but not for contract if the contract uses a bigger lag. ii = new UKRPI(interp, hcpi); for (int i = 0; i < rpiSchedule.Count; i++) { ii.addFixing(rpiSchedule[i], fixData[i], true);// force overwrite in case multiple use } Datum[] nominalData = { new Datum(new Date(26, Month.November, 2009), 0.475), new Datum(new Date(2, Month.December, 2009), 0.47498), new Datum(new Date(29, Month.December, 2009), 0.49988), new Datum(new Date(25, Month.February, 2010), 0.59955), new Datum(new Date(18, Month.March, 2010), 0.65361), new Datum(new Date(25, Month.May, 2010), 0.82830), new Datum(new Date(17, Month.June, 2010), 0.7), new Datum(new Date(16, Month.September, 2010), 0.78960), new Datum(new Date(16, Month.December, 2010), 0.93762), new Datum(new Date(17, Month.March, 2011), 1.12037), new Datum(new Date(22, Month.September, 2011), 1.52011), new Datum(new Date(25, Month.November, 2011), 1.78399), new Datum(new Date(26, Month.November, 2012), 2.41170), new Datum(new Date(25, Month.November, 2013), 2.83935), new Datum(new Date(25, Month.November, 2014), 3.12888), new Datum(new Date(25, Month.November, 2015), 3.34298), new Datum(new Date(25, Month.November, 2016), 3.50632), new Datum(new Date(27, Month.November, 2017), 3.63666), new Datum(new Date(26, Month.November, 2018), 3.74723), new Datum(new Date(25, Month.November, 2019), 3.83988), new Datum(new Date(25, Month.November, 2021), 4.00508), new Datum(new Date(25, Month.November, 2024), 4.16042), new Datum(new Date(26, Month.November, 2029), 4.15577), new Datum(new Date(27, Month.November, 2034), 4.04933), new Datum(new Date(25, Month.November, 2039), 3.95217), new Datum(new Date(25, Month.November, 2049), 3.80932), new Datum(new Date(25, Month.November, 2059), 3.80849), new Datum(new Date(25, Month.November, 2069), 3.72677), new Datum(new Date(27, Month.November, 2079), 3.63082) }; int nominalDataLength = 30 - 1; List <Date> nomD = new List <Date>(); List <double> nomR = new List <double>(); for (int i = 0; i < nominalDataLength; i++) { nomD.Add(nominalData[i].date); nomR.Add(nominalData[i].rate / 100.0); } YieldTermStructure nominal = new InterpolatedZeroCurve <Linear>(nomD, nomR, dcNominal); nominalUK.linkTo(nominal); // now build the zero inflation curve observationLag = new Period(2, TimeUnit.Months); contractObservationLag = new Period(3, TimeUnit.Months); contractObservationInterpolation = InterpolationType.Flat; Datum[] zciisData = { new Datum(new Date(25, Month.November, 2010), 3.0495), new Datum(new Date(25, Month.November, 2011), 2.93), new Datum(new Date(26, Month.November, 2012), 2.9795), new Datum(new Date(25, Month.November, 2013), 3.029), new Datum(new Date(25, Month.November, 2014), 3.1425), new Datum(new Date(25, Month.November, 2015), 3.211), new Datum(new Date(25, Month.November, 2016), 3.2675), new Datum(new Date(25, Month.November, 2017), 3.3625), new Datum(new Date(25, Month.November, 2018), 3.405), new Datum(new Date(25, Month.November, 2019), 3.48), new Datum(new Date(25, Month.November, 2021), 3.576), new Datum(new Date(25, Month.November, 2024), 3.649), new Datum(new Date(26, Month.November, 2029), 3.751), new Datum(new Date(27, Month.November, 2034), 3.77225), new Datum(new Date(25, Month.November, 2039), 3.77), new Datum(new Date(25, Month.November, 2049), 3.734), new Datum(new Date(25, Month.November, 2059), 3.714) }; zciisDataLength = 17; for (int i = 0; i < zciisDataLength; i++) { zciisD.Add(zciisData[i].date); zciisR.Add(zciisData[i].rate); } // now build the helpers ... List <BootstrapHelper <ZeroInflationTermStructure> > helpers = makeHelpers(zciisData, zciisDataLength, ii, observationLag, calendar, convention, dcZCIIS); // we can use historical or first ZCIIS for this // we know historical is WAY off market-implied, so use market implied flat. double baseZeroRate = zciisData[0].rate / 100.0; PiecewiseZeroInflationCurve <Linear> pCPIts = new PiecewiseZeroInflationCurve <Linear>( evaluationDate, calendar, dcZCIIS, observationLag, ii.frequency(), ii.interpolated(), baseZeroRate, new Handle <YieldTermStructure>(nominalUK), helpers); pCPIts.recalculate(); cpiUK.linkTo(pCPIts); // make sure that the index has the latest zero inflation term structure hcpi.linkTo(pCPIts); }
public void testFixing() { Date tradeDate = new Date( 17, Month.April, 2015 ); Calendar calendar = new UnitedKingdom(); Date settlementDate = calendar.advance( tradeDate, 2, TimeUnit.Days, BusinessDayConvention.Following ); Date maturityDate = calendar.advance( settlementDate, 5, TimeUnit.Years, BusinessDayConvention.Following ); Date valueDate = new Date( 20, Month.April, 2015 ); Settings.setEvaluationDate( valueDate ); List<Date> dates = new List<Date>(); dates.Add( valueDate ); dates.Add( valueDate + new Period( 1, TimeUnit.Years ) ); dates.Add( valueDate + new Period( 2, TimeUnit.Years ) ); dates.Add( valueDate + new Period( 5, TimeUnit.Years ) ); dates.Add( valueDate + new Period( 10, TimeUnit.Years ) ); dates.Add( valueDate + new Period( 20, TimeUnit.Years ) ); List<double> rates = new List<double>(); rates.Add( 0.01 ); rates.Add( 0.01 ); rates.Add( 0.01 ); rates.Add( 0.01 ); rates.Add( 0.01 ); rates.Add( 0.01 ); var discountCurveHandle = new RelinkableHandle<YieldTermStructure>(); var forecastCurveHandle = new RelinkableHandle<YieldTermStructure>(); GBPLibor index = new GBPLibor( new Period( 6, TimeUnit.Months ), forecastCurveHandle ); InterpolatedZeroCurve<Linear> zeroCurve = new InterpolatedZeroCurve<Linear>( dates, rates, new Actual360(), new Linear() ); var fixedSchedule = new Schedule( settlementDate, maturityDate, new Period( 1, TimeUnit.Years ), calendar, BusinessDayConvention.Following, BusinessDayConvention.Following, DateGeneration.Rule.Forward, false ); var floatSchedule = new Schedule( settlementDate, maturityDate, index.tenor(), calendar, BusinessDayConvention.Following, BusinessDayConvention.Following, DateGeneration.Rule.Forward, false ); VanillaSwap swap = new VanillaSwap( VanillaSwap.Type.Payer, 1000000, fixedSchedule, 0.01, new Actual360(), floatSchedule, index, 0, new Actual360() ); discountCurveHandle.linkTo( zeroCurve ); forecastCurveHandle.linkTo( zeroCurve ); var swapEngine = new DiscountingSwapEngine( discountCurveHandle, false, null ); swap.setPricingEngine( swapEngine ); try { double npv = swap.NPV(); } catch ( Exception ex ) { Assert.Fail( ex.Message ); Console.WriteLine( ex ); } }