static ParameterizedFunctionalCurveTest() { TenorParameterMetadata param1 = TenorParameterMetadata.of(Tenor.TENOR_1Y); TenorParameterMetadata param2 = TenorParameterMetadata.of(Tenor.TENOR_5Y); TenorParameterMetadata param3 = TenorParameterMetadata.of(Tenor.TENOR_10Y); METADATA = DefaultCurveMetadata.builder().curveName("test").yValueType(ValueType.DISCOUNT_FACTOR).xValueType(ValueType.YEAR_FRACTION).parameterMetadata(param1, param2, param3).build(); }
static ParameterizedFunctionalCurveDefinitionTest() { TenorParameterMetadata param1 = TenorParameterMetadata.of(Tenor.TENOR_1Y); TenorParameterMetadata param2 = TenorParameterMetadata.of(Tenor.TENOR_5Y); TenorParameterMetadata param3 = TenorParameterMetadata.of(Tenor.TENOR_10Y); PARAM_METADATA = ImmutableList.of(param1, param2, param3); }
public virtual void wrong_metadata() { IList <ParameterMetadata> pmdInput = new List <ParameterMetadata>(); pmdInput.Add(TenorParameterMetadata.of(Tenor.TENOR_10M)); CurrencyParameterSensitivity s1 = CurrencyParameterSensitivity.of(NAME_1, pmdInput, CCY_1, DoubleArray.of(SENSITIVITY_AMOUNT)); CurrencyParameterSensitivities s2 = CurrencyParameterSensitivities.of(s1); assertThrowsIllegalArg(() => CurveSensitivityUtils.linearRebucketing(s2, TARGET_DATES)); }
static CombinedCurveTest() { PARAM_METADATA_BASE.Add(TenorParameterMetadata.of(TENOR_1Y, BASE_NAME + TENOR_1Y.ToString())); PARAM_METADATA_BASE.Add(TenorParameterMetadata.of(TENOR_3Y, BASE_NAME + TENOR_3Y.ToString())); PARAM_METADATA_BASE.Add(TenorParameterMetadata.of(TENOR_5Y, BASE_NAME + TENOR_5Y.ToString())); PARAM_METADATA_SPREAD.Add(TenorParameterMetadata.of(TENOR_6M, SPREAD_NAME + TENOR_6M.ToString())); PARAM_METADATA_SPREAD.Add(TenorParameterMetadata.of(TENOR_18M, SPREAD_NAME + TENOR_18M.ToString())); PARAM_METADATA_SPREAD.Add(TenorParameterMetadata.of(TENOR_5Y, SPREAD_NAME + TENOR_5Y.ToString())); PARAM_METADATA_SPREAD.Add(TenorParameterMetadata.of(TENOR_7Y, SPREAD_NAME + TENOR_7Y.ToString())); }
// parses the currency as a column or from the reference private ParameterMetadata parseMetadata(CsvRow row, bool lenientDateParsing) { // parse the tenor and date fields Optional <Tenor> tenorOpt = row.findValue(TENOR_HEADER).flatMap(LoaderUtils.tryParseTenor); Optional <LocalDate> dateOpt = row.findValue(DATE_HEADER).map(LoaderUtils.parseDate); Optional <string> tenorStrOpt = row.findValue(TENOR_HEADER); if (tenorStrOpt.Present && !tenorOpt.Present) { if (lenientDateParsing && !dateOpt.Present && !resolver.TenorRequired) { try { dateOpt = tenorStrOpt.map(LoaderUtils.parseDate); } catch (Exception) { // hide this exception, as this is a historic format throw new System.ArgumentException(Messages.format("Invalid tenor '{}', must be expressed as nD, nW, nM or nY", tenorStrOpt.get())); } } else { throw new System.ArgumentException(Messages.format("Invalid tenor '{}', must be expressed as nD, nW, nM or nY", tenorStrOpt.get())); } } // build correct metadata based on the parsed fields if (tenorOpt.Present) { Tenor tenor = resolver.checkSensitivityTenor(tenorOpt.get()); if (dateOpt.Present) { return(TenorDateParameterMetadata.of(dateOpt.get(), tenor)); } else { return(TenorParameterMetadata.of(tenor)); } } else if (resolver.TenorRequired) { throw new System.ArgumentException(Messages.format("Missing value for '{}' column", TENOR_HEADER)); } else if (dateOpt.Present) { return(LabelDateParameterMetadata.of(dateOpt.get(), dateOpt.get().ToString())); } else { throw new System.ArgumentException(Messages.format("Unable to parse tenor or date, check '{}' and '{}' columns", TENOR_HEADER, DATE_HEADER)); } }
static CurveSensitivityUtilsJacobianTest() { Tenor[] tenors = new Tenor[] { Tenor.TENOR_1D, Tenor.TENOR_1M, Tenor.TENOR_3M, Tenor.TENOR_6M, Tenor.TENOR_1Y, Tenor.TENOR_2Y, Tenor.TENOR_3Y, Tenor.TENOR_4Y, Tenor.TENOR_5Y, Tenor.TENOR_7Y, Tenor.TENOR_10Y, Tenor.TENOR_15Y, Tenor.TENOR_20Y, Tenor.TENOR_30Y }; IList <TenorParameterMetadata> metadataList = new List <TenorParameterMetadata>(); for (int looptenor = 0; looptenor < tenors.Length; looptenor++) { metadataList.Add(TenorParameterMetadata.of(tenors[looptenor])); } DoubleArray rate_eur = DoubleArray.of(0.0160, 0.0165, 0.0155, 0.0155, 0.0155, 0.0150, 0.0150, 0.0160, 0.0165, 0.0155, 0.0155, 0.0155, 0.0150, 0.0140); InterpolatedNodalCurve curve_single_eur = InterpolatedNodalCurve.builder().metadata(DefaultCurveMetadata.builder().curveName(EUR_SINGLE_NAME).parameterMetadata(metadataList).dayCount(ACT_365F).xValueType(ValueType.YEAR_FRACTION).yValueType(ValueType.ZERO_RATE).build()).xValues(TIME_EUR).yValues(rate_eur).extrapolatorLeft(CurveExtrapolators.FLAT).extrapolatorRight(CurveExtrapolators.FLAT).interpolator(CurveInterpolators.LINEAR).build(); MULTICURVE_EUR_SINGLE_INPUT = ImmutableRatesProvider.builder(VALUATION_DATE).discountCurve(EUR, curve_single_eur).iborIndexCurve(EUR_EURIBOR_6M, curve_single_eur).build(); LIST_CURVE_NAMES_1.Add(CurveParameterSize.of(EUR_SINGLE_NAME, TIME_EUR.size())); }
/// <summary> /// Re-buckets a <seealso cref="CurrencyParameterSensitivities"/> to a given set of dates. /// <para> /// The list of dates must be sorted in chronological order. All sensitivities are re-bucketed to the same date list. /// The re-bucketing is done by linear weighting on the number of days, i.e. the sensitivities for dates outside the /// extremes are fully bucketed to the extremes and for date between two re-bucketing dates, the weight on the start /// date is the number days between end date and the date re-bucketed divided by the number of days between the /// start and the end. The date of the nodes can be directly in the parameter metadata - when the metadata is of the /// type <seealso cref="DatedParameterMetadata"/> - or inferred from the sensitivity date and the tenor when the /// metadata is of the type <seealso cref="TenorParameterMetadata"/>. Only those types of metadata are accepted. /// /// </para> /// </summary> /// <param name="sensitivities"> the input sensitivities </param> /// <param name="targetDates"> the list of dates for the re-bucketing </param> /// <param name="sensitivityDate"> the date for which the sensitivities are valid </param> /// <returns> the sensitivity after the re-bucketing </returns> public static CurrencyParameterSensitivities linearRebucketing(CurrencyParameterSensitivities sensitivities, IList <LocalDate> targetDates, LocalDate sensitivityDate) { checkSortedDates(targetDates); int nbBuckets = targetDates.Count; IList <ParameterMetadata> pmdTarget = targetDates.Select(date => LabelDateParameterMetadata.of(date, date.ToString())).ToList(); ImmutableList <CurrencyParameterSensitivity> sensitivitiesList = sensitivities.Sensitivities; IList <CurrencyParameterSensitivity> sensitivityTarget = new List <CurrencyParameterSensitivity>(); foreach (CurrencyParameterSensitivity sensitivity in sensitivitiesList) { double[] rebucketedSensitivityAmounts = new double[nbBuckets]; DoubleArray sensitivityAmounts = sensitivity.Sensitivity; IList <ParameterMetadata> parameterMetadataList = sensitivity.ParameterMetadata; for (int loopnode = 0; loopnode < sensitivityAmounts.size(); loopnode++) { ParameterMetadata nodeMetadata = parameterMetadataList[loopnode]; //JAVA TO C# CONVERTER WARNING: The .NET Type.FullName property will not always yield results identical to the Java Class.getName method: ArgChecker.isTrue((nodeMetadata is DatedParameterMetadata) || (nodeMetadata is TenorParameterMetadata), "re-bucketing requires sensitivity date or node for node {} which is of type {}", nodeMetadata.Label, nodeMetadata.GetType().FullName); LocalDate nodeDate; if (nodeMetadata is DatedParameterMetadata) { DatedParameterMetadata datedParameterMetadata = (DatedParameterMetadata)nodeMetadata; nodeDate = datedParameterMetadata.Date; } else { TenorParameterMetadata tenorParameterMetadata = (TenorParameterMetadata)nodeMetadata; nodeDate = sensitivityDate.plus(tenorParameterMetadata.Tenor); } rebucketingArray(targetDates, rebucketedSensitivityAmounts, sensitivityAmounts.get(loopnode), nodeDate); } CurrencyParameterSensitivity rebucketedSensitivity = CurrencyParameterSensitivity.of(sensitivity.MarketDataName, pmdTarget, sensitivity.Currency, DoubleArray.ofUnsafe(rebucketedSensitivityAmounts)); sensitivityTarget.Add(rebucketedSensitivity); } return(CurrencyParameterSensitivities.of(sensitivityTarget)); }
public void test_write_standard_withDate() { CurveName curve1 = CurveName.of("GBDSC"); CurveName curve2 = CurveName.of("GBFWD"); // listed in reverse order to check ordering CurveSensitivities sens = CurveSensitivities.builder(PortfolioItemInfo.empty().withAttribute(CCP_ATTR, "LCH")).add(ZERO_RATE_GAMMA, curve2, Currency.GBP, TenorParameterMetadata.of(Tenor.TENOR_3M), 1).add(ZERO_RATE_GAMMA, curve2, Currency.GBP, TenorParameterMetadata.of(Tenor.TENOR_6M), 2).add(ZERO_RATE_DELTA, curve2, Currency.GBP, TenorParameterMetadata.of(Tenor.TENOR_3M), 3).add(ZERO_RATE_DELTA, curve2, Currency.GBP, TenorParameterMetadata.of(Tenor.TENOR_6M), 5).add(ZERO_RATE_DELTA, curve1, Currency.GBP, TenorDateParameterMetadata.of(date(2018, 6, 30), Tenor.TENOR_3M), 2).add(ZERO_RATE_DELTA, curve1, Currency.GBP, TenorParameterMetadata.of(Tenor.TENOR_6M), 4).build(); StringBuilder buf = new StringBuilder(); WRITER_CCP.write(sens, buf); string content = buf.ToString(); string expected = "" + "Reference,Sensitivity Type,Sensitivity Tenor,Sensitivity Date,Currency,Value,CCP\n" + "GBDSC,ZeroRateDelta,3M,2018-06-30,GBP,2.0,LCH\n" + "GBDSC,ZeroRateDelta,6M,,GBP,4.0,LCH\n" + "GBFWD,ZeroRateDelta,3M,,GBP,3.0,LCH\n" + "GBFWD,ZeroRateDelta,6M,,GBP,5.0,LCH\n" + "GBFWD,ZeroRateGamma,3M,,GBP,1.0,LCH\n" + "GBFWD,ZeroRateGamma,6M,,GBP,2.0,LCH\n"; assertEquals(content, expected); }
public virtual void hard_coded_value_one_curve_one_date_tenor() { //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final java.time.LocalDate sensitivityDate = java.time.LocalDate.of(2015, 8, 18); LocalDate sensitivityDate = LocalDate.of(2015, 8, 18); System.Func <LocalDate, ParameterMetadata> parameterMetadataFunction = (d) => TenorParameterMetadata.of(Tenor.of(Period.ofDays((int)(d.toEpochDay() - sensitivityDate.toEpochDay())))); System.Func <CurrencyParameterSensitivities, CurrencyParameterSensitivities> rebucketFunction = (s) => CurveSensitivityUtils.linearRebucketing(s, TARGET_DATES, sensitivityDate); test_from_functions_one_curve_one_date(parameterMetadataFunction, rebucketFunction); }