Exemplo n.º 1
0
        /// <summary>
        /// Return fixing curve by historicalIndexRates
        /// </summary>
        /// <param name="settlementDate"></param>
        /// <param name="historicalIndexRates"></param>
        /// <param name="floatingBondInfo"></param>
        /// <returns></returns>
        public static InstrumentCurveDefinition GetFixingCurve(string settlementDate, Dictionary <string, Dictionary <string, double> > historicalIndexRates, FloatingRateBondInfo floatingBondInfo)
        {
            var resetCalendar = CalendarImpl.Get(floatingBondInfo.Calendar);
            var index         = floatingBondInfo.Index;
            var rates         = historicalIndexRates[index];
            var tradeId       = floatingBondInfo.TradeId;

            var indexDate   = new DayGap(floatingBondInfo.ResetToFixingGap).Get(resetCalendar, settlementDate.ToDate());
            var fixingTuple = rates.TryGetValue(indexDate.ToString(), resetCalendar);
            var indexRate   = rates.GetAverageIndex(fixingTuple.Item1, resetCalendar, floatingBondInfo.ResetAverageDays, floatingBondInfo.ResetRateDigits);

            string fixingCurveName      = "FixingCurve_" + tradeId;
            var    fixingRateDefinition = new[]
            {
                new RateMktData("1D", indexRate, index, "None", fixingCurveName),
                new RateMktData("50Y", indexRate, index, "None", fixingCurveName),
            };
            var curveConvention = new CurveConvention("fixingCurveConvention_" + tradeId,
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn_ib",
                                                      index == null ? "Act365" : index.ToIndexType().DayCountEnum(),
                                                      "Continuous",
                                                      "ForwardFlat");

            floatingBondInfo.ValuationParamters.FixingCurveName = fixingCurveName;
            AddTrades(new [] { floatingBondInfo });
            return(new InstrumentCurveDefinition(fixingCurveName, curveConvention, fixingRateDefinition, "ForwardCurve"));
        }
Exemplo n.º 2
0
        public QdpMarket TestMarket(string valueDate, BondMktData bondMktData)
        {
            var historiclIndexRates = HistoricalDataLoadHelper.HistoricalIndexRates;

            var curveConvention = new CurveConvention("fr007CurveConvention",
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn_ib",
                                                      "Act365",
                                                      "Continuous",
                                                      "CubicHermiteMonotic");

            var fr007CurveName      = "Fr007";
            var fr007RateDefinition = new[]
            {
                new RateMktData("1D", 0.035, "Spot", "None", fr007CurveName),
                new RateMktData("5Y", 0.035, "Spot", "None", fr007CurveName),
            };


            var curveDefinition = new[]
            {
                new InstrumentCurveDefinition(fr007CurveName, curveConvention, fr007RateDefinition, "SpotCurve"),
            };

            var marketInfo = new MarketInfo("tmpMarket", valueDate, curveDefinition)
            {
                BondMktDatas         = new[] { bondMktData },
                HistoricalIndexRates = historiclIndexRates
            };
            QdpMarket market;

            MarketFunctions.BuildMarket(marketInfo, out market);
            return(market);
        }
Exemplo n.º 3
0
        //TODO: assuming flat 50% vol here
        static private IMarketCondition DailyReportMarket_generic(string referenceDate, double spotPrice, double cbDirtyPrice, String cbTicker)
        {
            var curveDefinitions = new List <InstrumentCurveDefinition>();

            var curveConvention = new CurveConvention("curveConvention", "CNY", "ModifiedFollowing", "Chn_ib", "Act365", compoundConvention, "Linear");

            var rfCurveName   = "Fr007";
            var riskFreeCurve = getRiskFreeCurve(curveConvention, rfCurveName);

            curveDefinitions.Add(riskFreeCurve);

            var creditCurveName = "AAACreditCurve";
            var bondCreditCurve = getBondCreditCurve(curveConvention, creditCurveName);

            curveDefinitions.Add(bondCreditCurve);

            //assuming zero dividend,  this curve is almost useless for China
            var dCurveName    = "dividendCurve";
            var dividendCurve = getDividendCurve(curveConvention, dCurveName);

            curveDefinitions.Add(dividendCurve);

            //TODO:  perhaps one vol for each bond? actually we plan to backout implied vol from price, on Jin Tao's list
            var volName = "VolSurf";
            var vol     = 0.5;
            var volSurf = new[] { new VolSurfMktData(volName, vol), };

            var marketInfo = new MarketInfo("DailyCBReportMarket")
            {
                ReferenceDate         = referenceDate,
                YieldCurveDefinitions = curveDefinitions.ToArray(),
                VolSurfMktDatas       = volSurf,
                HistoricalIndexRates  = HistoricalDataLoadHelper.HistoricalIndexRates
            };

            QdpMarket market;

            MarketFunctions.BuildMarket(marketInfo, out market);
            var volsurf = market.GetData <VolSurfMktData>(volName).ToImpliedVolSurface(market.ReferenceDate);

            return(new MarketCondition(x => x.ValuationDate.Value = market.ReferenceDate,
                                       x => x.DiscountCurve.Value = market.GetData <CurveData>(creditCurveName).YieldCurve,
                                       x => x.FixingCurve.Value = market.GetData <CurveData>(creditCurveName).YieldCurve,
                                       x => x.RiskfreeCurve.Value = market.GetData <CurveData>(rfCurveName).YieldCurve,
                                       x => x.DividendCurves.Value = new Dictionary <string, IYieldCurve> {
                { "", market.GetData <CurveData>(dCurveName).YieldCurve }
            },
                                       x => x.VolSurfaces.Value = new Dictionary <string, IVolSurface> {
                { "", volsurf }
            },
                                       x => x.SpotPrices.Value = new Dictionary <string, double> {
                { "", spotPrice }
            },
                                       x => x.MktQuote.Value = new Dictionary <string, Tuple <PriceQuoteType, double> > {
                { cbTicker, Tuple.Create(PriceQuoteType.Dirty, cbDirtyPrice) }
            },
                                       x => x.HistoricalIndexRates.Value = new Dictionary <IndexType, SortedDictionary <Date, double> >()
                                       ));
        }
Exemplo n.º 4
0
        private IMarketCondition TestMarket()
        {
            var historiclIndexRates = HistoricalDataLoadHelper.HistoricalIndexRates;


            var curveConvention = new CurveConvention("fr007CurveConvention",
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn",
                                                      "Act365",
                                                      "Continuous",
                                                      "CubicHermiteMonotic");

            var fr007CurveName      = "Fr007";
            var fr007RateDefinition = new[]
            {
                new RateMktData("1D", 0.06, "Spot", "None", fr007CurveName),
                new RateMktData("5Y", 0.06, "Spot", "None", fr007CurveName),
            };

            var dividendCurveName      = "Dividend";
            var dividendRateDefinition = new[]
            {
                new RateMktData("1D", 0.03, "Spot", "None", dividendCurveName),
                new RateMktData("5Y", 0.03, "Spot", "None", dividendCurveName),
            };

            var curveDefinition = new[]
            {
                new InstrumentCurveDefinition(fr007CurveName, curveConvention, fr007RateDefinition, "SpotCurve"),
                new InstrumentCurveDefinition(dividendCurveName, curveConvention, dividendRateDefinition, "SpotCurve"),
            };

            var       volSurf    = new[] { new VolSurfMktData("VolSurf", 0.25), };
            var       marketInfo = new MarketInfo("tmpMarket", "2014-02-10", curveDefinition, historiclIndexRates, null, null, volSurf);
            QdpMarket market;
            var       result = MarketFunctions.BuildMarket(marketInfo, out market);

            var valuationDate = new Date(2014, 3, 18);
            var volsurf       = market.GetData <VolSurfMktData>("VolSurf").ToImpliedVolSurface(valuationDate);

            return(new MarketCondition(
                       x => x.ValuationDate.Value = valuationDate,
                       x => x.DiscountCurve.Value = market.GetData <CurveData>("Fr007").YieldCurve,
                       x => x.DividendCurves.Value = new Dictionary <string, IYieldCurve> {
                { "", market.GetData <CurveData>("Dividend").YieldCurve }
            },
                       x => x.VolSurfaces.Value = new Dictionary <string, IVolSurface> {
                { "", volsurf }
            },
                       x => x.SpotPrices.Value = new Dictionary <string, double> {
                { "", 1.0 }
            }
                       ));
        }
Exemplo n.º 5
0
        private QdpMarket GetMarket()
        {
            var referenceDate   = "2015-06-11";
            var curveConvention = new CurveConvention("curveConvention",
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn",
                                                      "Act365",
                                                      "Continuous",
                                                      "CubicHermiteMonotic");
            var curveDefinitions = new List <InstrumentCurveDefinition>();
            // 1 - discount curve
            var rates = new[]
            {
                new RateMktData("0D", 0.0114, "Spot", "None", "Fr007"),
                new RateMktData("1D", 0.0114, "Spot", "None", "Fr007"),
                new RateMktData("7D", 0.021, "Spot", "None", "Fr007"),
                new RateMktData("98D", 0.0228, "Spot", "None", "Fr007"),
                new RateMktData("186D", 0.0231, "Spot", "None", "Fr007"),
                new RateMktData("277D", 0.024, "Spot", "None", "Fr007"),
                new RateMktData("368D", 0.0241, "Spot", "None", "Fr007"),
                new RateMktData("732D", 0.0248, "Spot", "None", "Fr007"),
            };

            var fr007Curve = new InstrumentCurveDefinition(
                "Fr007",
                curveConvention,
                rates,
                "SpotCurve");

            curveDefinitions.Add(fr007Curve);


            var goldRates = new[]
            {
                new RateMktData("0D", 236.49, "ConvenienceYield", "CommoditySpot", "goldYield"),
                new RateMktData("187D", 240.6, "ConvenienceYield", "CommodityForward", "goldYield"),
                new RateMktData("370D", 243.45, "ConvenienceYield", "CommodityForward", "goldYield"),
            };
            var goldConvenienceYieldCurve = new InstrumentCurveDefinition("goldYield", curveConvention, goldRates, "SpotCurve", fr007Curve);

            curveDefinitions.Add(goldConvenienceYieldCurve);

            var marketInfo2 = new MarketInfo("TestMarket")
            {
                ReferenceDate         = referenceDate,
                YieldCurveDefinitions = curveDefinitions.ToArray(),
                HistoricalIndexRates  = HistoricalDataLoadHelper.HistoricalIndexRates
            };

            QdpMarket market;

            MarketFunctions.BuildMarket(marketInfo2, out market);
            return(market);
        }
Exemplo n.º 6
0
        private QdpMarket GetMarketJinTao(String valueDate, double rate, double vol, double dividendRate, string curveName, string volName, string diviCurveName, double spot = 1.0)
        {
            var curveConvention = new CurveConvention("curveConvention",
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn",
                                                      "Act365",
                                                      "Continuous",
                                                      "CubicHermiteMonotic");
            var curveDefinitions = new List <InstrumentCurveDefinition>();
            var rates            = new[]
            {
                new RateMktData("1D", rate, "Spot", "None", curveName),
                new RateMktData("1Y", rate, "Spot", "None", curveName),
            };

            var fr007Curve = new InstrumentCurveDefinition(
                curveName,
                curveConvention,
                rates,
                "SpotCurve");

            curveDefinitions.Add(fr007Curve);

            var curveConvention2 = new CurveConvention("curveConvention2",
                                                       "CNY",
                                                       "ModifiedFollowing",
                                                       "Chn",
                                                       "Act365",
                                                       "Continuous",
                                                       "CubicHermiteFd");
            //var diviCurveName = "diviCurve";
            var goldRates = new[]
            {
                new RateMktData("1D", dividendRate, "Spot", "None", diviCurveName),
                new RateMktData("1Y", dividendRate, "Spot", "None", diviCurveName),
            };
            var goldConvenienceYieldCurve = new InstrumentCurveDefinition(diviCurveName, curveConvention2, goldRates, "SpotCurve");

            curveDefinitions.Add(goldConvenienceYieldCurve);

            var volSurfMktData = new[] { new VolSurfMktData(volName, vol), };
            var stockMktData   = new[] { new StockMktData("000300.SH", spot), };
            var marketInfo2    = new MarketInfo("TestMarket",
                                                referenceDate: valueDate,
                                                yieldCurveDefinitions: curveDefinitions.ToArray(),
                                                historicalIndexRates: HistoricalDataLoadHelper.HistoricalIndexRates,
                                                volSurfaceDefinitions: volSurfMktData,
                                                stockDataDefinitions: stockMktData
                                                );

            MarketFunctions.BuildMarket(marketInfo2, out QdpMarket market);
            return(market);
        }
Exemplo n.º 7
0
        /// <summary>
        /// Add instrument curve market data definition to an existing market.
        /// </summary>
        /// <param name="marketName">The Existing Market Name</param>
        /// <param name="curveName">The curve name</param>
        /// <param name="curveConvention">The curveConvention</param>
        /// <param name="rateDefinitions">The rateMktData array</param>
        /// <param name="trait">(enum YieldCurveTrait)</param>
        /// <param name="baseCurveDefinition">The base InstrumentCurveDefinition(default null)</param>
        /// <param name="regriddedTenors">The regriddedTenors array(default null)</param>
        /// <param name="isOverride">if true, then add or override. if false, then ignore(default true)</param>
        /// <returns>if succeeded, return true. if failed, return error message : "Market {market object name} is not available!"</returns>
        public static object xl_MktAddYieldCurve(string marketName, string curveName,
                                                 CurveConvention curveConvention,
                                                 RateMktData[] rateDefinitions,
                                                 string trait,
                                                 InstrumentCurveDefinition baseCurveDefinition = null,
                                                 string[] regriddedTenors = null,
                                                 bool isOverride          = true)
        {
            var marketData = new InstrumentCurveDefinition(curveName, curveConvention, rateDefinitions, trait, baseCurveDefinition, regriddedTenors);

            return(XlManager.MergeMarketInfo(marketName, marketData, isOverride));
        }
Exemplo n.º 8
0
        /// <summary>
        /// Add curve convention market data definition to an existing market.
        /// </summary>
        /// <param name="marketName">The Existing Market Name</param>
        /// <param name="curveConventionName">The curve convention name</param>
        /// <param name="currency">The currency (enum CurrencyCode)</param>
        /// <param name="businessDayConvention">(enum BusinessDayConvention)</param>
        /// <param name="calendar">(enum Calendar)</param>
        /// <param name="dayCount">(enum DayCount)</param>
        /// <param name="compound">(enum Compound)</param>
        /// <param name="interpolation">(enum Interpolation)</param>
        /// <param name="isOverride">if true, then add or override. if false, then ignore(default true)</param>
        /// <returns>if succeeded, return true. if failed, return error message : "Market {market object name} is not available!"</returns>
        public static object xl_MktAddCurveConvention(string marketName, string curveConventionName,
                                                      string currency,
                                                      string businessDayConvention,
                                                      string calendar,
                                                      string dayCount,
                                                      string compound,
                                                      string interpolation,
                                                      bool isOverride = true)
        {
            var marketData = new CurveConvention(curveConventionName, currency, businessDayConvention, calendar, dayCount, compound, interpolation);

            return(XlManager.MergeMarketInfo(marketName, marketData, isOverride));
        }
Exemplo n.º 9
0
        //No need to change,  just zero dividend here
        static private InstrumentCurveDefinition getDividendCurve(CurveConvention curveConvention, String dCurveName)
        {
            var rates3 = new[]
            {
                new RateMktData("1D", 0.0, rateTrait, "None", dCurveName),
                new RateMktData("15Y", 0.0, rateTrait, "None", dCurveName),
            };

            return(new InstrumentCurveDefinition(
                       dCurveName,
                       curveConvention,
                       rates3,
                       curveTrait));
        }
Exemplo n.º 10
0
        private QdpMarket TestMarket(string trait, string interpolation)
        {
            var curveConvention = new CurveConvention("curveConvention",
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn_ib",
                                                      "Act365",
                                                      "Continuous",
                                                      interpolation);
            var curveDefinitions = new List <InstrumentCurveDefinition>();
            // 1 - discount curve
            var rates = new[]
            {
                new RateMktData("1D", 0.0189, "Fr001", "Deposit", "Fr007"),
                new RateMktData("7D", 0.024, "Fr001", "Deposit", "Fr007"),
                new RateMktData("3M", 0.0239, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("6M", 0.02385, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("9M", 0.02385, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("1Y", 0.0239, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("2Y", 0.02405, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("3Y", 0.02495, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("4Y", 0.0259, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("5Y", 0.0267, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("7Y", 0.0283, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("10Y", 0.0297, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("15Y", 0.032, "Fr007", "InterestRateSwap", "Fr007")
            };

            var fr007Curve = new InstrumentCurveDefinition(
                "Fr007",
                curveConvention,
                rates,
                trait);

            curveDefinitions.Add(fr007Curve);


            var marketInfo = new MarketInfo("TestMarket")
            {
                ReferenceDate         = "2016-04-28",
                YieldCurveDefinitions = curveDefinitions.ToArray(),
                HistoricalIndexRates  = HistoricalDataLoadHelper.HistoricalIndexRates
            };

            QdpMarket market;

            MarketFunctions.BuildMarket(marketInfo, out market);
            return(market);
        }
Exemplo n.º 11
0
        //TODO: download real data from WIND
        static private InstrumentCurveDefinition getBondCreditCurve(CurveConvention curveConvention, String creditCurveName)
        {
            double flatCreditRate = 0.05;
            var    rates2         = new[]
            {
                new RateMktData("1D", flatCreditRate, rateTrait, "None", creditCurveName),
                new RateMktData("15Y", flatCreditRate, rateTrait, "None", creditCurveName),
            };

            return(new InstrumentCurveDefinition(
                       creditCurveName,
                       curveConvention,
                       rates2,
                       curveTrait));
        }
Exemplo n.º 12
0
        //TODO: download real data from WIND
        static private InstrumentCurveDefinition getRiskFreeCurve(CurveConvention curveConvention, String rfCurveName)
        {
            double flatRiskFreeRate = 0.05;
            var    rates            = new[]
            {
                new RateMktData("1D", flatRiskFreeRate, rateTrait, "None", rfCurveName),
                new RateMktData("15Y", flatRiskFreeRate, rateTrait, "None", rfCurveName),
            };

            return(new InstrumentCurveDefinition(
                       rfCurveName,
                       curveConvention,
                       rates,
                       curveTrait));
        }
Exemplo n.º 13
0
        private MarketInfo TestMarket()
        {
            var historiclIndexRates = HistoricalDataLoadHelper.HistoricalIndexRates;

            var curveConvention = new CurveConvention("fr007CurveConvention",
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn_ib",
                                                      "Act365",
                                                      "Continuous",
                                                      "CubicHermiteMonotic");

            var fr007CurveName      = "Fr007";
            var fr007RateDefinition = new[]
            {
                new RateMktData("1D", 0.05, "Spot", "None", fr007CurveName),
                new RateMktData("5Y", 0.05, "Spot", "None", fr007CurveName),
            };

            var dividendCurveName      = "Dividend";
            var dividendRateDefinition = new[]
            {
                new RateMktData("1D", 0.02, "Spot", "None", dividendCurveName),
                new RateMktData("5Y", 0.02, "Spot", "None", dividendCurveName),
            };

            var curveDefinition = new[]
            {
                new InstrumentCurveDefinition(fr007CurveName, curveConvention, fr007RateDefinition, "SpotCurve"),
                new InstrumentCurveDefinition(dividendCurveName, curveConvention, dividendRateDefinition, "SpotCurve"),
            };

            var volSurf = new[] { new VolSurfMktData("VolSurf", 0.28), };

            var stockMktData = new[] { new StockMktData("000300.SH", 3971.7 / 3839.74), };

            var referenceDate = "2015-03-27";

            return(new MarketInfo(
                       marketName: "tmpMarket",
                       referenceDate: referenceDate,
                       yieldCurveDefinitions: curveDefinition,
                       historicalIndexRates: historiclIndexRates,
                       volSurfaceDefinitions: volSurf,
                       stockDataDefinitions: stockMktData
                       ));
        }
Exemplo n.º 14
0
        private QdpMarket TestMarket(String referenceDate = "2017-10-25", double vol = 0.2, double spot = 1.0, double rate = 0.05, double dividend = 0.0)
        {
            var historiclIndexRates = HistoricalDataLoadHelper.HistoricalIndexRates;

            var curveConvention = new CurveConvention("fr007CurveConvention",
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn",
                                                      "Act365",
                                                      "Continuous",
                                                      "CubicHermiteMonotic");

            var fr007CurveName      = "Fr007";
            var fr007RateDefinition = new[]
            {
                new RateMktData("1D", rate, "Spot", "None", fr007CurveName),
                new RateMktData("5Y", rate, "Spot", "None", fr007CurveName),
            };

            var dividendCurveName      = "Dividend";
            var dividendRateDefinition = new[]
            {
                new RateMktData("1D", dividend, "Spot", "None", dividendCurveName),
                new RateMktData("5Y", dividend, "Spot", "None", dividendCurveName),
            };

            var curveDefinition = new[]
            {
                new InstrumentCurveDefinition(fr007CurveName, curveConvention, fr007RateDefinition, "SpotCurve"),
                new InstrumentCurveDefinition(dividendCurveName, curveConvention, dividendRateDefinition, "SpotCurve"),
            };

            var volSurf      = new[] { new VolSurfMktData("VolSurf", vol), };
            var stockMktData = new[] { new StockMktData("000300.SH", spot), };

            var marketInfo = new MarketInfo("tmpMarket",
                                            referenceDate: referenceDate,
                                            yieldCurveDefinitions: curveDefinition,
                                            historicalIndexRates: historiclIndexRates,
                                            volSurfaceDefinitions: volSurf,
                                            stockDataDefinitions: stockMktData
                                            );
            QdpMarket market;

            MarketFunctions.BuildMarket(marketInfo, out market);
            return(market);
        }
Exemplo n.º 15
0
        public void Fr007CurveConstructionTest()
        {
            var historiclIndexRates = HistoricalDataLoadHelper.HistoricalIndexRates;

            var fr007CurveName       = "Swap_Fr007";
            var fr007CurveConvention = new CurveConvention("fr007CurveConvention",
                                                           "CNY",
                                                           "ModifiedFollowing",
                                                           "Chn_ib",
                                                           "Act365",
                                                           "Continuous",
                                                           "CubicHermiteMonotic");
            var rateDefinition = new[]
            {
                new RateMktData("1D", 0.0431, "Fr007", "Deposit", fr007CurveName),
                new RateMktData("7D", 0.053, "Fr007", "Deposit", fr007CurveName),
                new RateMktData("3M", 0.0494, "Fr007", "InterestRateSwap", fr007CurveName),
                new RateMktData("6M", 0.0493, "Fr007", "InterestRateSwap", fr007CurveName),
            };

            var curveDefinition = new[]
            {
                new InstrumentCurveDefinition(fr007CurveName, fr007CurveConvention, rateDefinition, "SpotCurve")
            };

            var marketInfo = new MarketInfo("tmpMarket", "2014-02-10", curveDefinition, historiclIndexRates);
            var temp       = CalendarImpl.Get("chn_ib");

            QdpMarket market = null;

            var time1 = DateTime.Now;

            for (var i = 0; i <= 10; ++i)
            {
                var result = MarketFunctions.BuildMarket(marketInfo, out market);
            }
            var time2 = DateTime.Now;

            Console.WriteLine("{0}ms", (time2 - time1).TotalMilliseconds);
            var fr007Curve = market.GetData <CurveData>(fr007CurveName).YieldCurve;

            Assert.AreEqual(fr007Curve.KeyPoints[0].Item2, 0.0430974555290732, 1e-4);            // use IrsFloatingLegPvReal
            Assert.AreEqual(fr007Curve.KeyPoints[3].Item2, 0.048992349561639, 1e-4);             // use IrsFloatingLegPvReal
        }
Exemplo n.º 16
0
        private IMarketCondition TestMarket()
        {
            var curveConvention = new CurveConvention("curveConvention",
                                                      "CNY",
                                                      "Following",
                                                      "Chn_ib",
                                                      "Act365",
                                                      "Continuous",
                                                      "Linear");
            var curveDefinitions = new List <InstrumentCurveDefinition>();
            // 1 - discount curve
            var rates = new[]
            {
                new RateMktData("1D", 0.06, "Spot", "None", "Fr007"),
                new RateMktData("10Y", 0.06, "Spot", "None", "Fr007"),
            };

            var fr007Curve = new InstrumentCurveDefinition(
                "Fr007",
                curveConvention,
                rates,
                "SpotCurve");

            curveDefinitions.Add(fr007Curve);

            var marketInfo = new MarketInfo("TestMarket")
            {
                ReferenceDate         = "2014-05-05",
                YieldCurveDefinitions = curveDefinitions.ToArray(),
                HistoricalIndexRates  = HistoricalDataLoadHelper.HistoricalIndexRates
            };

            QdpMarket market;

            MarketFunctions.BuildMarket(marketInfo, out market);
            return(new MarketCondition(
                       x => x.ValuationDate.Value = new Date(DateTime.Parse(marketInfo.ReferenceDate)),
                       x => x.DiscountCurve.Value = market.GetData <CurveData>("Fr007").YieldCurve,
                       x => x.FixingCurve.Value = market.GetData <CurveData>("Fr007").YieldCurve,
                       x => x.HistoricalIndexRates.Value = new Dictionary <IndexType, SortedDictionary <Date, double> >()
                       ));
        }
Exemplo n.º 17
0
        /// <summary>
        /// Return funding curve by fund rate
        /// </summary>
        /// <param name="fundRate"></param>
        /// <returns></returns>
        public static InstrumentCurveDefinition GetFundingCurve(double fundRate)
        {
            var curveConvention = new CurveConvention("curveConvention",
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn_ib",
                                                      "Act365",
                                                      "Simple",
                                                      "Linear"
                                                      );

            var fundingCurveName = "FundingCurve";
            var fundingRates     = new[]
            {
                new RateMktData("1D", fundRate, "Spot", "None", fundingCurveName),
                new RateMktData("5Y", fundRate, "Spot", "None", fundingCurveName),
            };

            return(new InstrumentCurveDefinition(fundingCurveName, curveConvention, fundingRates, "SpotCurve"));
        }
Exemplo n.º 18
0
        private List <InstrumentCurveDefinition> GetTestBondPnLCurveDefinition(string curveName)
        {
            var curveConvention = new CurveConvention(Guid.NewGuid().ToString(),
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn_ib",
                                                      "Act365",
                                                      "Annual",
                                                      "Linear");
            var curveDefinitions = new List <InstrumentCurveDefinition>();

            var trait = "Spot";
            var type  = "None";
            var rates = new[]
            {
                new RateMktData("1D", 0.0189, trait, type, curveName),
                new RateMktData("7D", 0.024, trait, type, curveName),
                new RateMktData("3M", 0.0239, trait, type, curveName),
                new RateMktData("6M", 0.02385, trait, type, curveName),
                new RateMktData("9M", 0.02385, trait, type, curveName),
                new RateMktData("1Y", 0.0239, trait, type, curveName),
                new RateMktData("2Y", 0.02405, trait, type, curveName),
                new RateMktData("3Y", 0.02495, trait, type, curveName),
                new RateMktData("4Y", 0.0259, trait, type, curveName),
                new RateMktData("5Y", 0.0267, trait, type, curveName),
                new RateMktData("7Y", 0.0283, trait, type, curveName),
                new RateMktData("10Y", 0.0297, trait, type, curveName),
                new RateMktData("15Y", 0.032, trait, type, curveName)
            };

            var curve = new InstrumentCurveDefinition(
                curveName,
                curveConvention,
                rates,
                "SpotCurve");

            curveDefinitions.Add(curve);

            return(curveDefinitions);
        }
Exemplo n.º 19
0
        private List <InstrumentCurveDefinition> GetTestIrsCurveDefinition(string curveName)
        {
            var curveConvention = new CurveConvention(Guid.NewGuid().ToString(),
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn_ib",
                                                      "Act365",
                                                      "Continuous",
                                                      "CubicHermiteMonotic");
            var curveDefinitions = new List <InstrumentCurveDefinition>();

            var rates = new[]
            {
                new RateMktData("1D", 0.0189, "Fr001", "Deposit", curveName),
                new RateMktData("7D", 0.024, "Fr001", "Deposit", curveName),
                new RateMktData("3M", 0.0239, "Fr007", "InterestRateSwap", curveName),
                new RateMktData("6M", 0.02385, "Fr007", "InterestRateSwap", curveName),
                new RateMktData("9M", 0.02385, "Fr007", "InterestRateSwap", curveName),
                new RateMktData("1Y", 0.0239, "Fr007", "InterestRateSwap", curveName),
                new RateMktData("2Y", 0.02405, "Fr007", "InterestRateSwap", curveName),
                new RateMktData("3Y", 0.02495, "Fr007", "InterestRateSwap", curveName),
                new RateMktData("4Y", 0.0259, "Fr007", "InterestRateSwap", curveName),
                new RateMktData("5Y", 0.0267, "Fr007", "InterestRateSwap", curveName),
                new RateMktData("7Y", 0.0283, "Fr007", "InterestRateSwap", curveName),
                new RateMktData("10Y", 0.0297, "Fr007", "InterestRateSwap", curveName),
                new RateMktData("15Y", 0.032, "Fr007", "InterestRateSwap", curveName)
            };

            var fr007Curve = new InstrumentCurveDefinition(
                curveName,
                curveConvention,
                rates,
                "SpotCurve");

            curveDefinitions.Add(fr007Curve);

            return(curveDefinitions);
        }
Exemplo n.º 20
0
        private IMarketCondition TestMarket(String referenceDate = "2015-03-19",
                                            Double vol           = 0.28, Double volNew = 0.30, Double spot = 1.0, Double spotNew = 2.0, Double rho = 0.5,
                                            string asset1        = null, string asset2 = null)
        {
            var historiclIndexRates = HistoricalDataLoadHelper.HistoricalIndexRates;

            var curveConvention = new CurveConvention("fr007CurveConvention",
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn",
                                                      "Act365",
                                                      "Continuous",
                                                      "CubicHermiteMonotic");

            var fr007CurveName      = "Fr007";
            var fr007RateDefinition = new[]
            {
                new RateMktData("1D", 0.035, "Spot", "None", fr007CurveName),
                new RateMktData("5Y", 0.035, "Spot", "None", fr007CurveName),
            };

            var dividendCurveName      = "Dividend";
            var dividendRateDefinition = new[]
            {
                new RateMktData("1D", 0.0, "Spot", "None", dividendCurveName),
                new RateMktData("5Y", 0.0, "Spot", "None", dividendCurveName),
            };

            var curveDefinition = new[]
            {
                new InstrumentCurveDefinition(fr007CurveName, curveConvention, fr007RateDefinition, "SpotCurve"),
                new InstrumentCurveDefinition(dividendCurveName, curveConvention, dividendRateDefinition, "SpotCurve"),
            };

            var volSurf = new[] { new VolSurfMktData("VolSurf", vol), new VolSurfMktData("VolSurfNew", volNew), };
            var corr    = new[] { new CorrSurfMktData("Correlation", rho), };


            var       marketInfo = new MarketInfo("tmpMarket", referenceDate, curveDefinition, historiclIndexRates, null, null, volSurf, corr);
            QdpMarket market;

            MarketFunctions.BuildMarket(marketInfo, out market);

            var impliedVol  = market.GetData <VolSurfMktData>("VolSurf").ToImpliedVolSurface(market.ReferenceDate);
            var impliedVol2 = market.GetData <VolSurfMktData>("VolSurfNew").ToImpliedVolSurface(market.ReferenceDate);
            var corre       = market.GetData <CorrSurfMktData>("Correlation").ToImpliedVolSurface(market.ReferenceDate);

            return(new MarketCondition(
                       x => x.ValuationDate.Value = market.ReferenceDate,
                       x => x.DiscountCurve.Value = market.GetData <CurveData>("Fr007").YieldCurve,
                       x => x.DividendCurves.Value = new Dictionary <string, IYieldCurve> {
                { asset1, market.GetData <CurveData>("Dividend").YieldCurve }, { asset2, market.GetData <CurveData>("Dividend").YieldCurve }
            },
                       x => x.VolSurfaces.Value = new Dictionary <string, IVolSurface> {
                { asset1, impliedVol }, { asset2, impliedVol2 }
            },
                       x => x.SpotPrices.Value = new Dictionary <string, double> {
                { asset1, spot }, { asset2, spotNew }
            },
                       x => x.Correlations.Value = new Dictionary <string, IVolSurface> {
                { asset1, corre }
            }
                       ));
        }
Exemplo n.º 21
0
        public QdpMarket CreateTestMarket(string valueDate, Bond bond)
        {
            var historiclIndexRates = HistoricalDataLoadHelper.HistoricalIndexRates;

            var curveConvention = new CurveConvention("fr007CurveConvention",
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn_ib",
                                                      "Act365",
                                                      "Continuous",
                                                      "CubicHermiteMonotic");

            var reinvestmentCurveConvention = new CurveConvention("reinvestmentCurveConvention",
                                                                  "CNY",
                                                                  "ModifiedFollowing",
                                                                  "Chn_ib",
                                                                  "Act365",
                                                                  "Simple",
                                                                  "CubicHermiteMonotic");

            var fr007CurveName = "中债国债收益率曲线";
            ///spot是和forward相对的,spot的意思是从现在开始算,forward的意思是从未来某一天开始算。我们通常说利率都是指的spot
            var fr007RateDefinition = new[]
            {
                new RateMktData("1D", 0.025, "Spot", "None", fr007CurveName),
                new RateMktData("5Y", 0.025, "Spot", "None", fr007CurveName),
            };

            var reinvestmentCurveName      = "reinvestment";
            var reinvestmentRateDefinition = new[]
            {
                new RateMktData("1D", 0.025, "Spot", "None", reinvestmentCurveName),
                new RateMktData("5Y", 0.025, "Spot", "None", reinvestmentCurveName),
            };

            var curveDefinition = new[]
            {
                new InstrumentCurveDefinition(fr007CurveName, curveConvention, fr007RateDefinition, "SpotCurve"),
                new InstrumentCurveDefinition(reinvestmentCurveName, reinvestmentCurveConvention, reinvestmentRateDefinition, "SpotCurve")
            };

            var marketInfo           = new MarketInfo("tmpMarket", valueDate, curveDefinition, historiclIndexRates);
            var bondPrices           = new List <BondMktData>();
            var treasuryFuturePrices = new List <TreasuryFutureMktData>();
            //foreach (var bond in bond.Deliverables)
            //{
            //    bondPrices.Add(new BondMktData(bond.Id, "Clean", 100.0));
            //    treasuryFuturePrices.Add(new TreasuryFutureMktData(bond.Id + "_" + bond.Id, "Clean", 100.0));
            //}
            var futurePrices = new List <FuturesMktData>()
            {
                new FuturesMktData(bond.Id, 100.0)
            };

            marketInfo.BondMktDatas          = bondPrices.ToArray();
            marketInfo.FuturesMktDatas       = futurePrices.ToArray();
            marketInfo.TreasuryFutureMktData = treasuryFuturePrices.ToArray();

            QdpMarket market;

            MarketFunctions.BuildMarket(marketInfo, out market);
            return(market);
        }
Exemplo n.º 22
0
        private IMarketCondition TestMarket_generic(string referenceDate,
                                                    double flatRiskFreeRate, double flatCreditRate,
                                                    double vol, double spotPrice, double cbDirtyPrice)
        {
            var compoundConvention = "Annual";   //quite close for most bonds
            //var compoundConvention = "Quarterly"; //fails
            //var compoundConvention = "BiMonthly"; //fails
            //var compoundConvention = "SubTriple"; //too big, 96.15
            //var compoundConvention = "SemiAnnual"; //too big  96.1506

            //var compoundConvention = "Continuous"; //bad, too small
            var curveTrait = "SpotCurve";
            var rateTrait  = "Spot";

            var curveConvention = new CurveConvention("curveConvention",
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn_ib",
                                                      "Act365",
                                                      compoundConvention,
                                                      "Linear");
            var curveDefinitions = new List <InstrumentCurveDefinition>();
            // 1 - discount curve
            var rfCurveName = "Fr007";
            var rates       = new[]
            {
                new RateMktData("1D", flatRiskFreeRate, rateTrait, "None", rfCurveName),
                new RateMktData("2Y", flatRiskFreeRate, rateTrait, "None", rfCurveName),
                new RateMktData("3Y", flatRiskFreeRate, rateTrait, "None", rfCurveName),
                new RateMktData("15Y", flatRiskFreeRate, rateTrait, "None", rfCurveName),
            };

            var fr007Curve = new InstrumentCurveDefinition(
                rfCurveName,
                curveConvention,
                rates,
                curveTrait);

            curveDefinitions.Add(fr007Curve);

            var creditCurveName = "bondCreditCurve";
            var rates2          = new[]
            {
                new RateMktData("1D", flatCreditRate, rateTrait, "None", creditCurveName),
                new RateMktData("2Y", flatCreditRate, rateTrait, "None", creditCurveName),
                new RateMktData("3Y", flatCreditRate, rateTrait, "None", creditCurveName),
                new RateMktData("15Y", flatCreditRate, rateTrait, "None", creditCurveName),
            };
            var bondCreditCurve = new InstrumentCurveDefinition(
                creditCurveName,
                curveConvention,
                rates2,
                curveTrait);

            curveDefinitions.Add(bondCreditCurve);

            //assuming zero, almost useless for China
            var dCurveName = "dividendCurve";
            var rates3     = new[]
            {
                new RateMktData("1D", 0, rateTrait, "None", dCurveName),
                new RateMktData("15Y", 0, rateTrait, "None", dCurveName),
            };
            var dividendCurve = new InstrumentCurveDefinition(
                dCurveName,
                curveConvention,
                rates3,
                curveTrait);

            curveDefinitions.Add(dividendCurve);

            var volName = "VolSurf";
            var volSurf = new[] { new VolSurfMktData(volName, vol), };

            var marketInfo = new MarketInfo("TestMarket")
            {
                ReferenceDate         = referenceDate,
                YieldCurveDefinitions = curveDefinitions.ToArray(),
                VolSurfMktDatas       = volSurf,
                HistoricalIndexRates  = HistoricalDataLoadHelper.HistoricalIndexRates
            };

            MarketFunctions.BuildMarket(marketInfo, out QdpMarket market);
            var volsurf = market.GetData <VolSurfMktData>(volName).ToImpliedVolSurface(market.ReferenceDate);

            return(new MarketCondition(x => x.ValuationDate.Value = market.ReferenceDate,
                                       x => x.DiscountCurve.Value = market.GetData <CurveData>(creditCurveName).YieldCurve,
                                       x => x.FixingCurve.Value = market.GetData <CurveData>(creditCurveName).YieldCurve,
                                       x => x.RiskfreeCurve.Value = market.GetData <CurveData>(rfCurveName).YieldCurve,
                                       x => x.DividendCurves.Value = new Dictionary <string, IYieldCurve> {
                { "", market.GetData <CurveData>(dCurveName).YieldCurve }
            },
                                       x => x.VolSurfaces.Value = new Dictionary <string, IVolSurface> {
                { "", volsurf }
            },
                                       x => x.SpotPrices.Value = new Dictionary <string, double> {
                { "", spotPrice }
            },
                                       x => x.MktQuote.Value = new Dictionary <string, Tuple <PriceQuoteType, double> > {
                { "010002", Tuple.Create(PriceQuoteType.Dirty, cbDirtyPrice) }
            },
                                       x => x.HistoricalIndexRates.Value = new Dictionary <IndexType, SortedDictionary <Date, double> >()
                                       ));
        }
Exemplo n.º 23
0
        private IMarketCondition TestMarket(String referenceDate = "2017-12-26",
                                            Double vol1          = 0.28, Double vol3  = 0.30, Double vol2   = 0.40, Double vol4   = 0.0, Double spot1   = 1.0, Double spot3   = 2.0, Double spot2 = 1.5, Double spot4 = 0.0, Double rho13 = 0.5,
                                            Double rho23         = 0.40, Double rho12 = 0.50, string asset1 = null, string asset2 = null, string asset3 = null, string asset4 = null)
        {
            var historiclIndexRates = HistoricalDataLoadHelper.HistoricalIndexRates;

            var curveConvention = new CurveConvention("fr007CurveConvention",
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn",
                                                      "Act365",
                                                      "Continuous",
                                                      "CubicHermiteMonotic");

            var fr007CurveName      = "Fr007";
            var fr007RateDefinition = new[]
            {
                new RateMktData("1D", 0.035, "Spot", "None", fr007CurveName),
                new RateMktData("5Y", 0.035, "Spot", "None", fr007CurveName),
            };

            var dividendCurveName      = "Dividend";
            var dividendRateDefinition = new[]
            {
                new RateMktData("1D", 0.0, "Spot", "None", dividendCurveName),
                new RateMktData("5Y", 0.0, "Spot", "None", dividendCurveName),
            };

            var curveDefinition = new[]
            {
                new InstrumentCurveDefinition(fr007CurveName, curveConvention, fr007RateDefinition, "SpotCurve"),
                new InstrumentCurveDefinition(dividendCurveName, curveConvention, dividendRateDefinition, "SpotCurve"),
            };

            var volSurf = new[] { new VolSurfMktData("VolSurf1", vol1), new VolSurfMktData("VolSurf2", vol2), new VolSurfMktData("VolSurf3", vol3), new VolSurfMktData("VolSurf4", vol4), };
            var corr    = new[] { new CorrSurfMktData("Correlation12", rho12), new CorrSurfMktData("Correlation23", rho23), new CorrSurfMktData("Correlation13", rho13),
                                  new CorrSurfMktData("Correlation14", 0.0),
                                  new CorrSurfMktData("Correlation24", 0.0),
                                  new CorrSurfMktData("Correlation34", 0.0), };


            var       marketInfo = new MarketInfo("tmpMarket", referenceDate, curveDefinition, historiclIndexRates, null, null, volSurf, corr);
            QdpMarket market;

            MarketFunctions.BuildMarket(marketInfo, out market);

            var impliedVol  = market.GetData <VolSurfMktData>("VolSurf1").ToImpliedVolSurface(market.ReferenceDate);
            var impliedVol2 = market.GetData <VolSurfMktData>("VolSurf2").ToImpliedVolSurface(market.ReferenceDate);
            var impliedVol3 = market.GetData <VolSurfMktData>("VolSurf3").ToImpliedVolSurface(market.ReferenceDate);
            var impliedVol4 = market.GetData <VolSurfMktData>("VolSurf4").ToImpliedVolSurface(market.ReferenceDate);
            var corr12      = market.GetData <CorrSurfMktData>("Correlation12").ToImpliedVolSurface(market.ReferenceDate);
            var corr23      = market.GetData <CorrSurfMktData>("Correlation23").ToImpliedVolSurface(market.ReferenceDate);
            var corr13      = market.GetData <CorrSurfMktData>("Correlation13").ToImpliedVolSurface(market.ReferenceDate);
            var corr14      = market.GetData <CorrSurfMktData>("Correlation14").ToImpliedVolSurface(market.ReferenceDate);
            var corr24      = market.GetData <CorrSurfMktData>("Correlation24").ToImpliedVolSurface(market.ReferenceDate);
            var corr34      = market.GetData <CorrSurfMktData>("Correlation34").ToImpliedVolSurface(market.ReferenceDate);

            return(new MarketCondition(
                       x => x.ValuationDate.Value = market.ReferenceDate,
                       x => x.DiscountCurve.Value = market.GetData <CurveData>("Fr007").YieldCurve,
                       x => x.DividendCurves.Value = new Dictionary <string, IYieldCurve> {
                { asset1, market.GetData <CurveData>("Dividend").YieldCurve }, { asset2, market.GetData <CurveData>("Dividend").YieldCurve }, { asset3, market.GetData <CurveData>("Dividend").YieldCurve }, { asset4, market.GetData <CurveData>("Dividend").YieldCurve }
            },
                       x => x.VolSurfaces.Value = new Dictionary <string, IVolSurface> {
                { asset1, impliedVol }, { asset2, impliedVol2 }, { asset3, impliedVol3 }, { asset4, impliedVol4 }
            },
                       x => x.SpotPrices.Value = new Dictionary <string, double> {
                { asset1, spot1 }, { asset2, spot2 }, { asset3, spot3 }, { asset4, spot4 }
            },
                       x => x.Correlations.Value = new Dictionary <string, IVolSurface> {
                { asset1 + asset2, corr12 }, { asset2 + asset3, corr23 }, { asset1 + asset3, corr13 },
                { asset1 + asset4, corr14 }, { asset2 + asset4, corr24 }, { asset3 + asset4, corr34 }
            }
                       ));
        }
Exemplo n.º 24
0
        private IMarketCondition TestMarket()
        {
            var referenceDate   = "2017-10-18";
            var curveConvention = new CurveConvention("curveConvention",
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn_ib",
                                                      "Act365",
                                                      "Continuous",
                                                      "Linear");
            var curveDefinitions = new List <InstrumentCurveDefinition>();
            // 1 - discount curve
            var rates = new[]
            {
                new RateMktData("1D", 0.015, "Spot", "None", "Fr007"),
                new RateMktData("15Y", 0.015, "Spot", "None", "Fr007"),
            };

            var fr007Curve = new InstrumentCurveDefinition(
                "Fr007",
                curveConvention,
                rates,
                "SpotCurve");

            curveDefinitions.Add(fr007Curve);

            var rates2 = new[]
            {
                new RateMktData("1D", 0.015, "Spot", "None", "bondCreditCurve"),
                new RateMktData("15Y", 0.015, "Spot", "None", "bondCreditCurve"),
            };
            var bondCreditCurve = new InstrumentCurveDefinition(
                "bondCreditCurve",
                curveConvention,
                rates2,
                "SpotCurve");

            curveDefinitions.Add(bondCreditCurve);

            var rates3 = new[]
            {
                new RateMktData("1D", 0, "Spot", "None", "dividendCurve"),
                new RateMktData("15Y", 0, "Spot", "None", "dividendCurve"),
            };
            var dividendCurve = new InstrumentCurveDefinition(
                "dividendCurve",
                curveConvention,
                rates3,
                "SpotCurve");

            curveDefinitions.Add(dividendCurve);

            var volSurf = new[] { new VolSurfMktData("VolSurf", 0.255669), };

            var marketInfo = new MarketInfo("TestMarket")
            {
                ReferenceDate         = referenceDate,
                YieldCurveDefinitions = curveDefinitions.ToArray(),
                VolSurfMktDatas       = volSurf,
                HistoricalIndexRates  = HistoricalDataLoadHelper.HistoricalIndexRates
            };

            MarketFunctions.BuildMarket(marketInfo, out QdpMarket market);
            var volsurf = market.GetData <VolSurfMktData>("VolSurf").ToImpliedVolSurface(market.ReferenceDate);

            return(new MarketCondition(x => x.ValuationDate.Value = market.ReferenceDate,
                                       x => x.DiscountCurve.Value = market.GetData <CurveData>("bondCreditCurve").YieldCurve,
                                       x => x.FixingCurve.Value = market.GetData <CurveData>("bondCreditCurve").YieldCurve,
                                       x => x.RiskfreeCurve.Value = market.GetData <CurveData>("Fr007").YieldCurve,
                                       x => x.DividendCurves.Value = new Dictionary <string, IYieldCurve> {
                { "", market.GetData <CurveData>("dividendCurve").YieldCurve }
            },
                                       x => x.VolSurfaces.Value = new Dictionary <string, IVolSurface> {
                { "", volsurf }
            },
                                       x => x.SpotPrices.Value = new Dictionary <string, double> {
                { "", 6.21 }
            },
                                       x => x.MktQuote.Value = new Dictionary <string, Tuple <PriceQuoteType, double> > {
                { "010002", Tuple.Create(PriceQuoteType.Dirty, 140.65) }
            },
                                       x => x.HistoricalIndexRates.Value = new Dictionary <IndexType, SortedDictionary <Date, double> >()
                                       ));
        }
Exemplo n.º 25
0
        private IMarketCondition TestMarket2()
        {
            var referenceDate    = "2017-10-20";
            var curveConvention1 = new CurveConvention("discountCurveConvention",
                                                       "CNY",
                                                       "None",
                                                       "Chn_ib",
                                                       "Act360",
                                                       "Continuous",
                                                       "Linear");
            var curveDefinitions = new List <InstrumentCurveDefinition>();
            // 1 - discount curve
            var rates = new[]
            {
                new RateMktData("0Y", 0.041004, "Spot", "None", "DiscountCurve"),
                new RateMktData("1M", 0.045247, "Spot", "None", "DiscountCurve"),
                new RateMktData("3M", 0.049065, "Spot", "None", "DiscountCurve"),
                new RateMktData("6M", 0.048518, "Spot", "None", "DiscountCurve"),
                new RateMktData("9M", 0.049887, "Spot", "None", "DiscountCurve"),
                new RateMktData("1Y", 0.050482, "Spot", "None", "DiscountCurve"),
                new RateMktData("2Y", 0.050935, "Spot", "None", "DiscountCurve"),
                new RateMktData("3Y", 0.05185, "Spot", "None", "DiscountCurve"),
                new RateMktData("4Y", 0.052519, "Spot", "None", "DiscountCurve"),
                new RateMktData("5Y", 0.053361, "Spot", "None", "DiscountCurve"),
                new RateMktData("6Y", 0.055701, "Spot", "None", "DiscountCurve"),
                new RateMktData("7Y", 0.055637, "Spot", "None", "DiscountCurve"),
                new RateMktData("8Y", 0.055674, "Spot", "None", "DiscountCurve"),
                new RateMktData("9Y", 0.056529, "Spot", "None", "DiscountCurve"),
                new RateMktData("10Y", 0.056457, "Spot", "None", "DiscountCurve"),
                new RateMktData("15Y", 0.05672, "Spot", "None", "DiscountCurve"),
                new RateMktData("20Y", 0.058323, "Spot", "None", "DiscountCurve"),
                new RateMktData("30Y", 0.058335, "Spot", "None", "DiscountCurve")
            };


            var discountCurve = new InstrumentCurveDefinition(
                "DiscountCurve",
                curveConvention1,
                rates,
                "SpotCurve");

            curveDefinitions.Add(discountCurve);

            var curveConvention2 = new CurveConvention("riskFreeCurveConvention",
                                                       "CNY",
                                                       "ModifiedFollowing",
                                                       "Chn_ib",
                                                       "Act365",
                                                       "Continuous",
                                                       "CubicHermiteMonotic");
            var rates2 = new[]
            {
                new RateMktData("1D", 0.0283, "Spot", "None", "Fr007SwapCurve"),
                new RateMktData("7D", 0.0344, "Spot", "None", "Fr007SwapCurve"),
                new RateMktData("3M", 0.0349, "Spot", "None", "Fr007SwapCurve"),
                new RateMktData("6M", 0.035411, "Spot", "None", "Fr007SwapCurve"),
                new RateMktData("9M", 0.035567, "Spot", "None", "Fr007SwapCurve"),
                new RateMktData("1Y", 0.035503, "Spot", "None", "Fr007SwapCurve"),
                new RateMktData("2Y", 0.036372, "Spot", "None", "Fr007SwapCurve"),
                new RateMktData("3Y", 0.037521, "Spot", "None", "Fr007SwapCurve"),
                new RateMktData("4Y", 0.037916, "Spot", "None", "Fr007SwapCurve"),
                new RateMktData("5Y", 0.038606, "Spot", "None", "Fr007SwapCurve"),
                new RateMktData("7Y", 0.039, "Spot", "None", "Fr007SwapCurve"),
                new RateMktData("10Y", 0.0397, "Spot", "None", "Fr007SwapCurve")
            };
            var riskFreeCurve = new InstrumentCurveDefinition(
                "Fr007SwapCurve",
                curveConvention2,
                rates2,
                "SpotCurve");

            curveDefinitions.Add(riskFreeCurve);

            var rates3 = new[]
            {
                new RateMktData("1D", 0, "Spot", "None", "DividendCurve"),
                new RateMktData("50Y", 0, "Spot", "None", "DividendCurve"),
            };

            var curveConvention3 = new CurveConvention("dividendCurveConvention",
                                                       "CNY",
                                                       "ModifiedFollowing",
                                                       "Chn_ib",
                                                       "Act365",
                                                       "Continuous",
                                                       "Linear");
            var dividendCurve = new InstrumentCurveDefinition(
                "DividendCurve",
                curveConvention3,
                rates3,
                "SpotCurve");

            curveDefinitions.Add(dividendCurve);

            var volSurf = new[] { new VolSurfMktData("VolSurf", 0.5885), };

            var marketInfo = new MarketInfo("TestMarket")
            {
                ReferenceDate         = referenceDate,
                YieldCurveDefinitions = curveDefinitions.ToArray(),
                VolSurfMktDatas       = volSurf,
                HistoricalIndexRates  = HistoricalDataLoadHelper.HistoricalIndexRates
            };

            MarketFunctions.BuildMarket(marketInfo, out QdpMarket market);
            var volsurf = market.GetData <VolSurfMktData>("VolSurf").ToImpliedVolSurface(market.ReferenceDate);

            return(new MarketCondition(x => x.ValuationDate.Value = market.ReferenceDate,
                                       x => x.DiscountCurve.Value = market.GetData <CurveData>("DiscountCurve").YieldCurve,
                                       x => x.FixingCurve.Value = market.GetData <CurveData>("DiscountCurve").YieldCurve,
                                       x => x.DividendCurves.Value = new Dictionary <string, IYieldCurve> {
                { "", market.GetData <CurveData>("DividendCurve").YieldCurve }
            },
                                       x => x.RiskfreeCurve.Value = market.GetData <CurveData>("Fr007SwapCurve").YieldCurve,
                                       x => x.VolSurfaces.Value = new Dictionary <string, IVolSurface> {
                { "", volsurf }
            },
                                       x => x.SpotPrices.Value = new Dictionary <string, double> {
                { "", 7 }
            },
                                       x => x.MktQuote.Value = new Dictionary <string, Tuple <PriceQuoteType, double> > {
                { "110030.SH", Tuple.Create(PriceQuoteType.Dirty, 110.8192) }
            },
                                       x => x.HistoricalIndexRates.Value = new Dictionary <IndexType, SortedDictionary <Date, double> >()
                                       ));
        }
Exemplo n.º 26
0
        public QdpMarket VerifyCurveConstructionMarket(string referenceDate)
        {
            var curveConvention = new CurveConvention("curveConvention",
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn_ib",
                                                      "Act365",
                                                      "Continuous",
                                                      "CubicHermiteMonotic");
            var curveDefinitions = new List <InstrumentCurveDefinition>();
            // 1 - discount curve
            var rates = new[]
            {
                //new RateMktData("1D", 0.0189, "Spot", "None","Fr007"),
                //new RateMktData("7D", 0.024, "Spot", "None","Fr007"),
                new RateMktData("1D", 0.0189, "Fr001", "Deposit", "Fr007"),
                new RateMktData("7D", 0.024, "Fr001", "Deposit", "Fr007"),
                new RateMktData("3M", 0.0239, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("6M", 0.02385, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("9M", 0.02385, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("1Y", 0.0239, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("2Y", 0.02405, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("3Y", 0.02495, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("4Y", 0.0259, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("5Y", 0.0267, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("7Y", 0.0283, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("10Y", 0.0297, "Fr007", "InterestRateSwap", "Fr007"),
                new RateMktData("15Y", 0.032, "Fr007", "InterestRateSwap", "Fr007")
            };

            var fr007Curve = new InstrumentCurveDefinition(
                "Fr007",
                curveConvention,
                rates,
                "SpotCurve");

            curveDefinitions.Add(fr007Curve);

            var shibor3Mrates = new[]
            {
                new RateMktData("1D", 0.01909, "Shibor1D", "Deposit", "Shibor3M"),
                new RateMktData("7D", 0.02401, "Shibor1W", "Deposit", "Shibor3M"),
                new RateMktData("3M", 0.03144, "Shibor3M", "Deposit", "Shibor3M"),
                new RateMktData("6M", 0.0323, "Shibor3M", "InterestRateSwap", "Shibor3M"),
                new RateMktData("9M", 0.0323, "Shibor3M", "InterestRateSwap", "Shibor3M"),
                new RateMktData("1Y", 0.0323, "Shibor3M", "InterestRateSwap", "Shibor3M"),
                new RateMktData("2Y", 0.033, "Shibor3M", "InterestRateSwap", "Shibor3M"),
                new RateMktData("3Y", 0.03325, "Shibor3M", "InterestRateSwap", "Shibor3M"),
                new RateMktData("4Y", 0.03345, "Shibor3M", "InterestRateSwap", "Shibor3M"),
                new RateMktData("5Y", 0.03405, "Shibor3M", "InterestRateSwap", "Shibor3M"),
                new RateMktData("7Y", 0.03435, "Shibor3M", "InterestRateSwap", "Shibor3M"),
                new RateMktData("10Y", 0.03585, "Shibor3M", "InterestRateSwap", "Shibor3M"),
            };

            var shibor3MCurve = new InstrumentCurveDefinition(
                "Shibor3M",
                curveConvention,
                shibor3Mrates,
                "SpotCurve");

            curveDefinitions.Add(shibor3MCurve);

            var shibor1Drates = new[]
            {
                new RateMktData("1D", 0.02881, "Shibor1D", "Deposit", "Shibor1D"),
                new RateMktData("7D", 0.03873, "Shibor1W", "Deposit", "Shibor1D"),
                new RateMktData("3M", 0.0285, "Shibor1D", "InterestRateSwap", "Shibor1D"),
                new RateMktData("6M", 0.0285, "Shibor1D", "InterestRateSwap", "Shibor1D"),
                new RateMktData("9M", 0.0285, "Shibor1D", "InterestRateSwap", "Shibor1D"),
                new RateMktData("1Y", 0.0285, "Shibor1D", "InterestRateSwap", "Shibor1D"),
                new RateMktData("2Y", 0.0291, "Shibor1D", "InterestRateSwap", "Shibor1D"),
                new RateMktData("3Y", 0.0293, "Shibor1D", "InterestRateSwap", "Shibor1D"),
            };

            var shibor1DCurve = new InstrumentCurveDefinition(
                "Shibor1D",
                curveConvention,
                shibor1Drates,
                "SpotCurve");

            curveDefinitions.Add(shibor1DCurve);

            var depo1Yrates = new[]
            {
                new RateMktData("3M", 0.0135, "Depo3M", "Deposit", "Depo1Y"),
                new RateMktData("6M", 0.0155, "Depo6M", "Deposit", "Depo1Y"),
                new RateMktData("1Y", 0.0175, "Depo1Y", "Deposit", "Depo1Y"),
                new RateMktData("2Y", 0.01575, "Depo1Y", "InterestRateSwap", "Depo1Y"),
                new RateMktData("3Y", 0.0155, "Depo1Y", "InterestRateSwap", "Depo1Y"),
                new RateMktData("4Y", 0.0166, "Depo1Y", "InterestRateSwap", "Depo1Y"),
                new RateMktData("5Y", 0.0166, "Depo1Y", "InterestRateSwap", "Depo1Y"),
                new RateMktData("7Y", 0.0171, "Depo1Y", "InterestRateSwap", "Depo1Y"),
                new RateMktData("10Y", 0.0181, "Depo1Y", "InterestRateSwap", "Depo1Y"),
            };

            var depo1YCurve = new InstrumentCurveDefinition(
                "Depo1Y",
                curveConvention,
                depo1Yrates,
                "SpotCurve");

            curveDefinitions.Add(depo1YCurve);

            var marketInfo2 = new MarketInfo("TestMarket")
            {
                ReferenceDate         = referenceDate,
                YieldCurveDefinitions = curveDefinitions.ToArray(),
                HistoricalIndexRates  = HistoricalDataLoadHelper.HistoricalIndexRates
            };

            QdpMarket market;

            MarketFunctions.BuildMarket(marketInfo2, out market);
            return(market);
        }
Exemplo n.º 27
0
        public void MoneynessDeltaTest()
        {
            var startDate    = new Date(2018, 03, 02);
            var maturityDate = new Date(2018, 04, 27);

            var call = new VanillaOption(startDate,
                                         maturityDate,
                                         OptionExercise.American,
                                         OptionType.Call,
                                         1.05,
                                         InstrumentType.Stock,
                                         CalendarImpl.Get("chn"),
                                         new Act365(),
                                         CurrencyCode.CNY,
                                         CurrencyCode.CNY,
                                         new[] { maturityDate },
                                         new[] { maturityDate },
                                         12,
                                         null,
                                         null,
                                         0,
                                         true,
                                         8000);

            #region construct market
            var historiclIndexRates = HistoricalDataLoadHelper.HistoricalIndexRates;
            var curveConvention     = new CurveConvention("fr007CurveConvention",
                                                          "CNY",
                                                          "ModifiedFollowing",
                                                          "Chn",
                                                          "Act365",
                                                          "Continuous",
                                                          "CubicHermiteMonotic");

            var fr007CurveName      = "Fr007";
            var fr007RateDefinition = new[]
            {
                new RateMktData("1D", 0.05, "Spot", "None", fr007CurveName),
                new RateMktData("5Y", 0.05, "Spot", "None", fr007CurveName),
            };

            var dividendCurveName      = "Dividend";
            var dividendRateDefinition = new[]
            {
                new RateMktData("1D", 0, "Spot", "None", dividendCurveName),
                new RateMktData("5Y", 0, "Spot", "None", dividendCurveName),
            };

            var curveDefinition = new[]
            {
                new InstrumentCurveDefinition(fr007CurveName, curveConvention, fr007RateDefinition, "SpotCurve"),
                new InstrumentCurveDefinition(dividendCurveName, curveConvention, dividendRateDefinition, "SpotCurve"),
            };

            var       volSurf    = new[] { new VolSurfMktData("VolSurf", 0.3), };
            var       marketInfo = new MarketInfo("tmpMarket", "2018-03-02", curveDefinition, historiclIndexRates, null, null, volSurf);
            QdpMarket qdpMarket;
            MarketFunctions.BuildMarket(marketInfo, out qdpMarket);

            var valuationDate = new Date(2018, 3, 2);

            //flat vol surface

            var surface1 = qdpMarket.GetData <VolSurfMktData>("VolSurf").ToImpliedVolSurface(valuationDate);
            // market with flat vol surface
            var market = new MarketCondition(
                x => x.ValuationDate.Value  = valuationDate,
                x => x.DiscountCurve.Value  = qdpMarket.GetData <CurveData>("Fr007").YieldCurve,
                x => x.DividendCurves.Value = new Dictionary <string, IYieldCurve> {
                { "", qdpMarket.GetData <CurveData>("Dividend").YieldCurve }
            },
                x => x.VolSurfaces.Value = new Dictionary <string, IVolSurface> {
                { "", surface1 }
            },
                x => x.SpotPrices.Value = new Dictionary <string, double> {
                { "", 8000 }
            }
                );

            //a real vol surface, same as stock 600000 of 2018-03-02 in OTC system
            var maturities = new Date[]
            {
                (new Term("1W")).Next(startDate),
                (new Term("2W")).Next(startDate),
                (new Term("1M")).Next(startDate)
            };

            var strikes = new double[]
            {
                0.9,
                0.95,
                1.0,
                1.05,
                1.1
            };

            var vols = new double[3, 5];
            for (var i = 0; i < vols.GetLength(0); ++i)
            {
                for (var j = 0; j < vols.GetLength(1); ++j)
                {
                    vols[i, j] = 0.3;
                }
            }

            vols[2, 2] = 0.4;


            var surface2 = new ImpliedVolSurface(valuationDate, maturities, strikes, vols, Interpolation2D.BiLinear);
            // market with flat vol surface
            var market2 = new MarketCondition(
                x => x.ValuationDate.Value  = valuationDate,
                x => x.DiscountCurve.Value  = qdpMarket.GetData <CurveData>("Fr007").YieldCurve,
                x => x.DividendCurves.Value = new Dictionary <string, IYieldCurve> {
                { "", qdpMarket.GetData <CurveData>("Dividend").YieldCurve }
            },
                x => x.VolSurfaces.Value = new Dictionary <string, IVolSurface> {
                { "", surface2 }
            },
                x => x.SpotPrices.Value = new Dictionary <string, double> {
                { "", 8000 }
            }
                );
            #endregion

            var engine = new AnalyticalVanillaEuropeanOptionEngine();

            //result of a flat vol surface of 0.3, which is the same as pricing result in OTC-926
            var result = engine.Calculate(call, market, PricingRequest.All);

            //result of real vol surface, which is the same as scenario analysis in OTC-926
            var result2 = engine.Calculate(call, market2, PricingRequest.All);
        }
Exemplo n.º 28
0
        public QdpMarket VerifyCurveConstructionMarket(string referenceDate)
        {
            var curveConvention = new CurveConvention("curveConvention",
                                                      "CNY",
                                                      "ModifiedFollowing",
                                                      "Chn_ib",
                                                      "Act365",
                                                      "Continuous",
                                                      "ForwardFlat");
            var curveDefinitions = new List <InstrumentCurveDefinition>();
            var name             = "Fr007ForwardFlat";
            // 1 - discount curve
            var rates = new[]
            {
                new RateMktData("1D", 0.0189, "Fr001", "Deposit", name),
                new RateMktData("7D", 0.024, "Fr001", "Deposit", name),
                new RateMktData("3M", 0.0239, "Fr007", "InterestRateSwap", name),
                new RateMktData("6M", 0.02385, "Fr007", "InterestRateSwap", name),
                new RateMktData("9M", 0.02385, "Fr007", "InterestRateSwap", name),
                new RateMktData("1Y", 0.0239, "Fr007", "InterestRateSwap", name),
                new RateMktData("2Y", 0.02405, "Fr007", "InterestRateSwap", name),
                new RateMktData("3Y", 0.02495, "Fr007", "InterestRateSwap", name),
                new RateMktData("4Y", 0.0259, "Fr007", "InterestRateSwap", name),
                new RateMktData("5Y", 0.0267, "Fr007", "InterestRateSwap", name),
                new RateMktData("7Y", 0.0283, "Fr007", "InterestRateSwap", name),
                new RateMktData("10Y", 0.0297, "Fr007", "InterestRateSwap", name),
                new RateMktData("15Y", 0.032, "Fr007", "InterestRateSwap", name)
            };

            var fr007Curve = new InstrumentCurveDefinition(
                name,
                curveConvention,
                rates,
                "ForwardCurve");

            curveDefinitions.Add(fr007Curve);

            var curveConvention2 = new CurveConvention("curveConventionCubic",
                                                       "CNY",
                                                       "ModifiedFollowing",
                                                       "Chn_ib",
                                                       "Act365",
                                                       "Continuous",
                                                       "CubicHermiteMonotic");

            var name2 = "Fr007Cubic";
            // 1 - discount curve
            var rates2 = new[]
            {
                new RateMktData("1D", 0.0189, "Fr001", "Deposit", name),
                new RateMktData("7D", 0.024, "Fr001", "Deposit", name),
                new RateMktData("3M", 0.0239, "Fr007", "InterestRateSwap", name),
                new RateMktData("6M", 0.02385, "Fr007", "InterestRateSwap", name),
                new RateMktData("9M", 0.02385, "Fr007", "InterestRateSwap", name),
                new RateMktData("1Y", 0.0239, "Fr007", "InterestRateSwap", name),
                new RateMktData("2Y", 0.02405, "Fr007", "InterestRateSwap", name),
                new RateMktData("3Y", 0.02495, "Fr007", "InterestRateSwap", name),
                new RateMktData("4Y", 0.0259, "Fr007", "InterestRateSwap", name),
                new RateMktData("5Y", 0.0267, "Fr007", "InterestRateSwap", name),
                new RateMktData("7Y", 0.0283, "Fr007", "InterestRateSwap", name),
                new RateMktData("10Y", 0.0297, "Fr007", "InterestRateSwap", name),
                new RateMktData("15Y", 0.032, "Fr007", "InterestRateSwap", name)
            };

            var fr007Curve2 = new InstrumentCurveDefinition(
                name2,
                curveConvention2,
                rates2,
                "SpotCurve");

            curveDefinitions.Add(fr007Curve2);

            var marketInfo = new MarketInfo("TestMarket")
            {
                ReferenceDate         = referenceDate,
                YieldCurveDefinitions = curveDefinitions.ToArray(),
                HistoricalIndexRates  = HistoricalDataLoadHelper.HistoricalIndexRates
            };

            QdpMarket market;

            MarketFunctions.BuildMarket(marketInfo, out market);
            return(market);
        }
Exemplo n.º 29
0
        public void TestCdsCalibration()
        {
            var historiclIndexRates = HistoricalDataLoadHelper.HistoricalIndexRates;

            const string fr007CurveName       = "Swap_Fr007";
            var          fr007CurveConvention = new CurveConvention(
                "fr007CurveConvention",
                "CNY",
                "None",
                "Chn_ib",
                "Act365",
                "Continuous",
                "CubicHermiteMonotic");
            var rateDefinition = new[]
            {
                new RateMktData("1D", 0.026, "Spot", "None", fr007CurveName),
                new RateMktData("20Y", 0.026, "Spot", "None", fr007CurveName)
            };

            var fr007CurveDefinition = new InstrumentCurveDefinition(fr007CurveName, fr007CurveConvention, rateDefinition, "SpotCurve");
            var curveDefinition      = new[]
            {
                fr007CurveDefinition
            };

            const string spcCurveName       = "spc_testCurve";
            var          spcCurveConvention = new CurveConvention("spcCurveConvention",
                                                                  "CNY",
                                                                  "None",
                                                                  "Chn_ib",
                                                                  "Act365",
                                                                  "Continuous",
                                                                  "CubicHermiteMonotic");
            var cdsSpreads = new[]
            {
                new RateMktData("2015-06-20", 0.001535, "Spc", "CreditDefaultSwap", spcCurveName),
                new RateMktData("2015-12-20", 0.001901, "Spc", "CreditDefaultSwap", spcCurveName),
                new RateMktData("2016-12-20", 0.003131, "Spc", "CreditDefaultSwap", spcCurveName),
                new RateMktData("2017-12-20", 0.004749, "Spc", "CreditDefaultSwap", spcCurveName),
                new RateMktData("2018-12-20", 0.007395, "Spc", "CreditDefaultSwap", spcCurveName),
                new RateMktData("2019-12-20", 0.0096833, "Spc", "CreditDefaultSwap", spcCurveName),
                new RateMktData("2021-12-20", 0.01339, "Spc", "CreditDefaultSwap", spcCurveName),
                new RateMktData("2024-12-20", 0.015116, "Spc", "CreditDefaultSwap", spcCurveName)
            };

            var spcCurveDefinitions = new[]
            {
                new InstrumentCurveDefinition(spcCurveName, spcCurveConvention, cdsSpreads, "SpotCurve", fr007CurveDefinition)
            };

            var marketInfo = new MarketInfo("tmpMarket", "2014-12-16", curveDefinition, historiclIndexRates)
            {
                SpcCurveDefinitions = spcCurveDefinitions
            };
            QdpMarket market;
            var       result = MarketFunctions.BuildMarket(marketInfo, out market);

            var spcCurve  = market.GetData <CurveData>(spcCurveName).YieldCurve;
            var keyPoints = spcCurve.KeyPoints;

            Assert.AreEqual(keyPoints[0].Item2, 1.0);
            Assert.AreEqual(keyPoints[1].Item2, 0.99868359032, 1.0e-9);
            Assert.AreEqual(keyPoints[2].Item2, 0.99680057341, 1.0e-9);
            Assert.AreEqual(keyPoints[3].Item2, 0.98952113745, 1.0e-9);
            Assert.AreEqual(keyPoints[4].Item2, 0.97616083777, 1.0e-9);
            Assert.AreEqual(keyPoints[5].Item2, 0.95048151684, 1.0e-9);
            Assert.AreEqual(keyPoints[6].Item2, 0.91939248365, 1.0e-9);
            Assert.AreEqual(keyPoints[7].Item2, 0.84740619752, 1.0e-9);
            Assert.AreEqual(keyPoints[8].Item2, 0.76457411556, 1.0e-9);

            var cdsInfo = new CreditDefaultSwapInfo()
            {
                StartDate             = "2014-09-22",
                MaturityDate          = "2019-12-20",
                Notional              = 10000000,
                BusinessDayConvention = "ModifiedFollowing",
                Calendar              = "Chn_ib",
                Coupon                 = 0.01,
                Currency               = "CNY",
                DayCount               = "Act365",
                Frequency              = "Quarterly",
                SwapDirection          = "Payer",
                RecoveryRate           = 0.4,
                Stub                   = "ShortEnd",
                NumIntegrationInterval = 100,
                ValuationParameters    = new CdsValuationParameters(fr007CurveName, spcCurveName)
            };
            var cdsVf         = new CreditDefaultSwapVf(cdsInfo);
            var pricingResult = cdsVf.ValueTrade(market, PricingRequest.Pv | PricingRequest.Ai);

            Assert.AreEqual(pricingResult.Pv, -38365.7413, 1e-4);
            Assert.AreEqual(pricingResult.Ai, -23287.6712, 1e-4);
        }