Пример #1
0
        /// <summary>
        /// Calculate valuation profiles.
        /// </summary>
        public override void Value(ValuationResults valuationResults, PriceFactorList factors, BaseTimeGrid baseTimes)
        {
            PreValue(factors);

            TimeGridIterator tgi              = new TimeGridIterator(fT);
            PVProfiles       result           = valuationResults.Profile;
            CashAccumulators cashAccumulators = valuationResults.Cash;

            BaseCliquetOption deal = (BaseCliquetOption)Deal;

            double scale = (deal.Buy_Sell == BuySell.Buy ? +1 : -1) * deal.GetUnits();

            VectorEngine.For(tgi, () =>
            {
                using (var cache = Vector.Cache(factors.NumScenarios))
                {
                    Vector pv   = cache.Get();
                    Vector cash = cache.Get();

                    PricingFunctions.CliquetOption(pv, cash, deal.Option_Type, tgi.T, fTimes, deal.Moneyness,
                                                   fKnownPrices, fAssetPrice, fFxRate, fPayoffFxRate,
                                                   fDiscountRate, fAssetPriceVol, fQuantoCompo, fPayoffType,
                                                   factors.PathDependent);
                    cashAccumulators.Accumulate(fPayoffFxRate, tgi.Date, scale * cash);
                    result.AppendVector(tgi.Date, scale * pv * fPayoffFxRate.Get(tgi.T));
                }
            }
                             );

            result.Complete(fT);
        }
Пример #2
0
        /// <inheritdoc />
        public override void HeadNodeInitialize(PriceFactorList factors, BaseTimeGrid baseTimes, RequiredResults requiredResults)
        {
            base.HeadNodeInitialize(factors, baseTimes, requiredResults);

            BaseCliquetOption deal = (BaseCliquetOption)fDeal;

            DateList accrualDates = CashflowGeneration.GenerateStripOfDates(deal.Effective_Date, deal.Maturity_Date, deal.Frequency, deal.GetHolidayCalendar());

            fTimes = new double[accrualDates.Count];
            for (int i = 0; i < accrualDates.Count; ++i)
            {
                fTimes[i] = CalcUtils.DaysToYears(accrualDates[i] - factors.BaseDate);
            }

            // Get the asset price from the deal helper
            var         dealHelper = (BaseAssetFxDealHelper)deal.GetDealHelper();
            IAssetPrice assetPrice = dealHelper.GetAssetPrice(factors);

            fKnownPrices = deal.GetKnownPrices(accrualDates, factors, assetPrice);

            // Add expiry dates to valuation time grid.
            if (accrualDates.Count > 1)
            {
                DateList expiryDates = new DateList(accrualDates);
                expiryDates.RemoveAt(0);

                fT.AddPayDates(expiryDates, requiredResults.CashRequired());
            }
        }