public void AddBusinessDays() { Assert.AreEqual(BusinessDay, BusinessDay.AddBusinessDays(0, Calendar)); Assert.AreEqual(WeekendDay, WeekendDay.AddBusinessDays(0, Calendar)); Assert.AreEqual(new DateTime(2019, 10, 17), WeekendDay.AddBusinessDays(-1, Calendar)); Assert.AreEqual(new DateTime(2019, 10, 24), new DateTime(2019, 10, 19).AddBusinessDays(2, Calendar)); Assert.AreEqual(new DateTime(2020, 01, 02), NewYears.AddBusinessDays(1, Calendar)); }
private void _addCashFlow(CashFlowRate cashFlow) { // Console.WriteLine("Add Cashflow:" + cashFlow.Rate + " " + cashFlow.MaturityType + " " + cashFlow.Maturity + " " + cashFlow.FrequencyType + " " + cashFlow.Frequency + " " + cashFlow.DayCount); double rate = cashFlow.Rate; InterestRateTenorType frequencyType = cashFlow.FrequencyType; int frequency = cashFlow.Frequency; InterestRateTenorType maturityType = cashFlow.MaturityType; int maturity = cashFlow.Maturity; DayCountConvention dayCount = cashFlow.DayCount; BusinessDay expiryDate = null; switch (maturityType) { case InterestRateTenorType.Daily: expiryDate = _startDate.AddActualDays(maturity, TimeSeries.DateSearchType.Next); //expiryDate = _startDate.AddActualDays(maturity, BusinessDaySearchType.Next); break; case InterestRateTenorType.Weekly: expiryDate = _startDate.AddActualDays(maturity * 7, TimeSeries.DateSearchType.Next); //expiryDate = _startDate.AddActualDays(maturity * 7, BusinessDaySearchType.Next); break; case InterestRateTenorType.Monthly: expiryDate = _startDate.AddMonths(maturity, TimeSeries.DateSearchType.Next); //expiryDate = _startDate.AddMonths(maturity, BusinessDaySearchType.Next); break; case InterestRateTenorType.Yearly: expiryDate = _startDate.AddYears(maturity, TimeSeries.DateSearchType.Next); //expiryDate = _startDate.AddYears(maturity, BusinessDaySearchType.Next); break; default: break; } BusinessDay runningDate = _startDate; if (frequencyType == maturityType && frequency == maturity) { double t = expiryDate.YearsBetween(_startDate, dayCount); double pv = 1 / (1 + rate * t); t = expiryDate.YearsBetween(_startDate, DayCountConvention.Act365); _zeroRates.TryAdd(t, -Math.Log(pv) / t); } else { int counter = 1; double pvs = 0; double PV = 0; double t = 0; bool flag = true; BusinessDay previousDate = _startDate; while (flag) { previousDate = runningDate; if (frequencyType == InterestRateTenorType.Daily) { runningDate = runningDate.AddBusinessDays(frequency * counter); } else if (frequencyType == InterestRateTenorType.Weekly) { runningDate = _startDate.AddActualDays(7 * frequency * counter, TimeSeries.DateSearchType.Next); } //runningDate = _startDate.AddActualDays(7 * frequency * counter, BusinessDaySearchType.Next); else if (frequencyType == InterestRateTenorType.Monthly) { runningDate = _startDate.AddMonths(frequency * counter, TimeSeries.DateSearchType.Next); } //runningDate = _startDate.AddMonths(frequency * counter, BusinessDaySearchType.Next); else if (frequencyType == InterestRateTenorType.Yearly) { runningDate = _startDate.AddYears(frequency * counter, TimeSeries.DateSearchType.Next); } //runningDate = _startDate.AddYears(frequency * counter, BusinessDaySearchType.Next); flag = (runningDate.DateTime < expiryDate.DateTime); if (flag) { counter++; t = runningDate.YearsBetween(previousDate, dayCount); pvs += rate * t * PresentValue(runningDate.YearsBetween(_startDate, DayCountConvention.Act365)); t = expiryDate.YearsBetween(runningDate, dayCount); PV = (1 - pvs) / (1 + rate * t); } } t = expiryDate.YearsBetween(_startDate, DayCountConvention.Act365); double zeroRate = -Math.Log(PV) / t; _zeroRates.TryAdd(t, zeroRate); } }