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);
final double marketYield3 = 0.02997;
final Date settlementDate = new Date(30,Month.November,2004);
final double cachedPrice3 = 99.764874;
price = bond3.cleanPrice(marketYield3,
bondDayCount, Compounding.Compounded, freq, settlementDate);
if (Math.abs(price-cachedPrice3) > tolerance) {
fail("failed to reproduce cached price:"
+ "\n calculated: " + price + ""
+ "\n expected: " + cachedPrice3 + ""
+ "\n error: " + (price-cachedPrice3));
}
// this should give the same result since the issue date is the
// earliest possible settlement date
settings.setEvaluationDate(new Date(22,Month.November,2004));
price = bond3.cleanPrice(marketYield3, bondDayCount, Compounding.Compounded, freq);
if (Math.abs(price-cachedPrice3) > tolerance) {
fail("failed to reproduce cached price:"
+ "\n calculated: " + price + ""
+ "\n expected: " + cachedPrice3 + ""
+ "\n error: " + (price-cachedPrice3));