如何在R中用dplyr计算N日已实现方差?(复刻Che等2023研究)
计算90日已实现方差(R + dplyr管道实现)
核心逻辑
已实现方差采用过去90个交易日的日对数收益率平方之和计算,全程保留原始数值尺度(不归一化到0-1区间),满足后续对数转换需求,与Miranda-Aggripino & Rey(2019)的设定一致。
完整代码实现
1. 加载依赖包
library(quantmod) library(dplyr) library(lubridate) library(slider) # 适配dplyr的滚动计算工具 library(timeDate) # 用于过滤周末数据
2. 获取并预处理比特币数据
startDate <- as.Date("2022-12-29") endDate <- as.Date("2024-01-17") # 拉取BTC-USD数据并整理字段名 getSymbols("BTC-USD", from = startDate, to = endDate) BTC_USD <- `BTC-USD` names(BTC_USD) <- c("Open", "High", "Low", "Close", "Volume", "Adjusted") # 提取收盘价、过滤周末、转换为dataframe适配dplyr btc_df <- BTC_USD$Close %>% as.data.frame() %>% rename(close = Close) %>% mutate(date = index(BTC_USD)) %>% relocate(date) %>% filter(!isWeekend(as.timeDate(date)))
3. 用dplyr管道计算90日已实现方差
btc_realized_var <- btc_df %>% # 计算日对数收益率:ln(今日收盘价/昨日收盘价) mutate(log_return = log(close) - lag(log(close))) %>% # 计算对数收益率的平方项 mutate(log_return_sq = log_return^2) %>% # 滚动求和:取当前行及前89行的平方和(共90个交易日) mutate(realized_var_90d = slide_dbl(log_return_sq, sum, .before = 89, .complete = TRUE)) %>% # 过滤前90天的缺失值(窗口未填满时无有效计算结果) filter(!is.na(realized_var_90d))
4. MSCI指数的复用逻辑
MSCI指数的计算流程与比特币完全一致,仅需替换数据获取部分:
# 示例:获取标普500替代MSCI指数(实际可替换为对应MSCI代码) getSymbols("^GSPC", from = startDate, to = endDate) msci_df <- `^GSPC`$Close %>% as.data.frame() %>% rename(close = Close) %>% mutate(date = index(`^GSPC`)) %>% relocate(date) %>% filter(!isWeekend(as.timeDate(date))) # 计算MSCI指数的90日已实现方差 msci_realized_var <- msci_df %>% mutate(log_return = log(close) - lag(log(close))) %>% mutate(log_return_sq = log_return^2) %>% mutate(realized_var_90d = slide_dbl(log_return_sq, sum, .before = 89, .complete = TRUE)) %>% filter(!is.na(realized_var_90d))
关键说明
- 采用对数收益率:避免简单收益率的偏态问题,符合已实现方差的标准计量定义。
- 滚动计算参数:
.before = 89确保窗口包含当前交易日在内共90个有效数据,.complete = TRUE避免部分窗口的计算偏误。 - 原始尺度保留:计算得到的
realized_var_90d未做任何归一化处理,可直接执行log(realized_var_90d)完成对数转换。
内容的提问来源于stack exchange,提问作者justaneconomist
相关产品推荐
相关产品推荐

