Пример #1
0
        /// <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);
            }
        }
Пример #2
0
        /// <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);
            }
        }
Пример #3
0
        /// <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);
                }
            }
        }