/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.example.curveconstruction;
import static com.opengamma.analytics.math.interpolation.Interpolator1DFactory.FLAT_EXTRAPOLATOR;
import static com.opengamma.analytics.math.interpolation.Interpolator1DFactory.LINEAR_EXTRAPOLATOR;
import java.io.PrintStream;
import java.util.Arrays;
import com.opengamma.analytics.financial.interestrate.PresentValueCalculator;
import com.opengamma.analytics.financial.interestrate.YieldCurveBundle;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.AnnuityCouponFixed;
import com.opengamma.analytics.financial.model.interestrate.curve.YieldCurve;
import com.opengamma.analytics.math.curve.InterpolatedDoublesCurve;
import com.opengamma.analytics.math.interpolation.CombinedInterpolatorExtrapolatorFactory;
import com.opengamma.analytics.math.interpolation.Interpolator1D;
import com.opengamma.analytics.math.interpolation.Interpolator1DFactory;
import com.opengamma.util.money.Currency;
/**
* Example annuity.
*/
public class AnnuityExample {
// CSOFF
public static final double[] FUNDING_CURVE_TIMES = new double[] {1, 2, 5, 10, 20, 31 };
public static final double[] LIBOR_CURVE_TIMES = new double[] {0.5, 1, 2, 5, 10, 20, 31 };
public static final double[] FUNDING_YIELDS = new double[] {0.021, 0.036, 0.06, 0.054, 0.049, 0.044 };
public static final double[] LIBOR_YIELDS = new double[] {0.01, 0.02, 0.035, 0.06, 0.055, 0.05, 0.045 };
public static final Currency CCY = Currency.EUR;
public static final double T = 1.0;
public static final double NOTIONAL = 10000.0;
public static final double R = 0.03;
public static final String FUNDING_CURVE_NAME = "Funding Curve";
public static final String LIBOR_CURVE_NAME = "Libor Curve";
public static final int MATURITY = 5;
// CSON
public static YieldCurveBundle getBundle() {
final YieldCurveBundle bundle = new YieldCurveBundle();
final Interpolator1D extrapolator = CombinedInterpolatorExtrapolatorFactory.getInterpolator(Interpolator1DFactory.DOUBLE_QUADRATIC, LINEAR_EXTRAPOLATOR, FLAT_EXTRAPOLATOR);
final InterpolatedDoublesCurve fCurve = InterpolatedDoublesCurve.from(FUNDING_CURVE_TIMES, FUNDING_YIELDS, extrapolator);
final YieldCurve fundingCurve = YieldCurve.from(fCurve);
bundle.setCurve(FUNDING_CURVE_NAME, fundingCurve);
final InterpolatedDoublesCurve lcurve = InterpolatedDoublesCurve.from(LIBOR_CURVE_TIMES, LIBOR_YIELDS, extrapolator);
final YieldCurve liborCurve = YieldCurve.from(lcurve);
bundle.setCurve(LIBOR_CURVE_NAME, liborCurve);
return bundle;
}
public static double[] fixedPaymentTimes(final int maturity) {
final double[] fixedPaymentTimes = new double[maturity + 1];
for (int i = 0; i <= maturity; i++) {
fixedPaymentTimes[i] = i;
}
return fixedPaymentTimes;
}
public static void fixedPaymentTimesDemo(final PrintStream out) {
final double[] paymentTimes = fixedPaymentTimes(MATURITY);
out.println(Arrays.toString(paymentTimes));
}
public static void annuityFixedDemo(final PrintStream out) {
final double[] paymentTimes = fixedPaymentTimes(MATURITY);
final AnnuityCouponFixed annuity = new AnnuityCouponFixed(CCY, paymentTimes, R, LIBOR_CURVE_NAME, false);
out.println(Arrays.deepToString(annuity.getPayments()));
final YieldCurveBundle bundle = getBundle();
final PresentValueCalculator presentValueCalculator = PresentValueCalculator.getInstance();
final double presentValue = annuity.accept(presentValueCalculator, bundle);
out.format("Present Value %f%n", presentValue);
}
public static double[] floatingPaymentTimes(final int maturity) {
final double[] floatingPaymentTimes = new double[2 * maturity + 1];
for (int i = 0; i <= 2 * maturity; i++) {
floatingPaymentTimes[i] = i * 0.5;
}
return floatingPaymentTimes;
}
public static void floatingPaymentTimesDemo(final PrintStream out) {
final double[] paymentTimes = floatingPaymentTimes(MATURITY);
out.println(Arrays.toString(paymentTimes));
}
}