Мы можем создать функцию, которая загружает исторические данные для символа и вычисляет его волатильность.
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