final double faceAmount = 1000000.0;
// with implicit settlement calculation:
final Calendar bondCalendar = new NullCalendar();
final DayCounter bondDayCount = new ActualActual(ActualActual.Convention.ISMA);
final int settlementDays = 1;
final Handle<YieldTermStructure> discountCurve = new Handle<YieldTermStructure>(Utilities.flatRate(today, 0.03, new Actual360()));
// actual market values from the evaluation date
final Frequency freq = Frequency.Semiannual;
final Schedule sch1 = new Schedule(new Date(31, Month.October, 2004),
new Date(31, Month.October, 2006), new Period(freq), bondCalendar,
BusinessDayConvention.Unadjusted, BusinessDayConvention.Unadjusted, DateGeneration.Rule.Backward, false);
final FixedRateBond bond1 = new FixedRateBond(settlementDays, faceAmount, sch1,
new double[] {0.025},
bondDayCount, BusinessDayConvention.ModifiedFollowing,
100.0, new Date(1, Month.November, 2004));
final PricingEngine bondEngine = new DiscountingBondEngine(discountCurve);
bond1.setPricingEngine(bondEngine);
final double marketPrice1 = 99.203125;
final double marketYield1 = 0.02925;
final Schedule sch2 = new Schedule(new Date(15, Month.November, 2004),
new Date(15, Month.November, 2009), new Period(freq), bondCalendar,
BusinessDayConvention.Unadjusted, BusinessDayConvention.Unadjusted, DateGeneration.Rule.Backward, false);
final FixedRateBond bond2 = new FixedRateBond(settlementDays, faceAmount, sch2,
new double [] {0.035},
bondDayCount, BusinessDayConvention.ModifiedFollowing,
100.0, new Date(15, Month.November, 2004));
bond2.setPricingEngine(bondEngine);
final double marketPrice2 = 99.6875;
final double marketYield2 = 0.03569;
// calculated values
final double cachedPrice1a = 99.204505, cachedPrice2a = 99.687192;
final double cachedPrice1b = 98.943393, cachedPrice2b = 101.986794;
final double cachedYield1a = 0.029257, cachedYield2a = 0.035689;
final double cachedYield1b = 0.029045, cachedYield2b = 0.035375;
final double cachedYield1c = 0.030423, cachedYield2c = 0.030432;
// check
final double tolerance = 1.0e-6;
double price, yield;
price = bond1.cleanPrice(marketYield1,
bondDayCount, Compounding.Compounded, freq);
if (Math.abs(price-cachedPrice1a) > tolerance) {
fail("failed to reproduce cached price:"
+ "\n calculated: " + price
+ "\n expected: " + cachedPrice1a
+ "\n tolerance: " + tolerance
+ "\n error: " + (price-cachedPrice1a));
}
price = bond1.cleanPrice();
if (Math.abs(price-cachedPrice1b) > tolerance) {
fail("failed to reproduce cached price:"
+ "\n calculated: " + price
+ "\n expected: " + cachedPrice1b
+ "\n tolerance: " + tolerance
+ "\n error: " + (price-cachedPrice1b));
}
yield = bond1.yield(marketPrice1, bondDayCount, Compounding.Compounded, freq);
if (Math.abs(yield-cachedYield1a) > tolerance) {
fail("failed to reproduce cached compounded yield:"
+ "\n calculated: " + yield
+ "\n expected: " + cachedYield1a
+ "\n tolerance: " + tolerance
+ "\n error: " + (yield-cachedYield1a));
}
yield = bond1.yield(marketPrice1, bondDayCount, Compounding.Continuous, freq);
if (Math.abs(yield-cachedYield1b) > tolerance) {
fail("failed to reproduce cached continuous yield:"
+ "\n calculated: " + yield
+ "\n expected: " + cachedYield1b
+ "\n tolerance: " + tolerance
+ "\n error: " + (yield-cachedYield1b));
}
yield = bond1.yield(bondDayCount, Compounding.Continuous, freq);
if (Math.abs(yield-cachedYield1c) > tolerance) {
fail("failed to reproduce cached continuous yield:"
+ "\n calculated: " + yield
+ "\n expected: " + cachedYield1c
+ "\n tolerance: " + tolerance
+ "\n error: " + (yield-cachedYield1c));
}
price = bond2.cleanPrice(marketYield2, bondDayCount, Compounding.Compounded, freq);
if (Math.abs(price-cachedPrice2a) > tolerance) {
fail("failed to reproduce cached price:"
+ "\n calculated: " + price
+ "\n expected: " + cachedPrice2a
+ "\n tolerance: " + tolerance
+ "\n error: " + (price-cachedPrice2a));
}
price = bond2.cleanPrice();
if (Math.abs(price-cachedPrice2b) > tolerance) {
fail("failed to reproduce cached price:"
+ "\n calculated: " + price
+ "\n expected: " + cachedPrice2b
+ "\n tolerance: " + tolerance
+ "\n error: " + (price-cachedPrice2b));
}
yield = bond2.yield(marketPrice2, bondDayCount, Compounding.Compounded, freq);
if (Math.abs(yield-cachedYield2a) > tolerance) {
fail("failed to reproduce cached compounded yield:"
+ "\n calculated: " + yield
+ "\n expected: " + cachedYield2a
+ "\n tolerance: " + tolerance
+ "\n error: " + (yield-cachedYield2a));
}
yield = bond2.yield(marketPrice2, bondDayCount, Compounding.Continuous, freq);
if (Math.abs(yield-cachedYield2b) > tolerance) {
fail("failed to reproduce cached continuous yield:"
+ "\n calculated: " + yield
+ "\n expected: " + cachedYield2b
+ "\n tolerance: " + tolerance
+ "\n error: " + (yield-cachedYield2b));
}
yield = bond2.yield(bondDayCount, Compounding.Continuous, freq);
if (Math.abs(yield-cachedYield2c) > tolerance) {
fail("failed to reproduce cached continuous yield:"
+ "\n calculated: " + yield
+ "\n expected: " + cachedYield2c
+ "\n tolerance: " + tolerance
+ "\n error: " + (yield-cachedYield2c));
}
// with explicit settlement date:
final Schedule sch3 = new Schedule(new Date(30,Month.November,2004),
new Date(30,Month.November,2006), new Period(freq),
new UnitedStates(UnitedStates.Market.GOVERNMENTBOND),
BusinessDayConvention.Unadjusted, BusinessDayConvention.Unadjusted, DateGeneration.Rule.Backward, false);
final FixedRateBond bond3 = new FixedRateBond(settlementDays, faceAmount, sch3,
new double[] {0.02875},
new ActualActual(ActualActual.Convention.ISMA),
BusinessDayConvention.ModifiedFollowing,
100.0, new Date(30,Month.November,2004));
bond3.setPricingEngine(bondEngine);