下面还是另一个比较基础的模块,日期和时间模块,这个模块比较重要。你可以使用此模块进行时间和日期的计算、表示。因为在金融产品定价中涉及到许多期限的问题,如果能以一种统一的方式表示时间将是非常方便和明晰的。 具体来说,你可以使用此模块做以下事情: 计算日期间隔;
使用某个地区特有的日历(如使用中国的日历,就能轻易知道上交所是否开市,今天是否是清明节、中秋节等);
以实际天数/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:\"< 描述两个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:\"< 在这值得一提的有两个成员函数。 一个是adjust。它用来将一个非工作日调整到另一个工作日,就是俗称的“换班”。比如,你今天要休假的,但是因为某种原因你得加班,于是你的假期被调整到下一个最近的工作日了。用代码这样表示: Date d=Date(28,Jun,2009); d=cld.adjust(d); //Date adjust(const Date& , // BusinessDayConvention convention=following) const; cout< 具体的类功能,还请大家去看文档中的成员列表。 5)Day Counter 这一子模块提供了我们比较熟悉的天数计算方法,如实际天数/360天,实际天数/实际一年的天数等等。它一般要和其它模块结合起来使用。创建的方法很简单: DayCounter dc=Actual360(); 之后,dc就可以在其它模块中使用了。在使用其它模块时你会碰到它的用法的,目前不用着急。 时间和日期模块到此结束了。它比较重要,因为金融面向的就是时间流中的价值。具体的用法在使用定价模型时你会更清楚地看到。 因篇幅问题不能全部显示,请点此查看更多更全内容