public T_PiecewiseyieldCurve() { #endif backup = new SavedSettings(); cleaner = new IndexHistoryCleaner(); }
// 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); }