private void AddParRateForTaibor(DateTime startDate, ParRateElf parRateInfo) { (DateTime endDate, double days, double daysAct) = GetEndDate(startDate, parRateInfo); double zero = 0; //# 零息利率 #region 取零息利率 zero = RateAx.零息利率_T_R(parRateInfo.Rate, daysAct); #endregion 取零息利率 this.ParRateList.Add(new ParRateElfEx(parRateInfo, this.TradeDate, endDate, days, daysAct, zero)); }
public void AddParRate(ParRateElf parRateInfo) { switch (parRateInfo.Market) { case EnumRateMarket.Interbank: AddParRateForInterbank(this.TradeDate, parRateInfo); //# 啟算日從交易日 break; case EnumRateMarket.Taibor: AddParRateForTaibor(this.TradeDate, parRateInfo); //# 啟算日從交易日 break; case EnumRateMarket.COSMOS: AddParRateForCOSMOS(this.SpotDate, parRateInfo); //# 啟算日從即期日 break; } }
private (DateTime, double, double) GetEndDate(DateTime startDate, ParRateElf parRateInfo) { DateTime endDate = default(DateTime); //# 到期的實際日期 double days = 0; //# 從交易日至到期日總天數 double daysAct = 0; //# 總天數 / Actual //# 表示驗證用, 會改寫days及daysAct if (parRateInfo.FakeDays > 0) { days = parRateInfo.FakeDays; daysAct = days / ACTUAL; endDate = m_tradeDateAx.AdjustTradeDate(startDate.AddDays(parRateInfo.FakeDays)); } else { #region 取到期日 if (parRateInfo.Unit == EnumTenorUnit.Day) { if (parRateInfo.Tenor == 1 || parRateInfo.Tenor == 2) //# O/N, T/N { endDate = m_tradeDateAx.AddTradeDate(startDate, parRateInfo.Tenor); } else { endDate = m_tradeDateAx.AdjustTradeDate(startDate.AddDays(parRateInfo.Tenor)); } } if (parRateInfo.Unit == EnumTenorUnit.Month) { endDate = m_tradeDateAx.AdjustTradeDate(startDate.AddMonths(parRateInfo.Tenor)); } if (parRateInfo.Unit == EnumTenorUnit.Year) { endDate = m_tradeDateAx.AdjustTradeDate(startDate.AddYears(parRateInfo.Tenor)); } #endregion 取到期日 days = (endDate - this.TradeDate).TotalDays; daysAct = days / ACTUAL; } return(endDate, days, daysAct); }
private void AddParRateForCOSMOS(DateTime startDate, ParRateElf parRateInfo) { (DateTime endDate, double days, double daysAct) = GetEndDate(startDate, parRateInfo); double zero = 1; #region 取零息利率 //# 先加入新的COSMOS利率, zero先預設為1 this.ParRateList.Add(new ParRateElfEx(parRateInfo, this.TradeDate, endDate, days, daysAct, zero)); //# 先取出已經存在的COSMOS利率資料重算 List <ParRateElfEx> cosmosList = this.ParRateList.Where(p => p.Market == EnumRateMarket.COSMOS).ToList(); //# 為防萬一先排序一下 cosmosList = (from item in cosmosList orderby item.Days select item).ToList(); //# 取最後的Taibor利率 var maxTaibor = (from item in this.ParRateList where item.Market == EnumRateMarket.Taibor orderby item.Days descending select item).First(); GetZero(maxTaibor, cosmosList); logger.Info("ParRateExList={@parRateExList}", this.ParRateList); #endregion }
private void AddParRateForInterbank(DateTime startDate, ParRateElf parRateInfo) { //# 一定是ON或TN, 央行沒有報TN, 所以會用ON的利率帶進來 (DateTime endDate, double days, double daysAct) = GetEndDate(startDate, parRateInfo); double zero = 0; //# 零息利率 #region 取零息利率 if (parRateInfo.Unit == EnumTenorUnit.Day && parRateInfo.Tenor == 2) //# TN { ParRateElfEx ON = ParRateList.SingleOrDefault(p => p.Tenor == 1 && p.Unit == EnumTenorUnit.Day); if (ON == null) { throw new Exception("沒有O/N無法計算T/N的零息利率"); } double s = days - ON.Days; zero = RateAx.TN零息利率(ON.DF, parRateInfo.Rate, days, s); } else { zero = RateAx.零息利率_T_R(parRateInfo.Rate, daysAct); } #endregion 取零息利率 this.ParRateList.Add(new ParRateElfEx(parRateInfo, this.TradeDate, endDate, days, daysAct, zero)); }