internal static List <BillSwapPricer2CashflowItem> GenerateFixedCashflowsFromAmortisingResultItems(List <AmortisingResultItem> amortisingResultItems, IDayCounter dayCounter, double fixedRate)
        {
            var result = new List <BillSwapPricer2CashflowItem>();

            for (int i = 0; i < amortisingResultItems.Count - 1; ++i)
            {
                var billSwapPricer2CashflowItem = new BillSwapPricer2CashflowItem
                {
                    StartDate = amortisingResultItems[i].RollDate,
                    EndDate   = amortisingResultItems[i + 1].RollDate,
                    Notional  = amortisingResultItems[i].OutstandingValue
                };
                billSwapPricer2CashflowItem.AccrualPeriod      = dayCounter.YearFraction(billSwapPricer2CashflowItem.StartDate, billSwapPricer2CashflowItem.EndDate);
                billSwapPricer2CashflowItem.ImpliedForwardRate = fixedRate;
                billSwapPricer2CashflowItem.DiscountedValue    = billSwapPricer2CashflowItem.Notional /
                                                                 (1 + billSwapPricer2CashflowItem.ImpliedForwardRate * billSwapPricer2CashflowItem.AccrualPeriod);

                result.Add(billSwapPricer2CashflowItem);
            }
            return(result);
        }
        internal static List <BillSwapPricer2CashflowItem> GenerateFloatingCashflowsFromAmortisingResultItems(List <AmortisingResultItem> amortisingResultItems, IDayCounter dayCounter, RateCurve curve, double floatRateMargin)
        {
            var result = new List <BillSwapPricer2CashflowItem>();

            for (int i = 0; i < amortisingResultItems.Count - 1; ++i)
            {
                var billSwapPricer2CashflowItem = new BillSwapPricer2CashflowItem
                {
                    StartDate = amortisingResultItems[i].RollDate,
                    EndDate   = amortisingResultItems[i + 1].RollDate,
                    Notional  = amortisingResultItems[i].OutstandingValue
                };
                billSwapPricer2CashflowItem.AccrualPeriod = dayCounter.YearFraction(billSwapPricer2CashflowItem.StartDate, billSwapPricer2CashflowItem.EndDate);
                double startOfPeriodDiscount = curve.GetDiscountFactor(billSwapPricer2CashflowItem.StartDate);
                double endOfPeriodDiscount   = curve.GetDiscountFactor(billSwapPricer2CashflowItem.EndDate);
                double forecastContinuouslyCompoundingRate = floatRateMargin + ((startOfPeriodDiscount / endOfPeriodDiscount - 1.0) / billSwapPricer2CashflowItem.AccrualPeriod);
                billSwapPricer2CashflowItem.ImpliedForwardRate = forecastContinuouslyCompoundingRate;
                billSwapPricer2CashflowItem.DiscountedValue    = billSwapPricer2CashflowItem.Notional /
                                                                 (1 + billSwapPricer2CashflowItem.ImpliedForwardRate * billSwapPricer2CashflowItem.AccrualPeriod);
                result.Add(billSwapPricer2CashflowItem);
            }
            return(result);
        }