You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于指定起始日期计算个股日对数收益率标准差的技术求助

解决方案

先修正你代码里的小错误(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:20:51