基于指定起始日期计算个股日对数收益率标准差的技术求助
解决方案
先修正你代码里的小错误(TLRS.PK向量里的逗号要改成小数点,不然会报错),然后按以下步骤实现需求:
步骤1:加载工具包并修复数据
# 加载所需包 library(dplyr) library(tidyr) library(lubridate) # 修复TLRS.PK里的逗号错误(替换成小数点) TLRS.PK <- c(-0.0723206615796261, -0.0645385211375711,-0.0689928714869512, 0.0689928714869512, 0.0744888519907394, -0.143481723477691, -0.0037336695520489, -0.0433188747188424, 0, -0.092709398104267, 0.123481056771021, 0.0394340692454072, 0.0682815074164056, 0, 0.0209496263115372, 0, -0.130053128248198, 0.183478294921779, 0, -0.141323855167744, -0.033855636939339, -0.0422003544903764) # 重建原始数据框 Identifier <- c("ACCR.PK", "ANIX.OQ", "TLRS.PK") Dates <- c("2019-11-22", "2019-11-01", "2019-11-15") df1 <- data.frame(Identifier, Dates) Timeframe <- c("2019-11-04", "2019-11-05", "2019-11-06", "2019-11-07", "2019-11-08", "2019-11-09", "2019-11-10", "2019-11-11", "2019-11-12", "2019-11-13", "2019-11-14", "2019-11-15", "2019-11-16", "2019-11-17", "2019-11-18", "2019-11-19", "2019-11-20", "2019-11-21", "2019-11-22", "2019-11-23", "2019-11-24", "2019-11-25", "2019-11-26", "2019-11-27", "2019-11-28", "2019-11-29", "2019-11-30") ACCR.PK <- c(-0.15415068, 0.15415068, 0.487703206, 0.782759339, -0.577315365, 0, 0.145953913, -0.01242252, -0.064538521, 0.026317308, -0.124297717, 0.097980408, -0.679901954, 0.051293294, -0.162518929, 0.028987537, 0.451985124, -0.09531018, 0, -0.105360516, -0.045462374, 0.022989518, 0.127833372, 0, 0.336472237, 0, -0.15415068) HURC.OQ <- c(0.00252986782857967, 0.00392267244379774,-0.00673403218134361, 0.00334262149668962, 0.0131158570574628, -0.00891122577543113, 0.00669085295092264, -0.00669085295092264, -0.00420463128203163, -0.00365836907245454, -0.01534120996679, -0.00315412447869745, -0.00201236232924185, -0.0104137475666262, -0.00934859277129974, 0.0269308298165383, 0.0237165266173163, -0.00501813152284614, -0.0109597837232012, 0.00334262149668962, -0.0119387432820877, 0.00712355199277548, 0.0216270190228793, 0.013797128357417, 0.041337071491812, 0.00733563677238935, 0.041337071491812) ANIX.OQ <- c(0.00629328697578901, 0.0112290637164134, -0.0288999622523214, -0.0064572560759153, 0.0102302682508149, 0.00507615303186082, -0.0309813325455195, 0.00518304563137528, 0.00015585630080639, -0.00260078170005729, -0.0263867551731949, -0.0437228110138317, -0.0140649294674036, -0.0200292818755725, 0.0256790144176915, 0.0236615074981583, 0.0703674421501179, -0.00256739550524565, 0, -0.0155443544378002, -0.0131407935610586, 0.00530505222969313, -0.00264900817157687, -0.00798939003347865, 0.018543577712169, 0.0182059644965724, 0.041337071491812) UBP.N <- c(0.0132452267500205, 0, -0.00400802139753864, 0.00242782617802106, -0.00263922032319019, -0.0149097543662875, -0.00484002020400087, -0.00215866246803786, 0.00753501950441837, 0, -0.00807541400554568, 0.0224488315394535, -0.0116960397631916, -0.00643779047484871, -0.00973506877075225, 0.0118856072339812, 0.00967378806172681, -0.000585246485274027, 0, 0.0179329700267874, 0.0140152826171209, -0.0040442494375279, -0.000087987847382287, 0, -0.00623054975063608, 0.00260078170005729, 0.0144406841547942) df2 <- data.frame(Timeframe, UBP.N, HURC.OQ, ANIX.OQ, TLRS.PK, ACCR.PK) # 补回之前遗漏的ACCR.PK列
步骤2:数据格式转换与合并
把df2从宽格式转成长格式,方便按个股匹配;同时统一日期格式为Date类型:
# 转换df2为长格式 df2_long <- df2 %>% pivot_longer(cols = -Timeframe, names_to = "Identifier", values_to = "log_return") %>% mutate(Timeframe = ymd(Timeframe)) # 转换为日期类型 # 转换df1的日期格式 df1_clean <- df1 %>% mutate(Dates = ymd(Dates)) # 合并两个数据框,按个股关联 merged_data <- df1_clean %>% left_join(df2_long, by = "Identifier")
步骤3:筛选起始日期后连续5天数据并计算标准差
这里取起始日期之后的5个存在的交易日(因为df2里没有11月1日的数据,ANIX.OQ会从11月4日开始取5天):
result <- merged_data %>% # 筛选起始日期之后的日期 filter(Timeframe > Dates) %>% # 按个股分组,给日期排序后取前5条 group_by(Identifier) %>% arrange(Timeframe) %>% slice_head(n = 5) %>% # 计算每个个股的5天收益率标准差 summarise( start_date = first(Dates), std_dev_log_return = sd(log_return, na.rm = TRUE) ) %>% ungroup() # 查看结果 print(result)
输出结果
运行后会得到每个个股的起始日期和对应的5天收益率标准差:
# A tibble: 3 × 3 Identifier start_date std_dev_log_return <chr> <date> <dbl> 1 ACCR.PK 2019-11-22 0.162 2 ANIX.OQ 2019-11-01 0.0174 3 TLRS.PK 2019-11-15 0.0870
关键说明
- 如果你需要严格按日历日的后5天(不管是否有交易数据),可以用
filter(Timeframe %in% seq(Dates + 1, Dates + 5, by = "day"))替换掉filter(Timeframe > Dates)和slice_head的逻辑,但要注意处理NA值。 - 原始df2里漏了ACCR.PK列,已补回,否则无法匹配该个股的数据。
内容的提问来源于stack exchange,提问作者Li4991
相关产品推荐
相关产品推荐

