我有一个时间序列数据集。这是数据样本:
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都是独立的,我不能使用事件日期减去日期的简单减法因为这些是交易日,所以不应该考虑假期/周末。
答案 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
。