-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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