R 创建历史交易的投资组合 Returns
R Creating Portfolio Returns of Historic Trades
我创建这个话题是因为目前在事件研究中没有投资组合日历方法的话题。虽然在金融中使用了这种方式,但是这个问题涉及到使用这种方式第一步使用的代码;计算该期间所有交易的平均值 return。
我想创建一组预先指定交易 (n =~100000) 的投资组合 returns(等权重),样本周期(在本例中:01-01-2000 至01-01-2010),同时每天已经有这些交易的实际 return。由于这是一项事件研究,因此每笔交易仅考虑前 x 天(在本例中为 21 天,t=0 是期间的开始日,t=20 是交易的最后一天)。
数据的结构如下:
对于每笔交易,ID 都是唯一的,并且对于每笔交易,事件发生后每天的实际 return 是已知的。例如,Ret.t0 是事件发生当天(可在“日期”列中找到,例如 2000-01-01)制作的 return,Ret.t1 是 return在事件发生后的第 1 天制作(例如,2000-01-02)。
正在创建样本,可在 r 代码中重现:
size = 1e5
df <- data.frame(
ID = seq.int(size),
FirmID = sample(1:1000),
Date = sample(seq(
as.Date('2000/01/01'), as.Date('2010/01/01'), by = "day"
), size, replace = TRUE),
Ret.t0 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t1 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t2 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t3 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t4 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t5 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t6 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t7 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t8 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t9 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t10 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t11 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t12 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t13 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t14 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t15 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t16 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t17 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t18 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t19 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t20 = sample(-2000:2000, size, replace = TRUE)/100000)
主要问题是,例如,在 01-01-2000 进行的交易在 t=6 日有一个 return 需要与 07-01-2000 进行的交易相匹配,其中 return 对应于第 t=0 天。具有 return 的每笔交易都需要计入平均值 return,即投资组合 return。但是,任何给定时间的交易数量也不固定。
投资组合 return 输出需要如下所示:
Date Return
2000-01-01 0.01205
2000-01-02 0.0089
2000-01-03 0.0012
….
2010-01-21 0.0302
像这样?
library(dplyr)
library(tidyr)
df %>%
## ID not needed:
select(-ID) %>%
## stack return timepoints per FirmID and Date
pivot_longer(cols = starts_with('Ret'),
names_to = 'return_code',
values_to = 'return') %>%
arrange(FirmID, Date) %>%
rename('start_date' = 'Date') %>%
## extract timepoint t = 0, 1, ... from return code Ret.t0 ...
## and cast it to integer to add it to start date:
mutate(t = gsub('.*t', '', return_code) %>% as.integer,
date = start_date + t) %>%
## group by actual date and summarise:
group_by(date) %>%
summarise(avg_return = mean(return, na.rm = TRUE))
我创建这个话题是因为目前在事件研究中没有投资组合日历方法的话题。虽然在金融中使用了这种方式,但是这个问题涉及到使用这种方式第一步使用的代码;计算该期间所有交易的平均值 return。
我想创建一组预先指定交易 (n =~100000) 的投资组合 returns(等权重),样本周期(在本例中:01-01-2000 至01-01-2010),同时每天已经有这些交易的实际 return。由于这是一项事件研究,因此每笔交易仅考虑前 x 天(在本例中为 21 天,t=0 是期间的开始日,t=20 是交易的最后一天)。
数据的结构如下:
对于每笔交易,ID 都是唯一的,并且对于每笔交易,事件发生后每天的实际 return 是已知的。例如,Ret.t0 是事件发生当天(可在“日期”列中找到,例如 2000-01-01)制作的 return,Ret.t1 是 return在事件发生后的第 1 天制作(例如,2000-01-02)。
正在创建样本,可在 r 代码中重现:
size = 1e5
df <- data.frame(
ID = seq.int(size),
FirmID = sample(1:1000),
Date = sample(seq(
as.Date('2000/01/01'), as.Date('2010/01/01'), by = "day"
), size, replace = TRUE),
Ret.t0 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t1 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t2 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t3 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t4 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t5 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t6 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t7 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t8 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t9 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t10 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t11 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t12 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t13 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t14 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t15 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t16 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t17 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t18 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t19 = sample(-2000:2000, size, replace = TRUE)/100000,
Ret.t20 = sample(-2000:2000, size, replace = TRUE)/100000)
主要问题是,例如,在 01-01-2000 进行的交易在 t=6 日有一个 return 需要与 07-01-2000 进行的交易相匹配,其中 return 对应于第 t=0 天。具有 return 的每笔交易都需要计入平均值 return,即投资组合 return。但是,任何给定时间的交易数量也不固定。
投资组合 return 输出需要如下所示:
Date Return
2000-01-01 0.01205
2000-01-02 0.0089
2000-01-03 0.0012
….
2010-01-21 0.0302
像这样?
library(dplyr)
library(tidyr)
df %>%
## ID not needed:
select(-ID) %>%
## stack return timepoints per FirmID and Date
pivot_longer(cols = starts_with('Ret'),
names_to = 'return_code',
values_to = 'return') %>%
arrange(FirmID, Date) %>%
rename('start_date' = 'Date') %>%
## extract timepoint t = 0, 1, ... from return code Ret.t0 ...
## and cast it to integer to add it to start date:
mutate(t = gsub('.*t', '', return_code) %>% as.integer,
date = start_date + t) %>%
## group by actual date and summarise:
group_by(date) %>%
summarise(avg_return = mean(return, na.rm = TRUE))