从 data.table 中的每个组中减去一个向量并按日期匹配

Subtract a vector from each group in a data.table and match by dates in both

假设我有一个这样的data.table:

print(priceDT)

          Date  Return Stock
 1: 2011-01-03  0.0800   AFR
 2: 2011-01-04  0.0300   AFR
 3: 2011-01-05 -0.0125   AFR
 4: 2011-01-06  0.0100   AFR
 5: 2011-01-07  0.0020   AFR
 6: 2011-01-10  0.0073   BMF
 7: 2011-01-11 -0.0150   BMF
 8: 2011-01-12  0.0130   BMF
 9: 2011-01-13 -0.0080   BMF
10: 2011-01-14  0.0410   BMF
11: 2011-01-17 -0.0065   BMF
12: 2011-01-18  0.0180   BMF
13: 2011-01-19  0.0017   BMF
14: 2011-01-20  0.0262   BMF
15: 2011-01-21 -0.0190   BMF

我想从 priceDT data.table 的 returns 列中减去市场向量 returns。市场 returns 在另一个 data.table 中,包含 2011 年前 3 个交易周的日期。但是,priceDT 中的两只股票没有所有交易周的数据。第一只股票 AFR 只有一周的数据。第二只股票有两周的数据。市场 returns 拥有所有三周的数据。

市场returns是这样的:

print(market)

 market
          Date   Return
 1: 2011-01-03  0.01112
 2: 2011-01-04  0.02800
 3: 2011-01-05  0.00580
 4: 2011-01-06  0.00400
 5: 2011-01-07  0.00910
 6: 2011-01-10  0.01300
 7: 2011-01-11 -0.00800
 8: 2011-01-12 -0.01000
 9: 2011-01-13  0.02400
10: 2011-01-14  0.01390
11: 2011-01-17  0.01040
12: 2011-01-18  0.00718
13: 2011-01-19  0.01220
14: 2011-01-20 -0.00620
15: 2011-01-21  0.00944

如何从第一只股票 AFR 的 returns 中减去 1 月第一周的市场 returns 并减去接下来两周的市场 returns 1月来自第二只股票BMF的returns。有没有办法在减去之前按日期匹配两个数据?

结果应该是:

print(result)

          Date  Return Adjusted Return Stock
 1: 2011-01-03  0.0800         0.06888   AFR
 2: 2011-01-04  0.0300         0.00200   AFR
 3: 2011-01-05 -0.0125        -0.01830   AFR
 4: 2011-01-06  0.0100         0.00600   AFR
 5: 2011-01-07  0.0020        -0.00710   AFR
 6: 2011-01-10  0.0073        -0.00570   BMF
 7: 2011-01-11 -0.0150        -0.00700   BMF
 8: 2011-01-12  0.0130         0.02300   BMF
 9: 2011-01-13 -0.0080        -0.03200   BMF
10: 2011-01-14  0.0410         0.02710   BMF
11: 2011-01-17 -0.0065        -0.01690   BMF
12: 2011-01-18  0.0180         0.01082   BMF
13: 2011-01-19  0.0017        -0.01050   BMF
14: 2011-01-20  0.0262         0.03240   BMF
15: 2011-01-21 -0.0190        -0.02844   BMF

数据:

priceDT <- fread(text = "Date,Return,Stock
                 2011-01-03,0.08,AFR
                 2011-01-04,0.03,AFR
                 2011-01-05,-0.0125,AFR
                 2011-01-06,0.01,AFR
                 2011-01-07,0.002,AFR
                 2011-01-10,0.0073,BMF
                 2011-01-11,-0.015,BMF
                 2011-01-12,0.013,BMF
                 2011-01-13,-0.008,BMF
                 2011-01-14,0.041,BMF
                 2011-01-17,-0.0065,BMF
                 2011-01-18,0.018,BMF
                 2011-01-19,0.0017,BMF
                 2011-01-20,0.0262,BMF
                 2011-01-21,-0.019,BMF
                                 ")

market <- fread(text = "Date,Return
                 2011-01-03,0.01112
                 2011-01-04,0.028
                 2011-01-05,0.0058
                 2011-01-06,0.004
                 2011-01-07,0.0091
                 2011-01-10,0.013
                 2011-01-11,-0.008
                 2011-01-12,-0.01
                 2011-01-13,0.024
                 2011-01-14,0.0139
                 2011-01-17,0.0104
                 2011-01-18,0.00718
                 2011-01-19,0.0122
                 2011-01-20,-0.0062
                 2011-01-21,0.00944
                ")

result <- fread(text = "Date,Return,Adjusted Return,Stock
                 2011-01-03,0.08,0.06888,AFR
                 2011-01-04,0.03,0.00200,AFR
                 2011-01-05,-0.0125,-0.01830,AFR
                 2011-01-06,0.01,0.00600,AFR
                 2011-01-07,0.002,-0.00710,AFR
                 2011-01-10,0.0073,-0.0057,BMF
                 2011-01-11,-0.015,-0.0070,BMF
                 2011-01-12,0.013,0.0230,BMF
                 2011-01-13,-0.008,-0.0320,BMF
                 2011-01-14,0.041,0.0271,BMF
                 2011-01-17,-0.0065,-0.0169,BMF
                 2011-01-18,0.018,0.01082,BMF
                 2011-01-19,0.0017,-0.0105,BMF
                 2011-01-20,0.0262,0.03240,BMF
                 2011-01-21,-0.019,-0.02844,BMF
                ")

我可能误解了你的要求,但这符合预期的输出

priceDT[, adj_return := market[.SD, on = "Date", i.Return - x.Return]]