/// <summary> /// Prepare for valuation anything that is not dependent upon the scenario. /// </summary> public override void PreCloneInitialize(PriceFactorList factors, BaseTimeGrid baseTimes, RequiredResults requiredResults) { base.PreCloneInitialize(factors, baseTimes, requiredResults); CFFixedInterestListDeal deal = (CFFixedInterestListDeal)Deal; // Set up cashflow list deal.Cashflows.CalculateInterest(factors.BaseDate); // Add to valuation time grid bool payDatesRequired = ValueOnCashflowDates() && requiredResults.CashRequired(); fT.AddPayDates <CFFixedInterest>(deal.Cashflows, payDatesRequired); double baseDate = factors.BaseDate; double settlementDate = deal.Settlement_Date; if (settlementDate >= baseDate) { fT.AddPayDate(settlementDate, payDatesRequired); var accrualCalendar = deal.GetHolidayCalendar(); fAccruedInterest = deal.Cashflows.CalculateAccrual(settlementDate, false, accrualCalendar); fSettlementAmount = deal.Settlement_Amount; if (deal.Settlement_Amount_Is_Clean == YesNo.Yes) { fSettlementAmount += fAccruedInterest; } } // Settlement date takes precedence. if (Use_Settlement_Offset == YesNo.Yes && settlementDate != 0.0) { fCutoffDate = 0.0; } if (deal.Investment_Horizon > 0.0) { fT.AddPayDate(deal.Investment_Horizon, payDatesRequired); } if (Use_Survival_Probability == YesNo.Yes) { fRecoveryList = new CFRecoveryList(); fRecoveryList.PopulateRecoveryCashflowList(baseDate, settlementDate, deal.Cashflows); } }
/// <summary> /// Calculate valuation metrics requested by the Base Valuation calculation. /// </summary> private void CalculateMetrics(ValuationResults valuationResults, PriceFactorList factors, CFFixedInterestListDeal deal) { var results = valuationResults.Results <ValuationMetrics>(); if (results == null) { return; } if (results.IsMetricRequested(ValuationMetricConstants.Duration)) { using (var cache = Vector.Cache(factors.NumScenarios)) { Vector duration = cache.GetClear(); Vector settlementDate = cache.Get(deal.Settlement_Date); deal.Cashflows.Duration(duration, factors.BaseDate, factors.BaseDate, settlementDate, fDiscountRate, fCutoffDate); results.SetMetricValue(ValuationMetricConstants.Duration, new ValuationId(this), duration[0]); } } if (results.IsMetricRequested(ValuationMetricConstants.AccruedInterest)) { double?parameter = results.GetMetricParameter(ValuationMetricParameterConstants.AccrueFromToday); bool accrueFromToday = parameter.HasValue && parameter.Value == 1.0; double accruedInterest = deal.Cashflows.CalculateAccrual(factors.BaseDate, accrueFromToday, deal.GetHolidayCalendar()); double buySellSign = deal.Buy_Sell == BuySell.Buy ? 1.0 : -1.0; results.SetMetricValue(ValuationMetricConstants.AccruedInterest, new ValuationId(this), buySellSign * 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) { Value(pv, cash, baseDate, valueDate, null, fDiscountRate, null, fRepoRate, null, null, fSurvivalProb, saccrResult, intraValuationDiagnosticsWriter); // Add accruedInterest to Intra-valuation diagnostics if (intraValuationDiagnosticsWriter.Level > IntraValuationDiagnosticsLevel.None) { CFFixedInterestListDeal deal = (CFFixedInterestListDeal)Deal; using (var cache = Vector.CacheLike(pv)) { Vector accruedInterest = cache.Get(deal.Cashflows.CalculateAccrual(valueDate, false, deal.GetHolidayCalendar())); IntraValuationDiagnosticsHelper.AddCashflowsAccruedInterest(fIntraValuationDiagnosticsWriter, accruedInterest); } } }