public void test_write_standard_roundTrip() { CharSource source = ResourceLocator.ofClasspath("com/opengamma/strata/loader/csv/sensitivity-standard.csv").CharSource; ValueWithFailures <ListMultimap <string, CurveSensitivities> > parsed1 = LOADER.parse(ImmutableList.of(source)); assertEquals(parsed1.Failures.size(), 0, parsed1.Failures.ToString()); assertEquals(parsed1.Value.size(), 1); IList <CurveSensitivities> csensList1 = parsed1.Value.get(""); assertEquals(csensList1.Count, 1); CurveSensitivities csens1 = csensList1[0]; StringBuilder buf = new StringBuilder(); WRITER.write(csens1, buf); string content = buf.ToString(); ValueWithFailures <ListMultimap <string, CurveSensitivities> > parsed2 = LOADER.parse(ImmutableList.of(CharSource.wrap(content))); assertEquals(parsed2.Failures.size(), 0, parsed2.Failures.ToString()); assertEquals(parsed2.Value.size(), 1); IList <CurveSensitivities> csensList2 = parsed2.Value.get(""); assertEquals(csensList2.Count, 1); CurveSensitivities csens2 = csensList2[0]; assertEquals(csens2, csens1); }
//------------------------------------------------------------------------- public void test_parse_list() { CharSource source = ResourceLocator.ofClasspath("com/opengamma/strata/loader/csv/sensitivity-list.csv").CharSource; assertEquals(LOADER.isKnownFormat(source), true); ValueWithFailures <ListMultimap <string, CurveSensitivities> > test = LOADER.parse(ImmutableList.of(source)); assertEquals(test.Failures.size(), 0, test.Failures.ToString()); assertEquals(test.Value.size(), 1); IList <CurveSensitivities> list = test.Value.get(""); assertEquals(list.Count, 1); CurveSensitivities csens0 = list[0]; assertEquals(csens0.TypedSensitivities.size(), 3); string tenors = "1D, 1W, 2W, 1M, 3M, 6M, 12M, 2Y, 5Y, 10Y"; assertSens(csens0, ZERO_RATE_DELTA, "GBP", GBP, tenors, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); assertSens(csens0, ZERO_RATE_DELTA, "GBP-LIBOR", GBP, tenors, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); assertSens(csens0, ZERO_RATE_GAMMA, "GBP", GBP, tenors, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1); assertSens(csens0, ZERO_RATE_GAMMA, "GBP-LIBOR", GBP, tenors, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1); assertSens(csens0, OTHER, "GBP", GBP, tenors, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0); assertSens(csens0, OTHER, "GBP-LIBOR", GBP, tenors, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0); }
public void test_parse_grid_full() { CharSource source = ResourceLocator.ofClasspath("com/opengamma/strata/loader/csv/sensitivity-grid-full.csv").CharSource; assertEquals(LOADER_CCP.isKnownFormat(source), true); ValueWithFailures <ListMultimap <string, CurveSensitivities> > test = LOADER_CCP.parse(ImmutableList.of(source)); assertEquals(test.Failures.size(), 0, test.Failures.ToString()); IList <CurveSensitivities> list0 = test.Value.get("SCHEME~TR1"); assertEquals(list0.Count, 1); CurveSensitivities csens0 = list0[0]; assertEquals(csens0.Id, StandardId.of("SCHEME", "TR1")); assertEquals(csens0.Info.getAttribute(CCP_ATTR), "LCH"); assertEquals(csens0.TypedSensitivities.size(), 2); assertSens(csens0, ZERO_RATE_DELTA, "GBCURVE", GBP, "1M, 3M, 6M", 1, 2, 3); assertSens(csens0, ZERO_RATE_GAMMA, "GBCURVE", GBP, "1M, 3M, 6M", 4, 5, 6); IList <CurveSensitivities> list1 = test.Value.get("OG-Sensitivity~TR2"); assertEquals(list1.Count, 1); CurveSensitivities csens1 = list1[0]; assertEquals(csens1.Id, StandardId.of("OG-Sensitivity", "TR2")); assertEquals(csens1.Info.getAttribute(CCP_ATTR), "CME"); assertEquals(csens1.TypedSensitivities.size(), 1); assertSens(csens1, ZERO_RATE_DELTA, "GBCURVE", GBP, "1M, 3M, 6M", 7, 8, 9); }
//------------------------------------------------------------------------- /// <summary> /// Write sensitivities to an appendable in the standard sensitivities format. /// <para> /// The output is written in standard format, with no identifier columns. /// The parameter metadata must contain tenors. /// /// </para> /// </summary> /// <param name="curveSens"> the curve sensitivities to write </param> /// <param name="output"> the appendable to write to </param> /// <exception cref="IllegalArgumentException"> if the metadata does not contain tenors </exception> /// <exception cref="UncheckedIOException"> if an IO error occurs </exception> public void write(CurveSensitivities curveSens, Appendable output) { CsvOutput csv = CsvOutput.standard(output, "\n"); IList <string> additionalHeaders = supplier.headers(curveSens); // check for dates if (curveSens.TypedSensitivities.values().stream().flatMap(allParamSens => allParamSens.Sensitivities.stream()).flatMap(paramSens => paramSens.ParameterMetadata.stream()).anyMatch(pmd => !(pmd is TenoredParameterMetadata))) { throw new System.ArgumentException("Parameter metadata must contain tenors"); } bool containsDates = curveSens.TypedSensitivities.values().stream().flatMap(allParamSens => allParamSens.Sensitivities.stream()).flatMap(paramSens => paramSens.ParameterMetadata.stream()).anyMatch(pmd => pmd is DatedParameterMetadata); // headers csv.writeCell(SensitivityCsvLoader.REFERENCE_HEADER); csv.writeCell(SensitivityCsvLoader.TYPE_HEADER); csv.writeCell(SensitivityCsvLoader.TENOR_HEADER); if (containsDates) { csv.writeCell(SensitivityCsvLoader.DATE_HEADER); } csv.writeCell(SensitivityCsvLoader.CURRENCY_HEADER); csv.writeCell(SensitivityCsvLoader.VALUE_HEADER); csv.writeLine(additionalHeaders); // content, grouped by reference, then type MapStream.of(curveSens.TypedSensitivities).flatMapValues(sens => sens.Sensitivities.stream()).mapKeys((type, sens) => Pair.of(sens.MarketDataName.Name, type)).sortedKeys().forEach((pair, paramSens) => write(pair.First, pair.Second, curveSens, paramSens, additionalHeaders, containsDates, csv)); }
//------------------------------------------------------------------------- // parses the file in grid format private void parseGridFormat(CsvIterator csv, ListMultimap <string, CurveSensitivities> parsed, IList <FailureItem> failures) { // find the applicable reference columns IDictionary <string, CurveName> references = new LinkedHashMap <string, CurveName>(); foreach (string header in csv.headers()) { string headerLowerCase = header.ToLower(Locale.ENGLISH); if (!REF_HEADERS.contains(headerLowerCase) && !resolver.isInfoColumn(headerLowerCase)) { references[header] = CurveName.of(header); } } // loop around all rows, peeking to match batches with the same identifier // no exception catch at this level to avoid infinite loops while (csv.hasNext()) { CsvRow peekedRow = csv.peek(); PortfolioItemInfo info = parseInfo(peekedRow); //JAVA TO C# CONVERTER TODO TASK: Method reference arbitrary object instance method syntax is not converted by Java to C# Converter: string id = info.Id.map(StandardId::toString).orElse(""); // process in batches, where the ID is the same CurveSensitivitiesBuilder builder = CurveSensitivities.builder(info); IList <CsvRow> batchRows = csv.nextBatch(r => matchId(r, id)); foreach (CsvRow batchRow in batchRows) { try { ParameterMetadata metadata = parseMetadata(batchRow, true); CurveSensitivitiesType type = batchRow.findValue(TYPE_HEADER).map(str => CurveSensitivitiesType.of(str)).orElse(CurveSensitivitiesType.ZERO_RATE_DELTA); foreach (KeyValuePair <string, CurveName> entry in references.SetOfKeyValuePairs()) { CurveName reference = entry.Value; CurveName resolvedCurveName = resolver.checkCurveName(reference); string valueStr = batchRow.getField(entry.Key); Currency currency = parseCurrency(batchRow, reference); if (valueStr.Length > 0) { double value = LoaderUtils.parseDouble(valueStr); builder.add(type, resolvedCurveName, currency, metadata, value); } } } catch (System.ArgumentException ex) { failures.Add(FailureItem.of(PARSING, "CSV file could not be parsed at line {}: {}", batchRow.lineNumber(), ex.Message)); } } CurveSensitivities sens = builder.build(); if (!sens.TypedSensitivities.Empty) { parsed.put(sens.Id.map(object.toString).orElse(""), sens); } } }
//------------------------------------------------------------------------- private void assertSens(CurveSensitivities sens, CurveSensitivitiesType type, string curveNameStr, Currency currency, string tenors, params double[] values) { CurveName curveName = CurveName.of(curveNameStr); CurrencyParameterSensitivity sensitivity = sens.getTypedSensitivity(type).getSensitivity(curveName, currency); assertEquals(sensitivity.MarketDataName, CurveName.of(curveNameStr)); assertEquals(sensitivity.Currency, currency); assertEquals(metadataString(sensitivity.ParameterMetadata), tenors); assertEquals(sensitivity.Sensitivity, DoubleArray.ofUnsafe(values)); }
public void test_parse_list_duplicateTenor() { CharSource source = CharSource.wrap("Reference,Sensitivity Tenor,Zero Rate Delta\n" + "GBP,P1D,1\n" + "GBP,P1M,2\n" + "GBP,P1M,3\n"); ValueWithFailures <ListMultimap <string, CurveSensitivities> > test = LOADER.parse(ImmutableList.of(source)); assertEquals(test.Failures.size(), 0, test.Failures.ToString()); assertEquals(test.Value.size(), 1); IList <CurveSensitivities> list = test.Value.get(""); assertEquals(list.Count, 1); CurveSensitivities csens0 = list[0]; assertEquals(csens0.TypedSensitivities.size(), 1); assertSens(csens0, ZERO_RATE_DELTA, "GBP", GBP, "1D, 1M", 1, 5); }
public void test_parse_grid_duplicateTenor() { CharSource source = CharSource.wrap("Sensitivity Type,Sensitivity Tenor,GBP\n" + "ZeroRateGamma,P6M,1\n" + "ZeroRateGamma,12M,2\n" + "ZeroRateGamma,12M,3\n"); assertEquals(LOADER_DATE.isKnownFormat(source), true); ValueWithFailures <ListMultimap <string, CurveSensitivities> > test = LOADER_DATE.parse(ImmutableList.of(source)); assertEquals(test.Failures.size(), 0, test.Failures.ToString()); assertEquals(test.Value.size(), 1); IList <CurveSensitivities> list = test.Value.get(""); assertEquals(list.Count, 1); CurveSensitivities csens0 = list[0]; assertEquals(csens0.TypedSensitivities.size(), 1); assertSens(csens0, ZERO_RATE_GAMMA, "GBP", GBP, "6M, 1Y", 1, 5); // 12M -> 1Y }
//------------------------------------------------------------------------- // parses the file in standard format private void parseStandardFormat(CsvIterator csv, ListMultimap <string, CurveSensitivities> parsed, IList <FailureItem> failures) { // loop around all rows, peeking to match batches with the same identifier // no exception catch at this level to avoid infinite loops while (csv.hasNext()) { CsvRow peekedRow = csv.peek(); PortfolioItemInfo info = parseInfo(peekedRow); //JAVA TO C# CONVERTER TODO TASK: Method reference arbitrary object instance method syntax is not converted by Java to C# Converter: string id = info.Id.map(StandardId::toString).orElse(""); // process in batches, where the ID is the same CurveSensitivitiesBuilder builder = CurveSensitivities.builder(info); IList <CsvRow> batchRows = csv.nextBatch(r => matchId(r, id)); foreach (CsvRow batchRow in batchRows) { try { CurveName reference = CurveName.of(batchRow.getValue(REFERENCE_HEADER)); CurveName resolvedCurveName = resolver.checkCurveName(reference); CurveSensitivitiesType type = CurveSensitivitiesType.of(batchRow.getValue(TYPE_HEADER)); ParameterMetadata metadata = parseMetadata(batchRow, false); Currency currency = parseCurrency(batchRow, reference); string valueStr = batchRow.getField(VALUE_HEADER); if (valueStr.Length > 0) { double value = LoaderUtils.parseDouble(valueStr); builder.add(type, resolvedCurveName, currency, metadata, value); } } catch (System.ArgumentException ex) { failures.Add(FailureItem.of(PARSING, "CSV file could not be parsed at line {}: {}", batchRow.lineNumber(), ex.Message)); } } CurveSensitivities sens = builder.build(); if (!sens.TypedSensitivities.Empty) { parsed.put(sens.Id.map(object.toString).orElse(""), sens); } } }
// writes the rows for a single CurrencyParameterSensitivity private void write(string reference, CurveSensitivitiesType type, CurveSensitivities curveSens, CurrencyParameterSensitivity paramSens, IList <string> additionalHeaders, bool containsDates, CsvOutput csv) { IList <string> additionalCells = supplier.values(additionalHeaders, curveSens, paramSens); for (int i = 0; i < paramSens.ParameterCount; i++) { ParameterMetadata pmd = paramSens.getParameterMetadata(i); Tenor tenor = ((TenoredParameterMetadata)pmd).Tenor; double value = paramSens.Sensitivity.get(i); csv.writeCell(reference); csv.writeCell(type.Name); csv.writeCell(tenor.ToString()); if (containsDates) { csv.writeCell(pmd is DatedParameterMetadata ? ((DatedParameterMetadata)pmd).Date.ToString() : ""); } csv.writeCell(paramSens.Currency.Code); csv.writeCell(decimal.valueOf(value).toPlainString()); csv.writeLine(additionalCells); } }
//------------------------------------------------------------------------- public void test_parse_multipleSources() { CharSource source1 = CharSource.wrap("Reference,Sensitivity Tenor,Zero Rate Delta\n" + "GBP-LIBOR,P1M,1.1\n" + "GBP-LIBOR,P2M,1.2\n"); CharSource source2 = CharSource.wrap("Reference,Sensitivity Tenor,Zero Rate Delta\n" + "GBP-LIBOR,P3M,1.3\n" + "GBP-LIBOR,P6M,1.4\n"); ValueWithFailures <ListMultimap <string, CurveSensitivities> > test = LOADER.parse(ImmutableList.of(source1, source2)); assertEquals(test.Failures.size(), 0, test.Failures.ToString()); assertEquals(test.Value.Keys.Count, 1); IList <CurveSensitivities> list = test.Value.get(""); assertEquals(list.Count, 2); CurveSensitivities csens0 = list[0]; assertEquals(csens0.TypedSensitivities.size(), 1); assertSens(csens0, ZERO_RATE_DELTA, "GBP-LIBOR", GBP, "1M, 2M", 1.1, 1.2); CurveSensitivities csens1 = list[1]; assertEquals(csens1.TypedSensitivities.size(), 1); assertSens(csens1, ZERO_RATE_DELTA, "GBP-LIBOR", GBP, "3M, 6M", 1.3, 1.4); }
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 void test_parse_grid_dateInTenorColumn() { CharSource source = CharSource.wrap("Sensitivity Type,Sensitivity Tenor,GBP\n" + "ZeroRateGamma,2018-06-30,1\n"); assertEquals(LOADER_DATE.isKnownFormat(source), true); ValueWithFailures <ListMultimap <string, CurveSensitivities> > test = LOADER_DATE.parse(ImmutableList.of(source)); assertEquals(test.Failures.size(), 0, test.Failures.ToString()); assertEquals(test.Value.size(), 1); IList <CurveSensitivities> list = test.Value.get(""); assertEquals(list.Count, 1); CurveSensitivities csens0 = list[0]; assertEquals(csens0.TypedSensitivities.size(), 1); CurrencyParameterSensitivities cpss = csens0.getTypedSensitivity(ZERO_RATE_GAMMA); assertEquals(cpss.Sensitivities.size(), 1); CurrencyParameterSensitivity cps = cpss.Sensitivities.get(0); assertEquals(cps.ParameterMetadata.size(), 1); assertEquals(cps.ParameterMetadata.get(0), LabelDateParameterMetadata.of(date(2018, 6, 30), "2018-06-30")); }
public override IList <string> values(IList <string> additionalHeaders, CurveSensitivities curveSens, CurrencyParameterSensitivity paramSens) { return(ImmutableList.of(curveSens.Info.findAttribute(CCP_ATTR).orElse(""))); }
public override IList <string> headers(CurveSensitivities curveSens) { return(ImmutableList.of("CCP")); }