예제 #1
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);
        }
예제 #2
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);
        }
예제 #3
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));
        }
예제 #4
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);
        }
예제 #5
0
        //internal use + keyPoint manipulation, i.e. solving zspread
        //Note: this api will bypass curve calibration
        public YieldCurve(
            string name,
            Date referenceDate,
            Tuple <Date, double>[] keyPoints,
            BusinessDayConvention bda,
            IDayCount dayCount,
            ICalendar calendar,
            CurrencyCode currency,
            Compound compound,
            Interpolation interpolation,
            YieldCurveTrait trait,
            IMarketCondition baseMarket = null,
            Expression <Func <IMarketCondition, object> >[] calibrateMktUpdateCondition = null,
            ISpread spread     = null,
            string[] keyTenors = null,
            InstrumentCurveDefinition rawDefinition = null
            )
        {
            Name          = name;
            ReferenceDate = referenceDate;
            Currency      = currency;
            Bda           = bda;
            DayCount      = dayCount;
            Compound      = compound;
            Calendar      = calendar;
            Interpolation = interpolation;
            Trait         = trait;
            BaseMarket    = baseMarket;
            Spread        = spread ?? new ZeroSpread(0.0);
            CalibrateMktUpdateCondition = calibrateMktUpdateCondition;
            MarketInstruments           = null;
            KeyPoints     = keyPoints.OrderBy(x => x.Item1).ToArray();
            KeyTenors     = keyTenors ?? KeyPoints.Select(x => new Term(x.Item1 - ReferenceDate, Period.Day)).Select(x => x.ToString()).ToArray();
            RawDefinition = rawDefinition;

            InputRateByTenor = KeyPoints.Select(x => Tuple.Create <string, double> (new Term(x.Item1 - ReferenceDate, Period.Day).ToString(), x.Item2)).
                               ToDictionary(v => v.Item1, v => v.Item2);

            //_curve = new Curve<Date>(ReferenceDate, KeyPoints, x => x.ToOADate(), interpolation);
            _curveXInYears = new Curve <double>(0.0,
                                                KeyPoints.Select(x => Tuple.Create(DayCount.CalcDayCountFraction(ReferenceDate, x.Item1), x.Item2)).ToArray(),
                                                x => x,
                                                Interpolation);
        }
예제 #6
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> >()
                       ));
        }
예제 #7
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);
        }
예제 #8
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);
        }
예제 #9
0
        public static FxSpot CreateFxSpot(Date curveDate, RateMktData rateMktData, InstrumentCurveDefinition definition)
        {
            //var definition = (Definition as InstrumentCurveDefinition);

            var fgnCcy = definition.BaseCurveDefinition.CurveConvention.Currency.ToCurrencyCode();
            var domCcy = definition.CurveConvention.Currency.ToCurrencyCode();

            if (domCcy == fgnCcy)
            {
                return(null);
            }

            var fgnCalendar = CalendarImpl.Get(definition.BaseCurveDefinition.CurveConvention.Calendar);
            var domCalendar = CalendarImpl.Get(definition.CurveConvention.Calendar);
            var spotDate    = MarketExtensions.GetFxSpotDate(
                curveDate,
                new DayGap(rateMktData.Tenor),
                fgnCcy,
                domCcy,
                fgnCalendar,
                domCalendar
                );

            return(new FxSpot(
                       curveDate,
                       spotDate,
                       rateMktData.Rate,
                       domCalendar,
                       domCcy,
                       1.0,
                       fgnCalendar,
                       fgnCcy,
                       rateMktData.Rate,
                       domCcy
                       ));
        }
예제 #10
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> >()
                                       ));
        }
예제 #11
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);
        }
예제 #12
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> >()
                                       ));
        }
예제 #13
0
        //swap curve building for both pricing and pnl,   bond curve building only,  not for pnl
        public YieldCurve(
            string name,
            Date referenceDate,
            MarketInstrument[] marketInstruments,
            BusinessDayConvention bda,
            IDayCount dayCount,
            ICalendar calendar,
            CurrencyCode currency,
            Compound compound,
            Interpolation interpolation,
            YieldCurveTrait trait,
            IMarketCondition baseMarket = null,
            Expression <Func <IMarketCondition, object> >[] calibrateMktUpdateCondition = null,
            ISpread spread     = null,
            Date[] knotPoints  = null,
            string[] keyTenors = null,
            InstrumentCurveDefinition rawDefinition = null
            )
        {
            Name          = name;
            ReferenceDate = referenceDate;
            Currency      = currency;
            Bda           = bda;
            DayCount      = dayCount;
            Compound      = compound;
            Calendar      = calendar;
            Interpolation = interpolation;
            Trait         = trait;
            RawDefinition = rawDefinition;
            var tempMarketInstruments     = marketInstruments.OrderBy(x => x.Instrument.UnderlyingMaturityDate).ToArray();
            var uniqueTenorMktInstruments = new List <MarketInstrument> {
                tempMarketInstruments[0]
            };

            for (var i = 1; i < tempMarketInstruments.Length; ++i)
            {
                if (tempMarketInstruments[i].Instrument.GetCalibrationDate() != tempMarketInstruments[i - 1].Instrument.GetCalibrationDate())
                {
                    uniqueTenorMktInstruments.Add(tempMarketInstruments[i]);
                }
            }
            MarketInstruments = uniqueTenorMktInstruments.ToArray();
            InputRateByTenor  = MarketInstruments.ToDictionary(p => p.Instrument.Tenor, p => p.TargetValue);

            BaseMarket = baseMarket;
            Spread     = spread ?? new ZeroSpread(0.0);
            CalibrateMktUpdateCondition = calibrateMktUpdateCondition;

            if (MarketInstruments.Any(x => x.Instrument is Bond))
            {
                var err = double.NaN;
                KeyPoints    = BondCurveCalibrator.Calibrate(Name, ReferenceDate, MarketInstruments.ToArray(), Bda, DayCount, Calendar, Compound, Interpolation, Trait, Currency, knotPoints, out err, baseMarket, CalibrateMktUpdateCondition);
                fittingError = err;
            }
            else
            {
                KeyPoints = YieldCurveCalibrator.Calibrate(name, ReferenceDate, MarketInstruments.ToArray(), Bda, DayCount, Calendar, Compound, Interpolation, Trait, Currency, baseMarket, CalibrateMktUpdateCondition);
            }


            //if (KeyPoints.Select(x => x.Item1).Any(z => z is Date))
            //{
            //	_curve = new Curve<Date>(ReferenceDate, KeyPoints, x => x.ToOADate(), interpolation);
            //}
            _curveXInYears = new Curve <double>(0.0,
                                                KeyPoints.Select(x => Tuple.Create(DayCount.CalcDayCountFraction(ReferenceDate, x.Item1), x.Item2)).ToArray(),
                                                x => x,
                                                Interpolation);
        }
예제 #14
0
        /// <summary>
        /// for Option version only
        /// </summary>
        /// <param name="prebuiltMarket"></param>
        /// <param name="curveDate"></param>
        /// <param name="curveDefinition"></param>
        /// <returns></returns>
        public static YieldCurve BuildYieldCurve(PrebuiltQdpMarket prebuiltMarket, Date curveDate, InstrumentCurveDefinition curveDefinition)
        {
            IMarketCondition baseMarket;

            baseMarket = new MarketCondition(x => x.ValuationDate.Value = prebuiltMarket.ReferenceDate,
                                             x => x.HistoricalIndexRates.Value = prebuiltMarket.HistoricalIndexRates);

            YieldCurve instrumentCurve = null;

            if (curveDefinition.RateDefinitions.All(
                    x => x.InstrumentType.ToInstrumentType() == InstrumentType.Dummy || x.InstrumentType.ToInstrumentType() == InstrumentType.None))
            {
                if (curveDefinition.RateDefinitions.All(x => x.IsTerm()))
                {
                    instrumentCurve = new YieldCurve(
                        curveDefinition.Name,
                        curveDate,
                        curveDefinition.RateDefinitions.Select(x => Tuple.Create((ITerm) new Term(x.Tenor), x.Rate)).ToArray(),
                        curveDefinition.CurveConvention.BusinessDayConvention.ToBda(),
                        curveDefinition.CurveConvention.DayCount.ToDayCountImpl(),
                        curveDefinition.CurveConvention.Calendar.ToCalendarImpl(),
                        curveDefinition.CurveConvention.Currency.ToCurrencyCode(),
                        curveDefinition.CurveConvention.Compound.ToCompound(),
                        curveDefinition.CurveConvention.Interpolation.ToInterpolation(),
                        curveDefinition.Trait.ToYieldCurveTrait(),
                        null,
                        null,
                        null,
                        null,
                        curveDefinition
                        );
                }
                else
                {
                    instrumentCurve = new YieldCurve(
                        curveDefinition.Name,
                        curveDate,
                        curveDefinition.RateDefinitions.Select(x => Tuple.Create(new Date(DateTime.Parse(x.Tenor)), x.Rate)).ToArray(),
                        curveDefinition.CurveConvention.BusinessDayConvention.ToBda(),
                        curveDefinition.CurveConvention.DayCount.ToDayCountImpl(),
                        curveDefinition.CurveConvention.Calendar.ToCalendarImpl(),
                        curveDefinition.CurveConvention.Currency.ToCurrencyCode(),
                        curveDefinition.CurveConvention.Compound.ToCompound(),
                        curveDefinition.CurveConvention.Interpolation.ToInterpolation(),
                        curveDefinition.Trait.ToYieldCurveTrait(),
                        null,
                        null,
                        null,
                        null,
                        curveDefinition
                        );
                }
            }
            else
            {
                var mktInstruments = new List <MarketInstrument>();
                foreach (var rateDefinition in curveDefinition.RateDefinitions)
                {
                    MktInstrumentCalibMethod calibrationMethod;
                    if (rateDefinition.InstrumentType.ToInstrumentType() == InstrumentType.InterestRateSwap)
                    {
                        var swap = CurveBuildHelper.CreateIrsInstrument(curveDate, rateDefinition, out calibrationMethod);
                        mktInstruments.Add(new MarketInstrument(swap, rateDefinition.Rate, calibrationMethod));
                    }
                    else if (rateDefinition.InstrumentType.ToInstrumentType() == InstrumentType.Deposit ||
                             rateDefinition.InstrumentType.ToInstrumentType() == InstrumentType.Repo ||
                             rateDefinition.InstrumentType.ToInstrumentType() == InstrumentType.Ibor)
                    {
                        var deposit = CurveBuildHelper.CreateDepositInstrument(curveDate, rateDefinition, out calibrationMethod);
                        mktInstruments.Add(new MarketInstrument(deposit, rateDefinition.Rate, calibrationMethod));
                    }
                    else if (rateDefinition.InstrumentType.ToInstrumentType() == InstrumentType.Dummy ||
                             rateDefinition.InstrumentType.ToInstrumentType() == InstrumentType.None)
                    {
                        var dummy = CurveBuildHelper.CreateDummyInstrument(curveDate, rateDefinition);
                        mktInstruments.Add(new MarketInstrument(dummy, rateDefinition.Rate, MktInstrumentCalibMethod.Default));
                    }
                    else if (rateDefinition.InstrumentType.ToInstrumentType() == InstrumentType.CreditDefaultSwap)
                    {
                        var cds = CurveBuildHelper.CreateCreditDefaultSwap(curveDate, rateDefinition);
                        mktInstruments.Add(new MarketInstrument(cds, rateDefinition.Rate, MktInstrumentCalibMethod.Default));
                    }
                    else if (rateDefinition.InstrumentType.ToInstrumentType() == InstrumentType.CommodityForward)
                    {
                        mktInstruments.Add(new MarketInstrument(CurveBuildHelper.CreateCommodityForward(curveDate, rateDefinition), rateDefinition.Rate, MktInstrumentCalibMethod.Default));
                    }
                    else if (rateDefinition.InstrumentType.ToInstrumentType() == InstrumentType.CommoditySpot)
                    {
                        //baseMarket = baseMarket.UpdateCondition(new UpdateMktConditionPack<double>(x => x.SpotPrice, rateDefinition.Rate));
                    }
                    else if (rateDefinition.InstrumentType.ToInstrumentType() == InstrumentType.FxSpot)
                    {
                    }
                    else
                    {
                        throw new PricingLibraryException("Unrecognized product type in calibrating curve.");
                    }
                }

                var isSpcCurve        = curveDefinition.RateDefinitions.All(x => x.IndexType != null && x.IndexType.ToIndexType() == IndexType.Spc);
                var isConvenicenYield = curveDefinition.RateDefinitions.All(x => x.IndexType != null && x.IndexType.ToIndexType() == IndexType.ConvenienceYield);


                //Expression<Func<IMarketCondition, object>>[] expression = null;
                //if (isSpcCurve) expression = new Expression<Func<IMarketCondition, object>>[] { x => x.SurvivalProbabilityCurve };
                //if (isConvenicenYield) expression = new Expression<Func<IMarketCondition, object>>[] { x => x.DividendCurve };

                instrumentCurve = new YieldCurve(
                    curveDefinition.Name,
                    curveDate,
                    mktInstruments.ToArray(),
                    curveDefinition.CurveConvention.BusinessDayConvention.ToBda(),
                    curveDefinition.CurveConvention.DayCount.ToDayCountImpl(),
                    curveDefinition.CurveConvention.Calendar.ToCalendarImpl(),
                    curveDefinition.CurveConvention.Currency.ToCurrencyCode(),
                    curveDefinition.CurveConvention.Compound.ToCompound(),
                    curveDefinition.CurveConvention.Interpolation.ToInterpolation(),
                    curveDefinition.Trait.ToYieldCurveTrait(),
                    baseMarket,
                    null,
                    null,
                    null,
                    null,
                    curveDefinition);
            }
            return(instrumentCurve);
        }
예제 #15
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> >()
                                       ));
        }
예제 #16
0
파일: CdsTest.cs 프로젝트: stepinto163/Qdp
        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);
        }
예제 #17
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);
        }