我试图计算债券的所有现金流日期,债券的频率日期是每月。对于其他频率,我通常使用COUPNCD。我试着使用=EDATE(到期日;-1),但是日期不正确,因为它没有考虑支付优惠券的方式,总是在同一天,除非它不存在。
示例:
结算日期: 31-12-2014;到期日: 30-05-2016;基准:2(实际/360);频率:4
使用=COUPNCD计算息票日期,我得到现金流的下列日期:
28-02-2015 30-05-2015 30-08-2015 30-11-2015 29-02-2016 30-05-2016
如果我计算with =EDATE(日期;-3),我得到:
28-02-2015 30-05-2015 30-08-2015 29-11-2015 29-02-2016 30-05-2016
你有什么办法能帮到我吗?
谢谢:)
发布于 2017-03-25 22:47:18
对于函数COUPNCD和COUPNUM,我也遇到了同样的问题--不能使用12 (用于每月支付)作为频率属性。
有一种方法-您可以编写以下用户定义的函数。我现在在我的金融模型中使用它,它运行得很完美。
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发布于 2016-05-06 13:53:07
我不能复制你的EDATE()结果。使用下面的公式,我得到了与COUPNCD()函数完全相同的值:
=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( maturity为30-05-2016)
如上文所示,请检查是否为EDATE()函数使用了正确的参数。
https://stackoverflow.com/questions/37069518
复制相似问题