如何快速计算多时间序列日对数收益率DataFrame的7日已实现波动率?
按周计算多列时间序列的7日已实现波动率
核心思路
已实现波动率基于日对数收益率的平方和开方计算,按周分组时直接对每周内的收益率执行该计算即可。若需要年化,可乘以$\sqrt{252/7}$(252为年交易日数)。
前提准备
确保你的DataFrame包含日期类型的索引或列,示例数据无日期,需先添加:
# 加载依赖包 library(dplyr) library(lubridate) library(data.table) # 可选,处理大数据更快 # 你的原始数据 df <- structure(list(ADA = c(0.00519787736925448, 0.0307208647325365, 0.154138771350992, 0.0164342066551776, -0.0557120045069119, 0.0137042340758324, -0.00923274693800846, -0.0560696427736868, -0.0453846430358594, -0.0119861841881651), BNB = c(-0.0231997754459639, 0.0439663779991935, 0.0685574769535244, -0.0310282134011945, 0.443641921228532, 0.400594784041669, -0.189571775497508, -0.0203461395784901, -0.0450853757768916, -0.00114121883972107), BTC = c(-0.0358973950143717, 0.0925827850343683, 0.0145041249453595, 0.025856749062152, 0.110937798087752, 0.00557805699941127, -0.0617370565817161, -0.082670269191885, -0.0386173267907015, 0.0255604355626176)), row.names = c(NA, 10L), class = "data.frame") # 添加日期列(假设为连续交易日,从2023-01-01开始) df <- df %>% mutate(date = ymd("2023-01-01") + days(0:(n()-1)))
方法一:用dplyr(简洁直观)
# 计算未年化的周度7日已实现波动率 weekly_rv <- df %>% mutate(week = floor_date(date, "week")) %>% # 按周分组,每周起始为周一 group_by(week) %>% summarise(across(c(ADA, BNB, BTC), ~sqrt(sum(.x^2)))) %>% ungroup() # 计算年化版本(转换为年波动率) weekly_rv_annualized <- df %>% mutate(week = floor_date(date, "week")) %>% group_by(week) %>% summarise(across(c(ADA, BNB, BTC), ~sqrt(sum(.x^2)) * sqrt(252/7))) %>% ungroup()
方法二:用data.table(大数据下更快)
# 转成data.table格式 dt <- as.data.table(df) dt[, week := floor_date(date, "week")] # 未年化波动率 weekly_rv_dt <- dt[, lapply(.SD, function(x) sqrt(sum(x^2))), by = week, .SDcols = c("ADA", "BNB", "BTC")] # 年化波动率 weekly_rv_dt_annualized <- dt[, lapply(.SD, function(x) sqrt(sum(x^2)) * sqrt(252/7)), by = week, .SDcols = c("ADA", "BNB", "BTC")]
注意事项
- 若原始数据已有日期列,直接替换代码中的日期生成逻辑即可。
- 若遇到某周交易日不足7天(如数据集首尾周),代码会自动计算该周现有交易日的波动率;若需严格滚动7天窗口,可使用
slider包的滑动窗口函数。
内容的提问来源于stack exchange,提问作者Keeran04
相关产品推荐
相关产品推荐

