/// <summary> /// Collect cashflows realised along the scenario path up to endDate. /// </summary> public override void CollectCashflows(CashAccumulators cashAccumulators, double baseDate, double endDate) { var deal = (CFEquityFloatingInterestListDeal)Deal; var equityParams = new EquityCashflowParams((IEquityPrice)fEquity, (EquityPriceVol)fEquityVol, fEquityFXRate, fEquityPayoffFXRate, deal.GetEquityPayoffType(), fEquityQuantoCompo, null, null); deal.Cashflows.CollectCashflows(cashAccumulators, fFxRate, equityParams, baseDate, endDate, fBuySellSign, fForecastRate, fCutoffDate); }
/// <summary> /// Calculate valuation profiles. /// </summary> public override void Value(ValuationResults valuationResults, PriceFactorList factors, BaseTimeGrid baseTimes) { base.Value(valuationResults, factors, baseTimes); var accruedResults = valuationResults.Results <AccruedInterest>(); if (accruedResults == null) { return; } using (var cache = Vector.Cache(factors.NumScenarios)) { Vector accruedInterest = cache.Get(); var deal = (CFEquityFloatingInterestListDeal)Deal; var tgi = new TimeGridIterator(fT); var equityParams = new EquityCashflowParams((EquityPrice)fEquity, (EquityPriceVol)fEquityVol, fEquityFXRate, fEquityPayoffFXRate, deal.GetEquityPayoffType(), fEquityQuantoCompo, null, null); while (tgi.Next()) { deal.Cashflows.CalculateAccrual(accruedInterest, equityParams, factors.BaseDate, tgi.Date, accruedResults.AccrueFromToday, deal.GetHolidayCalendar(), deal.Accrual_Day_Count, fForecastRate, fFxRate); accruedResults.SetValue(tgi.Date, fBuySellSign * accruedInterest); } } }
/// <summary> /// Value the deal. /// </summary> /// <param name="pv">Present value to be updated.</param> /// <param name="cash">Realised cash to be updated.</param> public override void Value(Vector pv, Vector cash, double baseDate, double valueDate, ISACCRResult saccrResult, IIntraValuationDiagnosticsWriter intraValuationDiagnosticsWriter) { var deal = (CFEquityFloatingInterestListDeal)Deal; pv.Clear(); if (cash != null) { cash.Clear(); } var equityParams = new EquityCashflowParams((IEquityPrice)fEquity, (EquityPriceVol)fEquityVol, fEquityFXRate, fEquityPayoffFXRate, deal.GetEquityPayoffType(), fEquityQuantoCompo, null, null); if (!fForecastIsForeign && fCharacteristics.fIsStandardLibor) { // standard swap leg deal.Cashflows.ValueSwap(pv, cash, baseDate, valueDate, fDiscountRate, fForecastRate, equityParams, fFxRate, intraValuationDiagnosticsWriter, fCutoffDate); } else { using (var cache = Vector.CacheLike(pv)) { // Use general equity cashflow list valuation for quanto or convexity corrections. var irParams = new IRCashflowParams(fForecastRate, fDiscountRate, fForecastRateVol, fDiscountRateVol, fForecastFXVol, fForecastFXCorrel, fForecastDiscountCorrel, cache.Get(1.0), ReferenceEquals(fForecastRate, fDiscountRate), fForecastRate.GetCurrency() != fDiscountRate.GetCurrency(), Convexity_Correction == YesNo.Yes, Quanto_Correction == YesNo.Yes); deal.Cashflows.Value(pv, cash, baseDate, valueDate, irParams, equityParams, fFxRate, intraValuationDiagnosticsWriter, fCutoffDate); } } pv.Assign(fBuySellSign * pv); if (cash != null) { cash.AssignProduct(fBuySellSign, cash); } }