Skip to content

Instantly share code, notes, and snippets.

Created May 29, 2013 10:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/0c2ae3ed1d0cfc58f3c0 to your computer and use it in GitHub Desktop.
Save anonymous/0c2ae3ed1d0cfc58f3c0 to your computer and use it in GitHub Desktop.
A simple attempt at matching the Bloomberg price, modified duration and convexity for a bond.
import javax.time.calendar.LocalDate;
import javax.time.calendar.Period;
import javax.time.calendar.TimeZone;
import javax.time.calendar.ZonedDateTime;
import com.opengamma.analytics.financial.instrument.annuity.AnnuityCouponFixedDefinition;
import com.opengamma.analytics.financial.instrument.annuity.AnnuityPaymentFixedDefinition;
import com.opengamma.analytics.financial.instrument.bond.BondFixedSecurityDefinition;
import com.opengamma.analytics.financial.instrument.payment.PaymentFixedDefinition;
import com.opengamma.analytics.financial.interestrate.YieldCurveBundle;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.AnnuityCouponFixed;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.AnnuityPaymentFixed;
import com.opengamma.analytics.financial.interestrate.bond.calculator.CleanPriceFromCurvesCalculator;
import com.opengamma.analytics.financial.interestrate.bond.calculator.ConvexityFromCurvesCalculator;
import com.opengamma.analytics.financial.interestrate.bond.calculator.DirtyPriceFromCurvesCalculator;
import com.opengamma.analytics.financial.interestrate.bond.calculator.ModifiedDurationFromCurvesCalculator;
import com.opengamma.analytics.financial.interestrate.bond.definition.BondFixedSecurity;
import com.opengamma.analytics.financial.model.interestrate.curve.YieldAndDiscountCurve;
import com.opengamma.analytics.financial.model.interestrate.curve.YieldCurve;
import com.opengamma.analytics.math.curve.ConstantDoublesCurve;
import com.opengamma.analytics.math.curve.Curve;
import com.opengamma.analytics.math.curve.DoublesCurve;
import com.opengamma.analytics.math.curve.InterpolatedDoublesCurve;
import com.opengamma.analytics.math.interpolation.LinearInterpolator1D;
import com.opengamma.financial.convention.businessday.BusinessDayConvention;
import com.opengamma.financial.convention.businessday.NoAdjustBusinessDayConvention;
import com.opengamma.financial.convention.calendar.Calendar;
import com.opengamma.financial.convention.calendar.ExceptionCalendar;
import com.opengamma.financial.convention.calendar.MondayToFridayCalendar;
import com.opengamma.financial.convention.daycount.ActualActualICMA;
import com.opengamma.financial.convention.daycount.ActualActualICMANormal;
import com.opengamma.financial.convention.daycount.ActualThreeSixty;
import com.opengamma.financial.convention.daycount.ActualThreeSixtyFive;
import com.opengamma.financial.convention.daycount.DayCount;
import com.opengamma.financial.convention.daycount.ThirtyEThreeSixty;
import com.opengamma.financial.convention.yield.SimpleYieldConvention;
import com.opengamma.financial.convention.yield.YieldConvention;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.money.Currency;
public class BondAnalytics {
/**
* @param args
*/
public static void main(String[] args) {
BondFixedSecurityDefinition bondInstrument;
/**
* Fixed coupon bond builder from standard financial details. The accrual dates are unadjusted; the payment dates are adjusted according to the business day convention.
* The default notional 1 and default ex-coupon days 0 are used; if the first coupon is non-standard, it is short; the coupon dates are computed from the maturity.
* @param currency The currency.
* @param maturityDate The maturity date.
* @param firstAccrualDate The first accrual date (bond start date).
* @param paymentPeriod The coupon payment period.
* @param rate The fixed rate.
* @param settlementDays Standard number of days between trade date and trade settlement. Used for clean price and yield computation.
* @param calendar The payment calendar.
* @param dayCount The coupon day count convention.
* @param businessDay The business day convention for the payments.
* @param yieldConvention The yield (to maturity) computation convention.
* @param isEOM The end-of-month flag.
* @return The fixed coupon bond.
*/
// from UPCB 6-3/8 09/15/22
bondInstrument = BondFixedSecurityDefinition.from(
Currency.EUR, // final Currency currency,
ZonedDateTime.of(2020, 9, 15, 0, 0, 0, 0, TimeZone.UTC),// final ZonedDateTime maturityDate,
ZonedDateTime.of(2013, 3, 15, 0, 0, 0, 0, TimeZone.UTC),// final ZonedDateTime firstAccrualDate,
Period.ofMonths(6),// final Period paymentPeriod,
0.06375,// final double rate,
3, // final int settlementDays,
400000, //notional
new DeutscheBorseCalendar("testcal"),// final Calendar calendar, //this bond is traded on Deutsche Borse
new ThirtyEThreeSixty(), //final DayCount dayCount,
new NoAdjustBusinessDayConvention(),// final BusinessDayConvention businessDay,
SimpleYieldConvention.UK_BUMP_DMO_METHOD,// final YieldConvention yieldConvention, // only UK_BUMP_DMO_METHOD and US_STREET are supported
false);//final boolean isEOM);
final String CREDIT_CURVE = "CreditCurve";
final String RISK_FREE_CURVE = "RiskFreeCurve";
BondFixedSecurity bond = bondInstrument.toDerivative(ZonedDateTime.of(2013, 5, 28, 0, 0, 0, 0, TimeZone.UTC), CREDIT_CURVE, RISK_FREE_CURVE);
double accruedInterest = bond.getAccruedInterest();
// Not sure what value to use for the Risk Free Curve
double riskFreeYield = 0.01356135;
ConstantDoublesCurve flatRiskFreeCurve = new ConstantDoublesCurve(riskFreeYield);
YieldCurve flatRiskFreeYieldCurve = new YieldCurve(RISK_FREE_CURVE, flatRiskFreeCurve);
// Not sure what value to use for the Credit Curve
double creditYield = 0.05656619;
ConstantDoublesCurve flatCreditCurve = new ConstantDoublesCurve(creditYield);
YieldCurve flatCreditYieldCurve = new YieldCurve(CREDIT_CURVE, flatCreditCurve);
YieldCurveBundle yieldCurves = new YieldCurveBundle();
yieldCurves.setCurve(CREDIT_CURVE, flatCreditYieldCurve);
yieldCurves.setCurve(RISK_FREE_CURVE, flatRiskFreeYieldCurve);
ConvexityFromCurvesCalculator convexityFromCurvesCalc = ConvexityFromCurvesCalculator.getInstance();
ModifiedDurationFromCurvesCalculator modifiedDurationFromCurvesCalc = ModifiedDurationFromCurvesCalculator.getInstance();
CleanPriceFromCurvesCalculator cleanPriceFromCurvesCalc = CleanPriceFromCurvesCalculator.getInstance();
DirtyPriceFromCurvesCalculator dirtyPriceFromCurvesCalc = DirtyPriceFromCurvesCalculator.getInstance();
double convexity = bond.accept(convexityFromCurvesCalc, yieldCurves);
double modifiedDuration = bond.accept(modifiedDurationFromCurvesCalc, yieldCurves);
double cleanPrice = bond.accept(cleanPriceFromCurvesCalc, yieldCurves);
double dirtyPrice = bond.accept(dirtyPriceFromCurvesCalc, yieldCurves);
System.out.println(
"Credit Yield: " + creditYield +
" Risk Free Yield: " + riskFreeYield +
" Convexity: " + convexity +
" modifiedDuration: " + modifiedDuration +
" accruedInterest: " + accruedInterest +
" CleanPrice: " + cleanPrice +
" DirtyPrice: " + dirtyPrice);
}
}
import javax.time.calendar.LocalDate;
import com.opengamma.financial.convention.calendar.MondayToFridayCalendar;
public class DeutscheBorseCalendar extends MondayToFridayCalendar
{
/**
*
*/
private static final long serialVersionUID = 1L;
public DeutscheBorseCalendar(String name) {
super(name);
this.addNonWorkingDay(LocalDate.of(2013,1,1));
this.addNonWorkingDay(LocalDate.of(2013,3,29));
this.addNonWorkingDay(LocalDate.of(2013,4,1));
this.addNonWorkingDay(LocalDate.of(2013,5,1));
this.addNonWorkingDay(LocalDate.of(2013,12,24));
this.addNonWorkingDay(LocalDate.of(2013,12,25));
this.addNonWorkingDay(LocalDate.of(2013,12,26));
this.addNonWorkingDay(LocalDate.of(2013,12,31));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment