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));
        }
Ejemplo n.º 5
0
        //-------------------------------------------------------------------------
        // 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
        }
Ejemplo n.º 9
0
        //-------------------------------------------------------------------------
        // 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"));
 }