使用交易日的每日退货日期计数器

时间:2011-02-21 19:12:06

标签: r finance

我有一个时间序列数据集。这是数据样本:

      firm   evntdate       date evntdum      ret  mrktret bef_sum

1 03251110 1989-08-01 1989-02-23       1 -0.00498  0.00053     110
2 03251110 1989-08-01 1989-02-24       1 -0.00500 -0.00494     110
3 03251110 1989-08-01 1989-02-27       1  0.00503 -0.00125     110
4 03251110 1989-08-01 1989-02-28       1  0.00500  0.00392     110
5 03251110 1989-08-01 1989-03-01       1 -0.00498 -0.00040     110
6 03251110 1989-08-01 1989-03-02       1  0.00000  0.00503     110

数据集包括有关公司(“公司”)和事件日期(“evntdate”)的信息。对于每个活动日期,在活动日期之前有几个每日回报('ret'),因此对于每个特定活动,必须有一个独特的公司和活动日期,重复次数与我每天返回的次数相同。 'bef_sum'是一个数字,表示事件日期之前的每日回报数,如果它属于同一公司/事件日期,则每行重复一次。

我想要做的是创建另一个将创建日期计数器的列,以便针对firm / evndate的特定组合的第一个每日返回(基于'date')将是-110下一个-109 (因为这个计数器是相对于事件日期而言),所以堡垒。我遇到的困难是这个计数器应该对每个公司/ evntdate都是独立的,我不能使用事件日期减去日期的简单减法因为这些是交易日,所以不应该考虑假期/周末。

2 个答案:

答案 0 :(得分:0)

您是否尝试过timeDate library的功能?例如,函数holidayNYSE()返回给定年份的纽约证券交易所假期。您可以使用此列表删除不适用的日期。

答案 1 :(得分:0)

这是使用plyr包获得所需内容的一种方法(我在我创建的示例数据框架上显示它,删除与此问题无关的列,例如返回等): / p>

> require(plyr)
> ddply( df, .(firm, evntdate), transform, 
         DateCount = -1 - bef_sum + seq_along( bef_sum))

   firm   evntdate       date bef_sum DateCount
1     1 1989-08-01 1989-07-01       7        -7
2     1 1989-08-01 1989-07-04       7        -6
3     1 1989-08-01 1989-07-07       7        -5
4     1 1989-08-01 1989-07-10       7        -4
5     1 1989-08-01 1989-07-13       7        -3
6     1 1989-08-01 1989-07-16       7        -2
7     1 1989-08-01 1989-07-19       7        -1
8     1 1990-08-01 1990-07-01       5        -5
9     1 1990-08-01 1990-07-05       5        -4
10    1 1990-08-01 1990-07-09       5        -3
11    1 1990-08-01 1990-07-13       5        -2
12    1 1990-08-01 1990-07-17       5        -1

一般情况下,您可以使用套餐fCalendar处理假期和周末等 - 如果您使用此类套餐,则可以直接计算evntdate之间的“交易日”数量和date