在金融产品估值时,细节最多的就是如何生成日期和年限了,最核心的细节如下:
本帖分两章,第一章阐明理论,第二章展示代码。
1
理论
1.1
工作日惯例
工作日 (business day) 被认为是每周的正式工作的日子。通常对于大多数国家,工作日就是周一至周五,而且不包括公众假期。对于每个国家,公众假期都可能不同,见下图:
上图中公众假期有两种表现形式:
工作日惯例就是通过一些不同规定把一个非工作日调整到一个工作日 (非周末且非公众假期) 上。
1. 提前 (preceding)
提前惯例是将非工作日调整成其前一天工作日。
例子:2016年12月15日 (星期四) 一个月后是 2017年1月15日 (星期天),调整成前一天工作日是 2017年1月13日 (星期五)。此惯例常用在贷款,因此付款通常定在某一天之前。
2. 顺延 (following)
顺延惯例将非工作日调整成其后一天工作日。
例子:2016年12月15日 (星期四) 一个月后是 2017年1月15日 (星期天),但是是星期天,调整成后一天工作日是 2017年1月16日 (星期一)。
3. 修正提前 (modified preceding)
修正提前惯例将非工作日调整成其前一天工作日,但是如果这个工作日落在上个月,那么将非工作日调整成后其一天工作日。
例子:2016年12月1日 (星期四) 一个月后是 2017年1月1日 (星期天而且是公众假期),调整成前一天工作日是 2016年12月30日 (星期五) ,但是已经跨到上个月,因此调整成后一个工作日 2017年1月2日 (星期一)。
4. 修正顺延 (modified following)
修正顺延惯例将非工作日调整成其后一天工作日,但是如果这个工作日落在下个月,那么将非工作日调整成其前一天工作日。
例子:2017年3月30日 (星期四) 一个月后是 2017年4月30日 (星期天),调整成后一天工作日是 2017年5月1日 (星期一) ,但是已经跨到下个月,因此调整成前一个工作日 2017年4月28日 (星期五)。此惯例常用在利率衍生品上。
5. 月终 (end of month, EOM)
月终惯例是当起始日是某一个月的最后工作日 (注意不是日历日),那么调整后的结束日也要是某一个月最后工作日 (注意不是日历日)。
例子:
1.2
全连接层
年限是将两个日期间的天数按某种规则转化成年数,而日期计数惯例就是这个规则。定义这两个日期为起始日 (其年月日为 y1, m1, d1) 和结束日 (其年月日为 y2, m2, d2),并解释以下缩写含义:
下面来看看有哪些常见惯例:
1. 1/1
该惯例来自 2006 年 ISDA 文件里面的 4.16(a),年限等于 1
2. Act/Act
这两个惯例来自 2006 年 ISDA 文件里面的 4.16(b),计算年限方法为“非闰年里天数/365 + 闰年里天数/366”。这里的天数计算包括起始日不包括结束日。该惯例也称为 Act/Act ISDA。
例子:
3. Act/Act ICMA
该惯例来自 2006 年 ISDA 文件里面的 4.16(c),计算年限方法为 1/freq × adj。其中 freq 是每年付息次数,而 adj 是根据第一个或最后一个票息是短票息或长票息决定的 (四种类型,起始短票息,起始长票息,结束短票息和结束长票息)。
4. Act/365
该惯例来自 2006 年 ISDA 文件里面的 4.16(d),计算年限方法为 (d2 – d1)/ 365。这里的天数计算包括起始日和结束日。该惯例也称为 Act/365 F。
5. Act/360
该惯例来自 2006 年 ISDA 文件里面的 4.16(e),计算年限方法为 (d2 – d1)/ 360。这里的天数计算包括起始日和结束日。此惯例通常用在到期日小于一年的货币市场产品 (money market instrument)。
30/360 组
以下 6 到 9 的 30/360 组有以下的共同公式 [公式1]
[360(y2–y1)+30(m2–m1)+(d2–d1)] / 360
但是用不同方法来决定 y2, m2, d2, y1, m1, d1。
6. 30/360
该惯例来自 2006 年 ISDA 文件里面的 4.16(f),计算年限方法是用公式1并做以下调整:
该惯例也称为 bond basis,主要用在美国企业债。
7. 30E/360
该惯例来自 2006 年 ISDA 文件里面的 4.16(g),计算年限方法是用公式 1 并做以下调整:
该惯例也称为 30/360 ICMA, 30S/360, Eurobond basis 和 Special German。
8. 30E/360 (ISDA)
该惯例来自 2006 年 ISDA 文件里面的 4.16(h),计算年限方法是用公式1并做以下调整:
该惯例也称为 30E/360 ISDA 和 German。
9. 30E+/360
计算年限方法是用公式1并做以下调整:
10. Bus/252
年限等于包括起始日不包括结束日之间的工作日天数除以 252。该惯例用于巴西市场。
下图给出基本日期计数惯例的总结: