#r #date #data.table #data-manipulation #finance
#r #Дата #data.table #манипулирование данными #финансы
Вопрос:
Предположим, у меня есть 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
Я хочу вычесть вектор рыночной доходности из столбца returns в priceDT data.table. Доходность рынка находится в другой таблице данных и содержит даты за первые 3 торговые недели 2011 года. Однако две акции в priceDT не содержат данных за все торговые недели. Первая акция, AFR, содержит данные только за одну неделю. Второй запас данных содержит данные за две недели. Рыночные доходы содержат данные за все три недели.
Рыночная доходность выглядит следующим образом:
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 и вычесть рыночную доходность следующих двух недель января из доходности второй акции, BMF. Есть ли способ сопоставить по датам в обоих данных перед вычитанием?
Результат должен быть:
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
")
Ответ №1:
Возможно, я неправильно понял ваши требования, но это соответствует ожидаемому результату
priceDT[, adj_return := market[.SD, on = "Date", i.Return - x.Return]]