public static double GetPremiumImpl( ILogger logger, ICoreCache cache, String nameSpace, SwapLegParametersRange payLegParametersRange, SwapLegParametersRange receiveLegParametersRange, SwaptionParametersRange swaptionTermsRange, ValuationRange valuationRange) { InterestRateStream payStream = null; InterestRateStream receiveStream = null; UpdateCashflowsWithAmounts(logger, cache, nameSpace, payStream, payLegParametersRange, valuationRange); UpdateCashflowsWithAmounts(logger, cache, nameSpace, receiveStream, receiveLegParametersRange, valuationRange); Money fv = CashflowsHelper.GetForecastValue(payStream.cashflows); Money pv = CashflowsHelper.GetPresentValue(payStream.cashflows); double tillExpiry = (swaptionTermsRange.ExpirationDate - valuationRange.ValuationDate).TotalDays / 365.0; //Debug.Print("Future value :{0}", fv.amount); //Debug.Print("Present value :{0}", pv.amount); // get swaption price // double pricePerDollar = BlackModel.GetSwaptionValue((double)payLegParametersRange.CouponOrLastResetRate, (double)swaptionTermsRange.StrikeRate, (double)swaptionTermsRange.Volatility, tillExpiry); double premium = System.Math.Abs((double)payLegParametersRange.NotionalAmount * pricePerDollar); return(premium); }
public static Swaption GenerateSwaptionDefiniton(SwapLegParametersRange_Old leg1Parameters, IBusinessCalendar leg1PaymentCalendar, SwapLegParametersRange_Old leg2Parameters, IBusinessCalendar leg2PaymentCalendar, SwaptionParametersRange swaptionParameters) { Swap swap = SwapGenerator.GenerateDefiniton(leg1Parameters, leg2Parameters); NonNegativeMoney premium = MoneyHelper.GetNonNegativeAmount(swaptionParameters.Premium, swaptionParameters.PremiumCurrency); AdjustableDate expirationDate = DateTypesHelper.ToAdjustableDate(swaptionParameters.ExpirationDate, swaptionParameters.ExpirationDateBusinessDayAdjustments, swaptionParameters.ExpirationDateCalendar); AdjustableOrAdjustedDate paymentDate = DateTypesHelper.ToAdjustableOrAdjustedDate(swaptionParameters.PaymentDate, swaptionParameters.PaymentDateBusinessDayAdjustments, swaptionParameters.PaymentDateCalendar); TimeSpan earliestExerciseTimeAsTimeSpan = TimeSpan.FromDays(swaptionParameters.EarliestExerciseTime); DateTime earliestExerciseTime = DateTime.MinValue.Add(earliestExerciseTimeAsTimeSpan); TimeSpan expirationTimeAsTimeSpan = TimeSpan.FromDays(swaptionParameters.ExpirationTime); DateTime expirationTime = DateTime.MinValue.Add(expirationTimeAsTimeSpan); return(SwaptionFactory.Create(swap, premium, swaptionParameters.PremiumPayer, swaptionParameters.PremiumReceiver, paymentDate, expirationDate, earliestExerciseTime, expirationTime, swaptionParameters.AutomaticExcercise)); }
public static Trade CreateSwaptionTrade(SwaptionParametersRange swaptionParametersRange, IBusinessCalendar paymentCalendar, Swap underlyingSwap) { var premium = MoneyHelper.GetNonNegativeAmount(swaptionParametersRange.Premium, swaptionParametersRange.PremiumCurrency); AdjustableDate expirationDate = DateTypesHelper.ToAdjustableDate(swaptionParametersRange.ExpirationDate, swaptionParametersRange.ExpirationDateBusinessDayAdjustments, swaptionParametersRange.ExpirationDateCalendar); AdjustableOrAdjustedDate paymentDate = DateTypesHelper.ToAdjustableOrAdjustedDate(swaptionParametersRange.PaymentDate, swaptionParametersRange.PaymentDateBusinessDayAdjustments, swaptionParametersRange.PaymentDateCalendar); TimeSpan earliestExerciseTimeAsTimeSpan = TimeSpan.FromDays(swaptionParametersRange.EarliestExerciseTime); DateTime earliestExerciseTime = DateTime.MinValue.Add(earliestExerciseTimeAsTimeSpan); TimeSpan expirationTimeAsTimeSpan = TimeSpan.FromDays(swaptionParametersRange.ExpirationTime); DateTime expirationTime = DateTime.MinValue.Add(expirationTimeAsTimeSpan); var swaption = SwaptionFactory.Create(underlyingSwap, premium, swaptionParametersRange.PremiumPayer, swaptionParametersRange.PremiumReceiver, paymentDate, expirationDate, earliestExerciseTime, expirationTime, swaptionParametersRange.AutomaticExcercise); swaption.Items = new object[] { new ProductType { Value = ProductTypeSimpleEnum.InterestRateSwaption.ToString() } }; swaption.ItemsElementName = new[] { ItemsChoiceType2.productType }; var trade = new Trade(); XsdClassesFieldResolver.TradeSetSwaption(trade, swaption); return(trade); }
public string CreateValuation( ILogger logger, ICoreCache cache, String nameSpace, IBusinessCalendar fixingCalendar, IBusinessCalendar paymentCalendar, SwaptionParametersRange swaptionParametersRange, List <StringObjectRangeItem> valuationSet, ValuationRange valuationRange, TradeRange tradeRange, SwapLegParametersRange leg1ParametersRange, SwapLegParametersRange leg2ParametersRange, List <InputCashflowRangeItem> leg1DetailedCashflowsListArray, List <InputCashflowRangeItem> leg2DetailedCashflowsListArray, List <InputPrincipalExchangeCashflowRangeItem> leg1PrincipalExchangeCashflowListArray, List <InputPrincipalExchangeCashflowRangeItem> leg2PrincipalExchangeCashflowListArray, List <AdditionalPaymentRangeItem> leg1AdditionalPaymentListArray, List <AdditionalPaymentRangeItem> leg2AdditionalPaymentListArray, List <PartyIdRangeItem> partyIdList, //optional List <OtherPartyPaymentRangeItem> otherPartyPaymentList, //opt List <FeePaymentRangeItem> feePaymentList //opt ) { var swap = GetPriceAndGeneratedFpMLSwap(logger, cache, nameSpace, fixingCalendar, paymentCalendar, valuationRange, tradeRange, leg1ParametersRange, leg2ParametersRange, leg1DetailedCashflowsListArray, leg2DetailedCashflowsListArray, leg1PrincipalExchangeCashflowListArray, leg2PrincipalExchangeCashflowListArray, leg1AdditionalPaymentListArray, leg2AdditionalPaymentListArray).Second; string baseParty = valuationRange.BaseParty; List <IRateCurve> uniqueCurves = GetUniqueCurves(logger, cache, nameSpace, leg1ParametersRange, leg2ParametersRange); Market fpMLMarket = InterestRateProduct.CreateFpMLMarketFromCurves(uniqueCurves); // TODO: add Trade Id & Trade data into valuation. (Trade.Id & Trade.TradeHeader.TradeDate) // // create ValuationReport and add it to in-memory collection. // Add methods! AssetValuation assetValuation = InterestRateProduct.CreateAssetValuationFromValuationSet(valuationSet); NonNegativeMoney premium = MoneyHelper.GetNonNegativeAmount(swaptionParametersRange.Premium, swaptionParametersRange.PremiumCurrency); AdjustableDate expirationDate = DateTypesHelper.ToAdjustableDate(swaptionParametersRange.ExpirationDate, swaptionParametersRange.ExpirationDateBusinessDayAdjustments, swaptionParametersRange.ExpirationDateCalendar); AdjustableOrAdjustedDate paymentDate = DateTypesHelper.ToAdjustableOrAdjustedDate(swaptionParametersRange.PaymentDate, swaptionParametersRange.PaymentDateBusinessDayAdjustments, swaptionParametersRange.PaymentDateCalendar); TimeSpan earliestExerciseTimeAsTimeSpan = TimeSpan.FromDays(swaptionParametersRange.EarliestExerciseTime); DateTime earliestExerciseTime = DateTime.MinValue.Add(earliestExerciseTimeAsTimeSpan); TimeSpan expirationTimeAsTimeSpan = TimeSpan.FromDays(swaptionParametersRange.ExpirationTime); DateTime expirationTime = DateTime.MinValue.Add(expirationTimeAsTimeSpan); var swaption = SwaptionFactory.Create(swap, premium, swaptionParametersRange.PremiumPayer, swaptionParametersRange.PremiumReceiver, paymentDate, expirationDate, earliestExerciseTime, expirationTime, swaptionParametersRange.AutomaticExcercise); // overrides the premium created by SwaptionFactort.Create // var feeList = new List <Payment>(); if (null != feePaymentList) { feeList.AddRange(feePaymentList.Select(feePaymentRangeItem => new Payment { paymentDate = DateTypesHelper.ToAdjustableOrAdjustedDate(feePaymentRangeItem.PaymentDate), paymentAmount = MoneyHelper.GetNonNegativeAmount(feePaymentRangeItem.Amount), payerPartyReference = PartyReferenceFactory.Create(feePaymentRangeItem.Payer), receiverPartyReference = PartyReferenceFactory.Create(feePaymentRangeItem.Receiver) })); } swaption.premium = feeList.ToArray(); string valuationReportAndProductId = tradeRange.Id ?? Guid.NewGuid().ToString(); swaption.id = valuationReportAndProductId; ValuationReport valuationReport = ValuationReportGenerator.Generate(valuationReportAndProductId, baseParty, valuationReportAndProductId, tradeRange.TradeDate, swaption, fpMLMarket, assetValuation); cache.SaveObject(valuationReport, valuationReportAndProductId, null); InterestRateProduct.ReplacePartiesInValuationReport(valuationReport, partyIdList); InterestRateProduct.AddOtherPartyPayments(valuationReport, otherPartyPaymentList); return(valuationReportAndProductId); }
public void CreateSwaptionValuation() { DateTime valuationDate = DateTime.Today; SwaptionPricer irSwaptionPricer = new InterestRateSwaptionPricer(); string discountCurveID = BuildAndCacheRateCurve(valuationDate); //RateCurveExcelInterfaceTests.ExcelInterface_CreateAUDCurveFromDepostSwapsFuturesFras_WithDates(valuationDate, valuationDate); string projectionCurveID = discountCurveID; SwapLegParametersRange_Old payFixed = CreateFixedAUD_6MSwapLegParametersRange(_NAB, CounterParty, valuationDate, 0.065m, "ACT/365.FIXED", "AUSY", "FOLLOWING", "AUSY", "NONE", discountCurveID); SwapLegParametersRange_Old receiveFloat = CreateFloatingAUD_6MSwapLegParametersRange(CounterParty, _NAB, valuationDate, 0, "ACT/365.FIXED", "AUSY", "FOLLOWING", "AUSY", "NONE", discountCurveID, projectionCurveID); ValuationRange valuationRange = CreateValuationRangeForNAB(valuationDate); var payCFRangeItemList = InterestRateSwapPricer.GetDetailedCashflowsTestOnly(Engine.Logger, Engine.Cache, Engine.NameSpace, payFixed, valuationRange); payCFRangeItemList[0].CouponType = "fixed"; // that should test case insensitive nature of coupons payCFRangeItemList[1].CouponType = "Fixed"; // var receiveCFRangeItemList = InterestRateSwapPricer.GetDetailedCashflowsTestOnly(Engine.Logger, Engine.Cache, Engine.NameSpace, receiveFloat, valuationRange); receiveCFRangeItemList[0].CouponType = "float"; // that should test case insensitive nature of coupons receiveCFRangeItemList[1].CouponType = "Float"; // var tradeRange = new TradeRange { Id = "TradeId_12345", TradeDate = valuationDate }; var leg1PrincipalExchangeCashflowList = new List <InputPrincipalExchangeCashflowRangeItem>(); var leg2PrincipalExchangeCashflowList = new List <InputPrincipalExchangeCashflowRangeItem>(); var leg1BulletPaymentList = new List <AdditionalPaymentRangeItem>(); var leg2BulletPaymentList = new List <AdditionalPaymentRangeItem>(); var swaptionParametersRange = new SwaptionParametersRange { Premium = 456789.12m, PremiumCurrency = "AUD", PremiumPayer = CounterParty, PremiumReceiver = _NAB, ExpirationDate = valuationDate.AddDays(10), ExpirationDateCalendar = "AUSY-GBLO", ExpirationDateBusinessDayAdjustments = "FOLLOWING", PaymentDate = valuationDate.AddDays(20), PaymentDateCalendar = "USNY-GBLO", PaymentDateBusinessDayAdjustments = "MODFOLLOWING", EarliestExerciseTime = new TimeSpan(10, 0, 0).TotalDays, ExpirationTime = new TimeSpan(11, 0, 0).TotalDays, AutomaticExcercise = false }; List <PartyIdRangeItem> partyList = GetPartyList("NAB", "book", "MCHammer", "counterparty"); List <OtherPartyPaymentRangeItem> otherPartyPaymentRangeItems = GetOtherPartyPaymentList("counterparty", "cost center"); List <FeePaymentRangeItem> feePaymentRangeItems = GetFeeList("counterparty", "book"); // Get price and swap representation using non-vanilla PRICE function. // string valuatonId = irSwaptionPricer.CreateValuation(Engine.Logger, Engine.Cache, Engine.NameSpace, null, null, swaptionParametersRange, CreateValuationSetList2(12345.67, -0.321), valuationRange, tradeRange, payFixed, receiveFloat, payCFRangeItemList, receiveCFRangeItemList, leg1PrincipalExchangeCashflowList, leg2PrincipalExchangeCashflowList, leg1BulletPaymentList, leg2BulletPaymentList, partyList, otherPartyPaymentRangeItems, feePaymentRangeItems); var valuationReport = Engine.Cache.LoadObject <ValuationReport>(Engine.NameSpace + "." + valuatonId); Debug.Print(XmlSerializerHelper.SerializeToString(valuationReport)); }