public void test_of_CurveMetadata() { InterpolatedNodalCurve test = InterpolatedNodalCurve.of(METADATA_ENTRIES, XVALUES, YVALUES, INTERPOLATOR); assertThat(test.getName()).isEqualTo(CURVE_NAME); assertThat(test.getParameterCount()).isEqualTo(SIZE); assertThat(test.getParameter(0)).isEqualTo(YVALUES.get(0)); assertThat(test.getParameter(1)).isEqualTo(YVALUES.get(1)); assertThat(test.getParameterMetadata(0)).isSameAs(METADATA_ENTRIES.getParameterMetadata().get().get(0)); assertThat(test.getParameterMetadata(1)).isSameAs(METADATA_ENTRIES.getParameterMetadata().get().get(1)); assertThat(test.withParameter(0, 2d)).isEqualTo( InterpolatedNodalCurve.of(METADATA_ENTRIES, XVALUES, YVALUES.with(0, 2d), INTERPOLATOR)); assertThat(test.withPerturbation((i, v, m) -> v - 2d)).isEqualTo( InterpolatedNodalCurve.of(METADATA_ENTRIES, XVALUES, YVALUES_BUMPED, INTERPOLATOR)); assertThat(test.getExtrapolatorLeft().getName()).isEqualTo(FLAT_EXTRAPOLATOR.getName()); assertThat(test.getInterpolator().getName()).isEqualTo(INTERPOLATOR.getName()); assertThat(test.getExtrapolatorRight().getName()).isEqualTo(FLAT_EXTRAPOLATOR.getName()); assertThat(test.getMetadata()).isEqualTo(METADATA_ENTRIES); assertThat(test.getXValues()).isEqualTo(XVALUES); assertThat(test.getYValues()).isEqualTo(YVALUES); }
/** * Restricted copy constructor. * @param beanToCopy the bean to copy from, not null */ private Builder(InterpolatedNodalCurve beanToCopy) { this.metadata = beanToCopy.getMetadata(); this.xValues = beanToCopy.getXValues(); this.yValues = beanToCopy.getYValues(); this.interpolator = beanToCopy.getInterpolator(); this.extrapolatorLeft = beanToCopy.getExtrapolatorLeft(); this.extrapolatorRight = beanToCopy.getExtrapolatorRight(); }
private DoubleArray sensitivityDeposit( InterpolatedNodalCurve curve, double termDepositYearFraction, int index, double fixedRate) { int nNode = curve.getParameterCount(); double[] sensi = new double[nNode]; sensi[index] = curve.getXValues().get(index) * (1d + fixedRate * termDepositYearFraction) / termDepositYearFraction; return DoubleArray.ofUnsafe(sensi); }
public void test_withValues() { InterpolatedNodalCurve base = InterpolatedNodalCurve.of(METADATA, XVALUES, YVALUES, INTERPOLATOR); InterpolatedNodalCurve test = base.withYValues(YVALUES_BUMPED); assertThat(test.getName()).isEqualTo(CURVE_NAME); assertThat(test.getParameterCount()).isEqualTo(SIZE); assertThat(test.getMetadata()).isEqualTo(METADATA); assertThat(test.getXValues()).isEqualTo(XVALUES); assertThat(test.getYValues()).isEqualTo(YVALUES_BUMPED); }
public void test_withNode_atEnd_withoutMetadata() { InterpolatedNodalCurve base = InterpolatedNodalCurve.of(METADATA, XVALUES, YVALUES, INTERPOLATOR); LabelDateParameterMetadata item = LabelDateParameterMetadata.of(date(2015, 6, 30), TNR_1Y); InterpolatedNodalCurve test = base.withNode(0.5d, 4d, item); assertThat(test.getName()).isEqualTo(CURVE_NAME); assertThat(test.getParameterCount()).isEqualTo(SIZE + 1); assertThat(test.getMetadata()).isEqualTo(METADATA); assertThat(test.getXValues()).isEqualTo(DoubleArray.of(0.5d, 1d, 2d, 3d)); assertThat(test.getYValues()).isEqualTo(DoubleArray.of(4d, 5d, 7d, 8d)); }
public void test_of() { ZeroRatePeriodicDiscountFactors test = ZeroRatePeriodicDiscountFactors.of(GBP, DATE_VAL, CURVE); assertEquals(test.getCurrency(), GBP); assertEquals(test.getValuationDate(), DATE_VAL); assertEquals(test.getCurve(), CURVE); assertEquals(test.getParameterCount(), CURVE.getParameterCount()); assertEquals(test.getParameter(0), CURVE.getParameter(0)); assertEquals(test.getParameterMetadata(0), CURVE.getParameterMetadata(0)); assertEquals(test.withParameter(0, 1d).getCurve(), CURVE.withParameter(0, 1d)); assertEquals(test.withPerturbation((i, v, m) -> v + 1d).getCurve(), CURVE.withPerturbation((i, v, m) -> v + 1d)); assertEquals(test.findData(CURVE.getName()), Optional.of(CURVE)); assertEquals(test.findData(CurveName.of("Rubbish")), Optional.empty()); }
public void test_withValuesXy() { InterpolatedNodalCurve base = InterpolatedNodalCurve.of(METADATA, XVALUES, YVALUES, INTERPOLATOR); InterpolatedNodalCurve test = base.withValues(XVALUES2, YVALUES_BUMPED); assertThat(test.getName()).isEqualTo(CURVE_NAME); assertThat(test.getParameterCount()).isEqualTo(SIZE); assertThat(test.getMetadata()).isEqualTo(METADATA); assertThat(test.getXValues()).isEqualTo(XVALUES2); assertThat(test.getYValues()).isEqualTo(YVALUES_BUMPED); }
public void test_withMetadata() { InterpolatedNodalCurve base = InterpolatedNodalCurve.of(METADATA, XVALUES, YVALUES, INTERPOLATOR); InterpolatedNodalCurve test = base.withMetadata(METADATA_ENTRIES); assertThat(test.getName()).isEqualTo(CURVE_NAME); assertThat(test.getParameterCount()).isEqualTo(SIZE); assertThat(test.getMetadata()).isEqualTo(METADATA_ENTRIES); assertThat(test.getXValues()).isEqualTo(XVALUES); assertThat(test.getYValues()).isEqualTo(YVALUES); }
int nNode = curve.getParameterCount(); if (shift < curve.getXValues().get(0)) { double eta = curve.getYValues().get(0) * shift; DoubleArray time = DoubleArray.of(nNode, i -> curve.getXValues().get(i) - shift); DoubleArray rate = DoubleArray.of(nNode, i -> (curve.getYValues().get(i) * curve.getXValues().get(i) - eta) / time.get(i)); CurveMetadata metadata = curve.getMetadata().withParameterMetadata(parameterMetadata); if (computeJacobian) { double[][] transf = new double[nNode][nNode]; for (int i = 0; i < nNode; ++i) { transf[i][0] = -shift / time.get(i); transf[i][i] += curve.getXValues().get(i) / time.get(i); ImmutableList.of(CurveParameterSize.of(curve.getName(), nNode)), jacobianMatrix); return curve.withValues(time, rate).withMetadata(metadata.withInfo(CurveInfoType.JACOBIAN, jacobian)); return curve.withValues(time, rate).withMetadata(metadata); if (shift >= curve.getXValues().get(nNode - 1)) { double interval = curve.getXValues().get(nNode - 1) - curve.getXValues().get(nNode - 2); double rate = (curve.getYValues().get(nNode - 1) * curve.getXValues().get(nNode - 1) - curve.getYValues().get(nNode - 2) * curve.getXValues().get(nNode - 2)) / interval; if (computeJacobian) { double[][] transf = new double[1][nNode]; transf[0][nNode - 2] = -curve.getXValues().get(nNode - 2) / interval; transf[0][nNode - 1] = curve.getXValues().get(nNode - 1) / interval; DoubleMatrix jacobianMatrix = (DoubleMatrix) MATRIX_ALGEBRA.multiply(DoubleMatrix.ofUnsafe(transf), MATRIX_ALGEBRA.getInverse(sensitivity));
/** * Creates the ISDA compliant curve. * <p> * The parameter metadata is not stored in the metadata of the curve. * * @param yearFractions the year fraction values * @param zeroRates the zero rate values * @return the curve */ public InterpolatedNodalCurve curve(DoubleArray yearFractions, DoubleArray zeroRates) { CurveMetadata baseMetadata = Curves.zeroRates(name, dayCount); return InterpolatedNodalCurve.of( baseMetadata, yearFractions, zeroRates, CurveInterpolators.PRODUCT_LINEAR, CurveExtrapolators.FLAT, CurveExtrapolators.PRODUCT_LINEAR); }
public void test_of_noCurveMetadata() { InterpolatedNodalCurve test = InterpolatedNodalCurve.of(METADATA_NOPARAM, XVALUES, YVALUES, INTERPOLATOR); assertThat(test.getName()).isEqualTo(CURVE_NAME); assertThat(test.getParameterCount()).isEqualTo(SIZE); assertThat(test.getParameter(0)).isEqualTo(YVALUES.get(0)); assertThat(test.getParameter(1)).isEqualTo(YVALUES.get(1)); assertThat(test.getParameterMetadata(0)).isEqualTo(SimpleCurveParameterMetadata.of(ValueType.YEAR_FRACTION, XVALUES.get(0))); assertThat(test.getParameterMetadata(1)).isEqualTo(SimpleCurveParameterMetadata.of(ValueType.YEAR_FRACTION, XVALUES.get(1))); }
private CurrencyParameterSensitivities sensiModFn(ImmutableRatesProvider provider) { CurrencyParameterSensitivities sensi = CurrencyParameterSensitivities.empty(); // Index ImmutableMap<Index, Curve> mapIndex = provider.getIndexCurves(); for (Entry<Index, Curve> entry : mapIndex.entrySet()) { if (entry.getKey() instanceof IborIndex) { InterpolatedNodalCurve curveInt = checkInterpolated(entry.getValue()); double sumSqrt = sumMod(provider); sensi = sensi.combinedWith(CurrencyParameterSensitivity.of(curveInt.getName(), USD, DoubleArray.of(curveInt.getParameterCount(), i -> 2d * sumSqrt * curveInt.getXValues().get(i)))); } } return sensi; }
private InterpolatedNodalCurve fitSwap(int curveIndex, BasicFixedLeg swap, InterpolatedNodalCurve curve, double swapRate) { int nPayments = swap.getNumPayments(); int nNodes = curve.getParameterCount(); double t1 = curveIndex == 0 ? 0.0 : curve.getXValues().get(curveIndex - 1); double t2 = curveIndex == nNodes - 1 ? Double.POSITIVE_INFINITY : curve.getXValues().get(curveIndex + 1); double temp = 0; double temp2 = 0; paymentAmounts[i] = swap.getPaymentAmounts(i, swapRate); if (t <= t1) { double df = Math.exp(-curve.yValue(t) * t); temp += paymentAmounts[i] * df; temp2 += paymentAmounts[i] * t * df * curve.yValueParameterSensitivity(t).getSensitivity().get(curveIndex); i1++; } else if (t >= t2) { double df = Math.exp(-curve.yValue(t) * t); temp += paymentAmounts[i] * df; temp2 -= paymentAmounts[i] * t * df * curve.yValueParameterSensitivity(t).getSensitivity().get(curveIndex); i2--; double guess = curve.getParameter(curveIndex); if (guess == 0.0 && func.apply(guess) == 0.0) { return curve; BRACKETER.getBracketedPoints(func, 1.25 * guess, 0.8 * guess, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY); double r = rootFinder.getRoot(func, grad, bracket[0], bracket[1]); return curve.withParameter(curveIndex, r);
public void test_of_extrapolators() { InterpolatedNodalCurve test = InterpolatedNodalCurve.of( METADATA_ENTRIES, XVALUES, YVALUES, INTERPOLATOR, LINEAR_EXTRAPOLATOR, LINEAR_EXTRAPOLATOR); assertThat(test.getName()).isEqualTo(CURVE_NAME); assertThat(test.getExtrapolatorLeft().getName()).isEqualTo(LINEAR_EXTRAPOLATOR.getName()); assertThat(test.getInterpolator().getName()).isEqualTo(INTERPOLATOR.getName()); assertThat(test.getExtrapolatorRight().getName()).isEqualTo(LINEAR_EXTRAPOLATOR.getName()); }
private void assertUsd3ml(Curve curve) { assertTrue(curve instanceof InterpolatedNodalCurve); InterpolatedNodalCurve nodalCurve = (InterpolatedNodalCurve) curve; assertEquals(nodalCurve.getMetadata().getCurveName(), CurveName.of("USD-3ML")); String[] labels = new String[] {"3M", "1Y", "2Y", "3Y", "5Y", "10Y"}; for (int i = 0; i < nodalCurve.getXValues().size(); i++) { LocalDate nodeDate = nodeDates[i]; double actualYearFraction = nodalCurve.getXValues().get(i); double expectedYearFraction = getYearFraction(valuationDate, nodeDate); assertThat(actualYearFraction).isCloseTo(expectedYearFraction, offset(TOLERANCE)); ParameterMetadata nodeMetadata = nodalCurve.getMetadata().getParameterMetadata().get().get(i); assertEquals(nodeMetadata.getLabel(), labels[i]); 0.029984216, 0.039245812); assertEquals(nodalCurve.getYValues(), expectedYValues);
private static List<String> curveSettings(Curve curve) { ArgChecker.isTrue(curve instanceof InterpolatedNodalCurve, "Curve must be an InterpolatedNodalCurve"); if (!VALUE_TYPE_MAP.inverse().containsKey(curve.getMetadata().getYValueType())) { throw new IllegalArgumentException( Messages.format("Unsupported ValueType in curve settings: {}", curve.getMetadata().getYValueType())); } InterpolatedNodalCurve interpolatedCurve = (InterpolatedNodalCurve) curve; List<String> line = new ArrayList<>(); line.add(curve.getName().getName()); line.add(VALUE_TYPE_MAP.inverse().get(curve.getMetadata().getYValueType())); line.add(curve.getMetadata().getInfo(CurveInfoType.DAY_COUNT).toString()); line.add(interpolatedCurve.getInterpolator().toString()); line.add(interpolatedCurve.getExtrapolatorLeft().toString()); line.add(interpolatedCurve.getExtrapolatorRight().toString()); return line; }
private static void nodeLines(String valuationDateStr, Curve curve, CsvOutput csv) { ArgChecker.isTrue(curve instanceof InterpolatedNodalCurve, "interpolated"); InterpolatedNodalCurve interpolatedCurve = (InterpolatedNodalCurve) curve; int nbPoints = interpolatedCurve.getXValues().size(); for (int i = 0; i < nbPoints; i++) { ArgChecker.isTrue( interpolatedCurve.getParameterMetadata(i) instanceof DatedParameterMetadata, "Curve metadata must contain a date, but was " + interpolatedCurve.getParameterMetadata(i).getClass().getSimpleName()); DatedParameterMetadata metadata = (DatedParameterMetadata) interpolatedCurve.getParameterMetadata(i); List<String> line = new ArrayList<>(); line.add(valuationDateStr); line.add(curve.getName().getName().toString()); line.add(metadata.getDate().toString()); line.add(BigDecimal.valueOf(interpolatedCurve.getYValues().get(i)).toPlainString()); line.add(metadata.getLabel()); csv.writeLine(line); } }
private double sumSingle(InterpolatedNodalCurve interpolatedNodalCurve) { double result = 0.0; int nbNodePoints = interpolatedNodalCurve.getParameterCount(); for (int i = 0; i < nbNodePoints; i++) { result += interpolatedNodalCurve.getXValues().get(i) * interpolatedNodalCurve.getYValues().get(i); } return result; }
public void test_lookup() { InterpolatedNodalCurve test = InterpolatedNodalCurve.of(METADATA, XVALUES, YVALUES, INTERPOLATOR); BoundCurveInterpolator interp = INTERPOLATOR.bind(XVALUES, YVALUES, FLAT_EXTRAPOLATOR, FLAT_EXTRAPOLATOR); assertThat(test.yValue(XVALUES.get(0))).isEqualTo(YVALUES.get(0)); assertThat(test.yValue(XVALUES.get(1))).isEqualTo(YVALUES.get(1)); assertThat(test.yValue(XVALUES.get(2))).isEqualTo(YVALUES.get(2)); assertThat(test.yValue(10d)).isEqualTo(interp.interpolate(10d)); assertThat(test.yValueParameterSensitivity(10d).getMarketDataName()).isEqualTo(CURVE_NAME); assertThat(test.yValueParameterSensitivity(10d).getSensitivity()).isEqualTo(interp.parameterSensitivity(10d)); assertThat(test.firstDerivative(10d)).isEqualTo(interp.firstDerivative(10d)); }
public void semiParallelGammaValue() { ImmutableRatesProvider provider = SINGLE; Currency curveCurrency = SINGLE_CURRENCY; DoubleArray y = USD_SINGLE_CURVE.getYValues(); int nbNode = y.size(); DoubleArray gammaExpected = DoubleArray.of(nbNode, i -> { yBumped[pmi][pmP][j] += (pmP == 0 ? 1.0 : -1.0) * FD_SHIFT; Curve curveBumped = USD_SINGLE_CURVE.withYValues(DoubleArray.copyOf(yBumped[pmi][pmP])); ImmutableRatesProvider providerBumped = provider.toBuilder() .discountCurves(provider.getDiscountCurves().keySet().stream() curveCurrency, c -> buildSensitivities(c, provider)); assertEquals(sensitivityComputed.getMarketDataName(), USD_SINGLE_CURVE.getName()); DoubleArray gammaComputed = sensitivityComputed.getSensitivity(); assertTrue(gammaComputed.equalWithTolerance(gammaExpected, TOLERANCE_GAMMA));