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 }
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); }