public void CreateAmortisedFloorTest()
        {
            #region Initialise

            QRLib.PricingStructures.ClearCache();
            string             rateCurveId       = BuildMarket(_baseDate);
            IMarketEnvironment marketEnvironment = ObjectCacheHelper.GetMarket(_marketEnvironmentId);

            #endregion

            #region Define the Swap

            const string id = "TestAmortisedFloor";

            object[,] capFloorTerms
                =
                {
                { "DealReferenceIdentifier", id                    },
                { "BasePartyBuySellsInd",    "Sells"               },
                { "CounterpartyName",        "ANZ"                 },
                { "DealType",                "Floor"               },
                { "EffectiveDate",           _baseDate             },
                { "TerminationDate",         _baseDate.AddYears(2) },
                { "AdjustCalculationDates",  true                  },
                };

            object[,] streamTerms
                =
                {
                { "NotionalAmount",                 "1000000"              },
                { "Currency",                       "AUD"                  },
                { "ScheduleGeneration",             "Forward"              },
                { "BusinessCenters",                "Sydney"               },
                { "CouponPeriod",                   "6m"                   },
                { "RollDay",                        "1"                    },
                { "CouponDateAdjustment",           "FOLLOWING"            },
                { "DayCountConvention",             "ACT/365.FIXED"        },
                { "DiscountingType",                "Standard"             },
                { "DiscountCurveReference",         rateCurveId            },
                { "FixedOrObservedRate",            "0.07"                 },
                { "ObservedRateSpecified",          "FALSE"                },
                { "ForwardCurveReference",          rateCurveId            },
                { "FixingDateBusinessCenters",      "Sydney"               },
                { "FixingDateResetInterval",        "0D"                   },
                { "FixingDateAdjustmentConvention", "NONE"                 },
                { "RateIndexName",                  "AUD-LIBOR-BBA"        },
                { "RateIndexTenor",                 "6m"                   },
                { "Spread",                         "0"                    },
                { "VolatilityCurveReference",       _volatilityStructureId },
                { "StrikePrice",                    "0.07"                 },
                };

            #endregion

            #region Define the Valuation Criteria

            string[] requiredMetrics = { "NPV", "BreakEvenRate" };

            #endregion

            #region Create & Value the Swap

            string returnedId = QRLib.Rates.InterestRateCapFloor.CreateAmortised(capFloorTerms, streamTerms, null);
            Assert.AreEqual(id, returnedId);
            InterestRateCapFloor capFloor = ProductHelper.Get <InterestRateCapFloor>(id);
            Assert.IsNotNull(capFloor);

            CreditSettings creditSettings          = new CreditSettings(ServerStore.Client);
            IDictionary <string, object> valuation = capFloor.BasicValuation(_baseDate, marketEnvironment, requiredMetrics, creditSettings);

            #endregion

            #region Validate the Results

            Assert.AreEqual(CapBreakEvenRate, Convert.ToDouble(valuation["BreakEvenRate"]), 0.0000001);
            Assert.AreEqual(_pv, Convert.ToDouble(valuation["NPV"]), 3);

            #endregion

            #region Reset

            QRLib.PricingStructures.ClearCache();

            #endregion
        }
        public void CreateStructuredFloorTest()
        {
            #region Initialise

            QRLib.PricingStructures.ClearCache();
            string             rateCurveId       = BuildMarket(_baseDate);
            IMarketEnvironment marketEnvironment = ObjectCacheHelper.GetMarket(_marketEnvironmentId);

            #endregion

            #region Define the Swap

            const string id = "TestStructuredFloor";

            object[,] capFloorTerms
                =
                {
                { "DealReferenceIdentifier", id      },
                { "BasePartyBuySellsInd",    "Sells" },
                { "CounterpartyName",        "ANZ"   },
                { "DealType",                "Floor" },
                };

            object[,] streamTerms
                =
                {
                { "NotionalAmount",           "1000000"              },
                { "Currency",                 "AUD"                  },
                { "DayCountConvention",       "ACT/365.FIXED"        },
                { "DiscountingType",          "Standard"             },
                { "DiscountCurveReference",   rateCurveId            },
                { "ForwardCurveReference",    rateCurveId            },
                { "VolatilityCurveReference", _volatilityStructureId },
                { "RateIndexName",            "AUD-LIBOR-BBA"        },
                { "RateIndexTenor",           "6m"                   },
                { "StrikePrice",              "0.07"                 },
                };

            const double notionalAmount = -1000000;
            object[,] couponMatrix
                =
                {
                { "StartDate",       "EndDate", "NotionalAmount", "StrikePrice" },
                { new DateTime(2009,        09,              04), new DateTime(2010, 03, 01), notionalAmount, "0.07"},
                { new DateTime(2010,        03,              01), new DateTime(2010, 09, 01), notionalAmount, "0.07"},
                { new DateTime(2010,        09,              01), new DateTime(2011, 03, 01), notionalAmount, "0.07"},
                { new DateTime(2011,        03,              01), new DateTime(2011, 09, 05), notionalAmount, "0.07"},
                };

            #endregion

            #region Define the Valuation Criteria

            string[] requiredMetrics = { "NPV", "BreakEvenRate" };

            #endregion

            #region Create & Value the Swap

            string returnedId = QRLib.Rates.InterestRateCapFloor.CreateStructured(capFloorTerms, streamTerms, couponMatrix);
            Assert.AreEqual(id, returnedId);
            InterestRateCapFloor capFloor = ProductHelper.Get <InterestRateCapFloor>(id);
            Assert.IsNotNull(capFloor);

            CreditSettings creditSettings          = new CreditSettings(ServerStore.Client);
            IDictionary <string, object> valuation = capFloor.BasicValuation(_baseDate, marketEnvironment, requiredMetrics, creditSettings);

            #endregion

            #region Validate the Results

            Assert.AreEqual(CapBreakEvenRate, Convert.ToDouble(valuation["BreakEvenRate"]), 0.0000001);
            Assert.AreEqual(_pv, Convert.ToDouble(valuation["NPV"]), 3);

            #endregion

            #region Reset

            QRLib.PricingStructures.ClearCache();

            #endregion
        }
Ejemplo n.º 3
0
        private AssetFxMCModel GetSut(bool expensiveFutures, BaseMetric baseMetric = BaseMetric.PV)
        {
            var buildDate = DateTime.Parse("2018-10-04");
            var usd       = TestProviderHelper.CurrencyProvider["USD"];

            TestProviderHelper.CalendarProvider.Collection.TryGetCalendar("NYC", out var usdCal);
            var dfCurve = new IrCurve(new[] { buildDate, buildDate.AddDays(1000) }, new[] { 0.0, 0.0 }, buildDate, "disco", Math.Interpolation.Interpolator1DType.Linear, usd, "DISCO");

            var comCurve = new PriceCurve(buildDate, new[] { buildDate, buildDate.AddDays(15), buildDate.AddDays(100) }, new[] { 100.0, 100.0, 100.0 }, PriceCurveType.NYMEX, TestProviderHelper.CurrencyProvider)
            {
                Name    = "CL",
                AssetId = "CL"
            };
            var comSurface = new ConstantVolSurface(buildDate, 0.32)
            {
                AssetId = "CL"
            };
            var fModel = new FundingModel(buildDate, new Dictionary <string, IrCurve> {
                { "DISCO", dfCurve }
            }, TestProviderHelper.CurrencyProvider, TestProviderHelper.CalendarProvider);
            var fxM = new FxMatrix(TestProviderHelper.CurrencyProvider);

            fxM.Init(usd, buildDate, new Dictionary <Currency, double>(), new List <FxPair>(), new Dictionary <Currency, string> {
                { usd, "DISCO" }
            });
            fModel.SetupFx(fxM);

            var aModel = new AssetFxModel(buildDate, fModel);

            aModel.AddVolSurface("CL", comSurface);
            aModel.AddPriceCurve("CL", comCurve);

            var product = AssetProductFactory.CreateTermAsianSwap(buildDate.AddDays(10), buildDate.AddDays(20), 99, "CL", usdCal, buildDate.AddDays(21), usd);

            product.TradeId       = "waaah";
            product.DiscountCurve = "DISCO";


            var pfolio = new Portfolio {
                Instruments = new List <IInstrument> {
                    product
                }
            };
            var creditSettings = new CreditSettings
            {
                ExposureDates = new DateTime[] { buildDate.AddDays(5), buildDate.AddDays(20), buildDate.AddDays(22) },
                Metric        = baseMetric
            };
            var settings = new McSettings
            {
                Generator                  = RandomGeneratorType.MersenneTwister,
                McModelType                = McModelType.Black,
                NumberOfPaths              = 2048,
                NumberOfTimesteps          = 1,
                ReportingCurrency          = usd,
                ExpensiveFuturesSimulation = expensiveFutures,
                Parallelize                = false,
                FuturesMappingTable        = new Dictionary <string, string> {
                    { "CL", "CL" }
                },
                CreditSettings = creditSettings
            };
            var sut = new AssetFxMCModel(buildDate, pfolio, aModel, settings, TestProviderHelper.CurrencyProvider, TestProviderHelper.FutureSettingsProvider, TestProviderHelper.CalendarProvider);

            return(sut);
        }