private CurrencyAmount presentValueFromProductPresentValue(ResolvedCapitalIndexedBondTrade trade, RatesProvider ratesProvider, LegalEntityDiscountingProvider discountingProvider, CurrencyAmount productPresentValue) { CurrencyAmount pvProduct = productPresentValue.multipliedBy(trade.Quantity); CurrencyAmount pvPayment = presentValueSettlement(trade, ratesProvider, discountingProvider); return(pvProduct.plus(pvPayment)); }
private CurrencyAmount presentValueFromProductPresentValue(ResolvedFixedCouponBondTrade trade, LegalEntityDiscountingProvider provider, CurrencyAmount productPresentValue) { CurrencyAmount pvProduct = productPresentValue.multipliedBy(trade.Quantity); CurrencyAmount pvPayment = presentValuePayment(trade, provider); return(pvProduct.plus(pvPayment)); }
//------------------------------------------------------------------------- private CurrencyAmount presentValueSettlement(ResolvedCapitalIndexedBondTrade trade, RatesProvider ratesProvider, LegalEntityDiscountingProvider discountingProvider) { if (!trade.Settlement.Present) { // position has no settlement, thus it has no value return(CurrencyAmount.zero(trade.Product.Currency)); } BondPaymentPeriod settlePeriod = trade.Settlement.get().Payment; ResolvedCapitalIndexedBond product = trade.Product; CurrencyAmount netAmount = this.netAmount(trade, ratesProvider); RepoCurveDiscountFactors repoDf = DiscountingCapitalIndexedBondProductPricer.repoCurveDf(product, discountingProvider); return(netAmount.multipliedBy(repoDf.discountFactor(settlePeriod.PaymentDate))); }
/// <summary> /// Calculates the current cash of the NDF product. /// </summary> /// <param name="ndf"> the product </param> /// <param name="provider"> the rates provider </param> /// <returns> the current cash of the product in the settlement currency </returns> public virtual CurrencyAmount currentCash(ResolvedFxNdf ndf, RatesProvider provider) { Currency ccySettle = ndf.SettlementCurrency; if (provider.ValuationDate.isEqual(ndf.PaymentDate)) { Currency ccyOther = ndf.NonDeliverableCurrency; CurrencyAmount notionalSettle = ndf.SettlementCurrencyNotional; double agreedRate = ndf.AgreedFxRate.fxRate(ccySettle, ccyOther); double rate = provider.fxIndexRates(ndf.Index).rate(ndf.Observation, ccySettle); return(notionalSettle.multipliedBy(1d - agreedRate / rate)); } return(CurrencyAmount.zero(ccySettle)); }
//------------------------------------------------------------------------- /// <summary> /// Calculates the currency exposure by discounting each payment in its own currency. /// </summary> /// <param name="ndf"> the product </param> /// <param name="provider"> the rates provider </param> /// <returns> the currency exposure </returns> public virtual MultiCurrencyAmount currencyExposure(ResolvedFxNdf ndf, RatesProvider provider) { if (provider.ValuationDate.isAfter(ndf.PaymentDate)) { return(MultiCurrencyAmount.empty()); } Currency ccySettle = ndf.SettlementCurrency; CurrencyAmount notionalSettle = ndf.SettlementCurrencyNotional; double dfSettle = provider.discountFactor(ccySettle, ndf.PaymentDate); Currency ccyOther = ndf.NonDeliverableCurrency; double agreedRate = ndf.AgreedFxRate.fxRate(ccySettle, ccyOther); double dfOther = provider.discountFactor(ccyOther, ndf.PaymentDate); return(MultiCurrencyAmount.of(notionalSettle.multipliedBy(dfSettle)).plus(CurrencyAmount.of(ccyOther, -notionalSettle.Amount * agreedRate * dfOther))); }
//------------------------------------------------------------------------- /// <summary> /// Calculates the present value of the NDF product. /// <para> /// The present value of the product is the value on the valuation date. /// The present value is returned in the settlement currency. /// /// </para> /// </summary> /// <param name="ndf"> the product </param> /// <param name="provider"> the rates provider </param> /// <returns> the present value of the product in the settlement currency </returns> public virtual CurrencyAmount presentValue(ResolvedFxNdf ndf, RatesProvider provider) { Currency ccySettle = ndf.SettlementCurrency; if (provider.ValuationDate.isAfter(ndf.PaymentDate)) { return(CurrencyAmount.zero(ccySettle)); } Currency ccyOther = ndf.NonDeliverableCurrency; CurrencyAmount notionalSettle = ndf.SettlementCurrencyNotional; double agreedRate = ndf.AgreedFxRate.fxRate(ccySettle, ccyOther); double forwardRate = provider.fxIndexRates(ndf.Index).rate(ndf.Observation, ccySettle); double dfSettle = provider.discountFactor(ccySettle, ndf.PaymentDate); return(notionalSettle.multipliedBy(dfSettle * (1d - agreedRate / forwardRate))); }