/** * Creates a curve as the sum of a base curve and a spread curve. * <p> * The metadata of the combined curve will be created form the base curve and spread curve. * * @param baseCurve the base curve * @param spreadCurve the spread curve * @return the combined curve */ public static CombinedCurve of(Curve baseCurve, Curve spreadCurve) { CurveMetadata baseMetadata = baseCurve.getMetadata(); CurveMetadata spreadMetadata = spreadCurve.getMetadata(); List<ParameterMetadata> paramMeta = Stream.concat( IntStream.range(0, baseCurve.getParameterCount()) .mapToObj(i -> baseCurve.getParameterMetadata(i)), IntStream.range(0, spreadCurve.getParameterCount()) .mapToObj(i -> spreadCurve.getParameterMetadata(i))) .collect(toImmutableList()); DefaultCurveMetadataBuilder metadataBuilder = DefaultCurveMetadata.builder() .curveName(baseCurve.getName().getName() + "+" + spreadMetadata.getCurveName().getName()) .xValueType(baseMetadata.getXValueType()) .yValueType(baseMetadata.getYValueType()) .parameterMetadata(paramMeta); if (baseMetadata.findInfo(CurveInfoType.DAY_COUNT).isPresent()) { metadataBuilder.addInfo( CurveInfoType.DAY_COUNT, baseMetadata.getInfo(CurveInfoType.DAY_COUNT)); } return of(baseCurve, spreadCurve, metadataBuilder.build()); }
public void test_sensitivities() { ParameterizedFunctionalCurve test = ParameterizedFunctionalCurve.of( METADATA, PARAMETERS, VALUE_FUNCTION, DERIVATIVE_FUNCTION, SENSITIVITY_FUNCTION); DoubleArray sensiVal = DoubleArray.of(1d, 2d, 3d); assertEquals(test.createParameterSensitivity(sensiVal), UnitParameterSensitivity.of(METADATA.getCurveName(), METADATA.getParameterMetadata().get(), sensiVal)); assertEquals(test.createParameterSensitivity(USD, sensiVal), CurrencyParameterSensitivity.of(METADATA.getCurveName(), METADATA.getParameterMetadata().get(), USD, sensiVal)); }
int index = Arrays.binarySearch(xValues.toArrayUnsafe(), x); if (index >= 0) { CurveMetadata md = metadata.getParameterMetadata() .map(params -> { List<ParameterMetadata> extended = new ArrayList<>(params); extended.set(index, paramMetadata); return metadata.withParameterMetadata(extended); }) .orElse(metadata); DoubleArray yExtended = yValues.subArray(0, insertion).concat(y).concat(yValues.subArray(insertion)); CurveMetadata md = metadata.getParameterMetadata() .map(params -> { List<ParameterMetadata> extended = new ArrayList<>(params); extended.add(insertion, paramMetadata); return metadata.withParameterMetadata(extended); }) .orElse(metadata);
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; }
if (!baseMetadata.getXValueType().equals(metadata.getXValueType())) { throw new IllegalArgumentException(Messages.format( "xValueType is {} in baseCurve, but {} in CombinedCurve", baseMetadata.getXValueType(), metadata.getXValueType())); if (!spreadMetadata.getXValueType().equals(metadata.getXValueType())) { throw new IllegalArgumentException(Messages.format( "xValueType is {} in spreadCurve, but {} in CombinedCurve", spreadMetadata.getXValueType(), metadata.getXValueType())); if (!baseMetadata.getYValueType().equals(metadata.getYValueType())) { throw new IllegalArgumentException(Messages.format( "yValueType is {} in baseCurve, but {} in CombinedCurve", baseMetadata.getYValueType(), metadata.getYValueType())); if (!spreadMetadata.getYValueType().equals(metadata.getYValueType())) { throw new IllegalArgumentException(Messages.format( "yValueType is {} in spreadCurve, but {} in CombinedCurve", spreadMetadata.getYValueType(), metadata.getYValueType())); Optional<DayCount> dccOpt = metadata.findInfo(CurveInfoType.DAY_COUNT); if (dccOpt.isPresent()) { DayCount dcc = dccOpt.get(); if (!baseMetadata.findInfo(CurveInfoType.DAY_COUNT).isPresent() || !baseMetadata.getInfo(CurveInfoType.DAY_COUNT).equals(dcc)) {
/** * Gets the metadata of the parameter at the specified index. * <p> * If there is no specific parameter metadata, {@link SimpleCurveParameterMetadata} will be created. * * @param parameterIndex the zero-based index of the parameter to get * @return the metadata of the parameter * @throws IndexOutOfBoundsException if the index is invalid */ @Override public default ParameterMetadata getParameterMetadata(int parameterIndex) { return getMetadata().getParameterMetadata().map(pm -> pm.get(parameterIndex)) .orElse(SimpleCurveParameterMetadata.of(getMetadata().getXValueType(), getXValues().get(parameterIndex))); }
@ImmutableConstructor private BlackFxOptionFlatVolatilities( CurrencyPair currencyPair, ZonedDateTime valuationDateTime, Curve curve) { ArgChecker.notNull(currencyPair, "currencyPair"); ArgChecker.notNull(valuationDateTime, "valuationDateTime"); ArgChecker.notNull(curve, "curve"); curve.getMetadata().getXValueType().checkEquals( ValueType.YEAR_FRACTION, "Incorrect x-value type for Black volatilities"); curve.getMetadata().getYValueType().checkEquals( ValueType.BLACK_VOLATILITY, "Incorrect y-value type for Black volatilities"); DayCount dayCount = curve.getMetadata().findInfo(CurveInfoType.DAY_COUNT) .orElseThrow(() -> new IllegalArgumentException("Incorrect curve metadata, missing DayCount")); this.currencyPair = currencyPair; this.valuationDateTime = valuationDateTime; this.curve = curve; this.dayCount = dayCount; }
/** * Gets the curve name. * * @return the curve name */ public default CurveName getName() { return getMetadata().getCurveName(); }
private static void validate(Curve curve, DayCount dayCount) { if (!curve.getMetadata().findInfo(CurveInfoType.DAY_COUNT).orElse(dayCount).equals(dayCount)) { throw new IllegalArgumentException("SABR curves must have the same day count"); } }
private static void validate(Curve curve, String name, ValueType yType) { ArgChecker.notNull(curve, name); curve.getMetadata().getXValueType().checkEquals( ValueType.YEAR_FRACTION, "Incorrect x-value type for SABR volatilities"); ValueType yValueType = curve.getMetadata().getYValueType(); yValueType.checkEquals(yType, "Incorrect y-value type for SABR volatilities"); }
private double getIndexFactor(ResolvedCds cds, CreditRatesProvider ratesProvider) { LegalEntitySurvivalProbabilities survivalProbabilities = ratesProvider.survivalProbabilities(cds.getLegalEntityId(), cds.getCurrency()); // instance is checked in pricer double indexFactor = ((IsdaCreditDiscountFactors) survivalProbabilities.getSurvivalProbabilities()) .getCurve() .getMetadata() .getInfo(CurveInfoType.CDS_INDEX_FACTOR); return indexFactor; }
refData); NodalCurve underlyingCurve = ((IsdaCreditDiscountFactors) creditCurve.getSurvivalProbabilities()).getCurve(); CurveMetadata metadata = underlyingCurve.getMetadata().withInfo(CurveInfoType.CDS_INDEX_FACTOR, indexFactor); if (curveDefinition.isStoreNodeTrade()) { int nNodes = curveDefinition.getCurveNodes().size(); curveNodes.get(n).getLabel())) .collect(Guavate.toImmutableList()); metadata = metadata.withParameterMetadata(parameterMetadata);
/** * Obtains an instance from a curve. * <p> * The curve is specified by an instance of {@link Curve}, such as {@link InterpolatedNodalCurve}. * The curve must have x-values of {@linkplain ValueType#YEAR_FRACTION year fractions} with * the day count specified. The y-values must be {@linkplain ValueType#ZERO_RATE zero rates} * or {@linkplain ValueType#DISCOUNT_FACTOR discount factors}. * * @param currency the currency * @param valuationDate the valuation date for which the curve is valid * @param curve the underlying curve * @return the discount factors view */ public static DiscountFactors of(Currency currency, LocalDate valuationDate, Curve curve) { if (curve.getMetadata().getYValueType().equals(ValueType.DISCOUNT_FACTOR)) { return SimpleDiscountFactors.of(currency, valuationDate, curve); } if (curve.getMetadata().getYValueType().equals(ValueType.ZERO_RATE)) { Optional<Integer> frequencyOpt = curve.getMetadata().findInfo(CurveInfoType.COMPOUNDING_PER_YEAR); if (frequencyOpt.isPresent()) { return ZeroRatePeriodicDiscountFactors.of(currency, valuationDate, curve); } return ZeroRateDiscountFactors.of(currency, valuationDate, curve); } throw new IllegalArgumentException(Messages.format( "Unknown value type in discount curve, must be 'DiscountFactor' or 'ZeroRate' but was '{}'", curve.getMetadata().getYValueType())); }
MULTICURVE_EUR_2_CALIBRATED.findData(EUR_DSCON_OIS).get().getMetadata().findInfo(CurveInfoType.JACOBIAN).get(); DoubleMatrix jiExpectedDsc = MULTICURVE_EUR_2_CALIBRATED.findData(EUR_DSCON_OIS).get() .getMetadata().getInfo(CurveInfoType.JACOBIAN).getJacobianMatrix(); DoubleMatrix jiExpectedE3 = MULTICURVE_EUR_2_CALIBRATED.findData(EUR_EURIBOR6M_IRS).get() .getMetadata().getInfo(CurveInfoType.JACOBIAN).getJacobianMatrix();
/** * Gets the metadata of the parameter at the specified index. * <p> * If there is no specific parameter metadata, an empty instance will be returned. * * @param parameterIndex the zero-based index of the parameter to get * @return the metadata of the parameter * @throws IndexOutOfBoundsException if the index is invalid */ public default ParameterMetadata getParameterMetadata(int parameterIndex) { return getParameterMetadata().map(pm -> pm.get(parameterIndex)).orElse(ParameterMetadata.empty()); }
@Override public ConstantCurve withMetadata(CurveMetadata metadata) { return new ConstantCurve(metadata.withParameterMetadata(null), yValue); }
/** * Obtains an instance from a curve. * <p> * If the curve is {@code ConstantCurve}, {@code ConstantRecoveryRates} is always instantiated. * * @param legalEntityId the legal entity identifier * @param valuationDate the valuation date for which the curve is valid * @param curve the underlying curve * @return the instance */ public static RecoveryRates of(StandardId legalEntityId, LocalDate valuationDate, Curve curve) { if (curve.getMetadata().getYValueType().equals(ValueType.RECOVERY_RATE)) { ConstantCurve constantCurve = (ConstantCurve) curve; return ConstantRecoveryRates.of(legalEntityId, valuationDate, constantCurve.getYValue()); } throw new IllegalArgumentException("Unknown curve type"); }
@ImmutableConstructor private ZeroRatePeriodicDiscountFactors( Currency currency, LocalDate valuationDate, Curve curve) { ArgChecker.notNull(currency, "currency"); ArgChecker.notNull(valuationDate, "valuationDate"); ArgChecker.notNull(curve, "curve"); Optional<Integer> frequencyOpt = curve.getMetadata().findInfo(CurveInfoType.COMPOUNDING_PER_YEAR); ArgChecker.isTrue(frequencyOpt.isPresent(), "Compounding per year must be present for periodicaly compounded curve "); ArgChecker.isTrue(frequencyOpt.get() > 0, "Compounding per year must be positive"); curve.getMetadata().getXValueType().checkEquals( ValueType.YEAR_FRACTION, "Incorrect x-value type for zero-rate discount curve"); curve.getMetadata().getYValueType().checkEquals( ValueType.ZERO_RATE, "Incorrect y-value type for zero-rate discount curve"); DayCount dayCount = curve.getMetadata().findInfo(CurveInfoType.DAY_COUNT) .orElseThrow(() -> new IllegalArgumentException("Incorrect curve metadata, missing DayCount")); this.currency = currency; this.valuationDate = valuationDate; this.curve = curve; this.dayCount = dayCount; this.frequency = frequencyOpt.get(); }
@Override public UnitParameterSensitivity yValueParameterSensitivity(double x) { ImmutableList<ParameterMetadata> paramMeta = ImmutableList.of(getParameterMetadata(0)); return UnitParameterSensitivity.of(metadata.getCurveName(), paramMeta, SENSITIVITY); }
private static void validate(Curve curve, DayCount dayCount) { if (!curve.getMetadata().findInfo(CurveInfoType.DAY_COUNT).orElse(dayCount).equals(dayCount)) { throw new IllegalArgumentException("shift curve must have the same day count as surface"); } }