【问题标题】:Calculate Realized Volatility in R计算 R 中的已实现波动率
【发布时间】:2025-12-14 12:40:01
【问题描述】:

我正在尝试计算标准普尔 500 指数成员在特定区间内的实际波动率。我在遍历索引和存储值时遇到问题。

该过程应该是计算每个名称的波动性,然后将其存储在数据框中。格式化的“Ticker”和“Volatility”

我一直在使用下面的代码来计算体积

library(tseries)
start_date <- as.Date("2019-04-23")
end_date <- as.Date("2020-01-22")
SP_500 <- data.frame(read.csv("Tickers.csv", header = TRUE))

data <- get.hist.quote('TIF',start_date, end_date, quote = c("Close"))
price <- data$Close
ret <- log(lag(price)) - log(price)
ret[is.na(ret)]<-0
vol <- sd(ret) * sqrt(252) * 100
vol

我已经尝试了一百万次不同的循环和存储尝试,但都失败了。提前感谢您的帮助!

【问题讨论】:

    标签: r loops stock volatility


    【解决方案1】:

    我们可以创建一个函数来下载交易品种的历史数据并计算其波动率。

    library(tseries)
    
    calculate_vol <- function(x, start_date, end_date) {
    
       data <- get.hist.quote(x,start_date, end_date, quote = "Close")
       price <- data$Close
       ret <- log(lag(price)) - log(price)
       ret[is.na(ret)]<-0
       vol <- sd(ret) * sqrt(252) * 100
       return(vol)
    }
    

    然后我们可以使用sapply 将符号传递给此函数,并使用stack 将其转换为数据帧。假设csv中存储符号的列称为symbol

    SP_500 <- read.csv("Tickers.csv", header = TRUE)
    realized_vol <- stack(sapply(SP_500$symbol, calculate_vol, start_date, end_date))
    

    例如:

    start_date <- as.Date("2020-01-01")
    end_date <- as.Date("2020-01-22")
    realized_vol <- stack(sapply(c('IBM', 'MSFT'), calculate_vol, start_date, end_date))
    realized_vol
    
    #     values  ind
    #1  9.165962  IBM
    #2 15.753567 MSFT
    

    【讨论】:

    • NA 替换为0 可能不是一个好主意,因为这会改变波动性,最好使用sd(ret, na.rm = TRUE)
    • 这非常有效!非常感谢您的帮助!!