您的当前位置:首页正文

quantlib入门(3)

2020-06-02 来源:步旅网
QuantLib入门(三):时间和日期计算 Date and time calculations

下面还是另一个比较基础的模块,日期和时间模块,这个模块比较重要。你可以使用此模块进行时间和日期的计算、表示。因为在金融产品定价中涉及到许多期限的问题,如果能以一种统一的方式表示时间将是非常方便和明晰的。 具体来说,你可以使用此模块做以下事情: 计算日期间隔;

使用某个地区特有的日历(如使用中国的日历,就能轻易知道上交所是否开市,今天是否是清明节、中秋节等);

以实际天数/360天,或者以实际天数/365天等天数计算方式来计算计息日期;

建立一个日期,并在其上进行日期计算; „„等等

下面我们对这个模块做具体的介绍。

一、基础类型和结构

Day,其实是一个Integer类型,用来表示天数,而Year是用来表示年数的类型。

工作日调整: 为一枚举类型,如果当前日期不是工作日的话可以用它来表示如何调整日期,包括以下几个成员:

Following 在当前日期后的第一个工作日 ModifiedFollowing

Preceding 在当前日期前的第一个工作日 ModifiedPreceding Unadjusted 不调整

具体的例子会在Calendar中给出。

月度表示:

同样为一枚举类型,可以使用全称或三个字母的省略写法,分别代表1-12月及相应数字。如January和Jan都表示1月,内部都表示整数1。

频率:

分别可以表示:无频率、仅一次、每年、半年、每四个月、每季度、半个月、每个月、每四周、每两周、每周、每天、其它频率等。枚举变量定义如下: enum Frequency {

NoFrequency = -1, Once = 0, Annual = 1, Semiannual = 2,

EveryFourthMonth = 3, Quarterly = 4, Bimonthly = 6, Monthly = 12, EveryFourthWeek = 13, Biweekly = 26, Weekly = 52, Daily = 365, OtherFrequency = 999 }

时间单位:

Days,Weeks,Months,Years

星期:

顾名思义,从星期一表示到星期天,内部分别用整数1-7表示,同时可以采用英文全称或是三个字母的缩写。由枚举类型Weekday表示。

二、类 1)Date

这是此模块中最基本的一个类。

它有三个构造函数,默认构造函数、传递一个实数构造日期、传递日、月、年构造日期。最常用的应该是第三个构造函数。其原型为: Date(Day d, Month m, Year y);

同其它类一样,Date重载了常用的许多操作符,你可以对它进行+、-、-=等运算(当然,*运算是没有意义的)。有下面一个变量, Date birth=Date(20,Jan,2009); 你可以这样使用“-”运算。 another_date=brith-2,或者: Date d=Date(12,Jan,2009); another_integer=brith-d

但要注意,两者的返回值是不一样的。

具体的使用可以去查文档,在此给出一个简单的例子。

Date birth=Date(1,Apr,2009);

cout<<\"your birthday:\"<cout<cout<2)DateInterval

描述两个Date之间的间隔。注意,它并不能直接取得两个Date之间间隔的天数,要取得天数,还是要在两个Date之间使用“-”操作符。如: Date d1,d2;

DateInterval d、i=DateInterval(d1,d2); BigInteger k=di.startDate()-di.endDate();

3)PricingPeriod

继续自DateInterval,表示一个定价周期。????

4)Calendar 日历。

日历类提供一些用来判断一个给定市场上(比如中国、美国、法国等)的给定日期是工作日还是假期的方法,并且你还可以用来对一个给定日期进行工作日

加减,还能自己添加节假日。

这个模块的设计用到了桥模式。此模式用来进行抽象和实现的分离。具体来说,桥模式在日历类中的作用是提供一个基本的功能:判断一个日期是否是工作日。

下面我们来看一个简单的例子: Date d=Date(30,Jun,2009); Calendar cld=China();

cout<<\"Calendar name:\"<这五行代码定义了一个日期,2009年6月30日,并用一个中国日历来判断它是否是工作日,是否是节假日。第一个输出的结果是\"Calendar name:Shanghai stock exchange\",而不是China。因为这是个金融产品定价库,当然就是以交易所来划定地域范围。

在这值得一提的有两个成员函数。

一个是adjust。它用来将一个非工作日调整到另一个工作日,就是俗称的“换班”。比如,你今天要休假的,但是因为某种原因你得加班,于是你的假期被调整到下一个最近的工作日了。用代码这样表示: Date d=Date(28,Jun,2009); d=cld.adjust(d);

//Date adjust(const Date& ,

// BusinessDayConvention convention=following) const; cout<有三个类:Impl, OrthodoxImpl, WesternImpl,应该是类设计者实现桥模式时用到的,一般我们用不着。

具体的类功能,还请大家去看文档中的成员列表。

5)Day Counter

这一子模块提供了我们比较熟悉的天数计算方法,如实际天数/360天,实际天数/实际一年的天数等等。它一般要和其它模块结合起来使用。创建的方法很简单:

DayCounter dc=Actual360();

之后,dc就可以在其它模块中使用了。在使用其它模块时你会碰到它的用法的,目前不用着急。

时间和日期模块到此结束了。它比较重要,因为金融面向的就是时间流中的价值。具体的用法在使用定价模型时你会更清楚地看到。

因篇幅问题不能全部显示,请点此查看更多更全内容