我试图计算债券的所有现金流日期,债券的频率日期是每月。对于其他频率,我通常使用COUPNCD。我尝试使用= EDATE(到期日期; -1),但日期不正确,因为它没有考虑优惠券的支付方式,总是在同一天,除非它不存在。
示例:
结算日期:2014年12月31日;到期日:2016年5月30日;基础:2(实际/ 360)和频率:4
使用= COUPNCD计算优惠券日期我获得现金流的以下日期:
28-02-2015 30-05-2015 30-08-2015 2015年11月30日 29-02-2016 30-05-2016
如果我用= EDATE(日期; -3)计算,我得到:
28-02-2015 30-05-2015 30-08-2015 2015年11月29日 29-02-2016 30-05-2016
你有什么想法可以帮助我吗?
谢谢:)
答案 0 :(得分:1)
我在功能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
答案 1 :(得分:0)
我无法重现您的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()
功能的正确参数,如上所示。