Пример #1
0
        public double YieldCurveLinearBootstrap1(double _yearTime, ParRateElfEx lastRateElfEx, double slope, double daysAct, double irsRate)
        {
            //# 展開此COSMOS的利率, 總共有多少次計息, 每3個月計息一次, 1年就有4次
            IRSRateElf[] irsList = new IRSRateElf[Convert.ToInt32(Math.Round(_yearTime)) * 4];
            //# 預設NPV為-100, 不知道為什麼
            double npv = -100;

            for (int row = 0; row < irsList.Length; row++)
            {
                //# 每3個月計息一次, 取得計息日, 換算出天數相關資料
                irsList[row].EndDate = m_tradeDateAx.AdjustTradeDate(SpotDate.AddMonths((row + 1) * 3));
                irsList[row].Days    = (irsList[row].EndDate - TradeDate).TotalDays;
                irsList[row].DaysAct = irsList[row].Days / ACTUAL;
                if (row == 0)
                {
                    irsList[row].TenorDays = (irsList[row].EndDate - SpotDate).TotalDays;
                }
                else
                {
                    irsList[row].TenorDays = (irsList[row].EndDate - irsList[row - 1].EndDate).TotalDays;
                }
                irsList[row].TenorDaysAct = irsList[row].TenorDays / ACTUAL;
                //# 如果還在Taibor的利率範圍內, 直接用線性插補法取得Zero Rate
                if (irsList[row].Days < lastRateElfEx.Days)
                {
                    //# 取得已經完成Zero Rate的資料
                    var readlyRateList = from item in this.ParRateList
                                         where item.Zero != 1
                                         orderby item.Days
                                         select item;

                    var interpolate = MathNet.Numerics.Interpolate.Linear(readlyRateList.Select(p => p.DaysAct), readlyRateList.Select(p => p.Zero));
                    irsList[row].Zero = interpolate.Interpolate(irsList[row].DaysAct);
                }
                else //# 如果超過了Taibor的利率範圍, 還是用線性插補法取得, 只是改用了COSMOS和Taibor的斜率
                {
                    irsList[row].Zero = lastRateElfEx.Zero + slope * (irsList[row].DaysAct - lastRateElfEx.DaysAct);
                }
                //# 如果是此IRS最後一個Tenor了
                if (row == irsList.Length - 1)
                {
                    //# 不知道為什麼最後一個利息要加100元
                    irsList[row].Interest = irsRate * irsList[row].TenorDaysAct + 100;
                }
                else
                {
                    irsList[row].Interest = irsRate * irsList[row].TenorDaysAct;
                }
                //# 算折現因子
                var DFx = 1 / Math.Exp(irsList[row].Zero * 0.01 * irsList[row].DaysAct);
                //# 取得TN利率
                var tnRate = this.ParRateList.Where(p => p.Market == EnumRateMarket.Interbank && p.Tenor == 2).First();
                var DFy    = Math.Exp(tnRate.Zero * 0.01 * tnRate.DaysAct);
                irsList[row].DF = DFx * DFy;
                //# 算NPV
                irsList[row].NPV = irsList[row].Interest * irsList[row].DF;
                //# 總計NPV
                npv += irsList[row].NPV;
            }
            return(npv);
        }