Reputation: 173
I'm trying to calculate all the cash flows dates for a bond, the frequency date of the bond is monthly. For other frequency I usually use COUPNCD. I tried to use =EDATE(maturity date;-1) but the dates are not right since it's not considering the way coupons are paid, always the same day except when it doesn't exist.
Example:
Settlement date: 31-12-2014 ; Maturity date: 30-05-2016 ; Basis: 2 (actual/360) and Frequency: 4
Computing the coupon dates with =COUPNCD i get the following dates for the cash flows:
28-02-2015 30-05-2015 30-08-2015 30-11-2015 29-02-2016 30-05-2016
If I compute with =EDATE(date;-3) i get:
28-02-2015 30-05-2015 30-08-2015 29-11-2015 29-02-2016 30-05-2016
Do u have any idea that could help me?
Thanks :)
Upvotes: 0
Views: 1729
Reputation: 26
I had the same problem regarding functions COUPNCD
and COUPNUM
– cannot use 12 (for monthly payments) as frequency attribute.
There is a way around – you can write the following user defined function. I use it now in my financial models, and it works perfectly.
Option Explicit
Public Function DC_CoupNum(Settlement As Date, Maturity As Date, NumberOfPayments As Integer) As Integer
Dim NewDate As Date
Dim i As Integer
Dim r As Integer
Select Case NumberOfPayments
Case 1
r = 12
Case 2
r = 6
Case 4
r = 3
Case 12
r = 1
End Select
NewDate = Maturity
i = 0
Do While NewDate > Settlement
i = i + 1
NewDate = Application.WorksheetFunction.EDate(NewDate, -1 * r)
' Debug.Print NewDate
Loop
DC_CoupNum = i
End Function
Public Function DC_CoupNcd(Settlement As Date, Maturity As Date, Frequency As Integer, Optional NextC As Boolean = True) As Date
'next coupon date after the settlement date
'NextC = True ... next coupon date
'NextC = False ... previous coupon date
Dim m, o
Select Case Frequency
Case 1
m = 12
Case 2
m = 6
Case 4
m = 3
Case 12
m = 1
End Select
o = DC_CoupNum(Settlement, Maturity, Frequency) - 1
If NextC = False Then o = o + 1
If Maturity = WorksheetFunction.EoMonth(Maturity, 0) Then 'pokud je Maturity konec mesice
DC_CoupNcd = Application.WorksheetFunction.EoMonth(Maturity, -o * m)
Else
DC_CoupNcd = Application.WorksheetFunction.EDate(Maturity, -o * m)
End If
End Function
Upvotes: 1
Reputation: 15724
I cannot reproduce your EDATE()
results. Using the following formula I get exactly the same values as you did for the COUPNCD()
function:
=EDATE(maturity;0) ==> 30-05-2016
=EDATE(maturity;-3) ==> 29-02-2016
=EDATE(maturity;-6) ==> 30-11-2015
=EDATE(maturity;-9) ==> 30-08-2015
=EDATE(maturity;-12) ==> 30-05-2015
=EDATE(maturity;-15) ==> 28-02-2015
(with maturity
being 30-05-2016)
Please check that you use the correct parameters for the EDATE()
function, as indicated above.
Upvotes: 0