每月债券的优惠券日期 - 优秀

时间:2016-05-06 10:00:26

标签: excel

我试图计算债券的所有现金流日期,债券的频率日期是每月。对于其他频率,我通常使用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

你有什么想法可以帮助我吗?

谢谢:)

2 个答案:

答案 0 :(得分:1)

我在功能COUPNCDCOUPNUM方面遇到了同样的问题 - 不能使用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()功能的正确参数,如上所示。