Рассчитать реализованную волатильность в R

Я пытаюсь рассчитать реализованную волатильность членов S&P 500 за определенный интервал. У меня проблемы с циклом по индексу и сохранением значений.

Процесс должен заключаться в том, чтобы рассчитать волатильность каждого имени, а затем сохранить ее во фрейме данных. Отформатированы "Тикер" и "Волатильность"

Я использовал приведенный ниже код для расчета объема

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

Я пробовал миллион разных попыток зацикливания и сохранения, но все потерпели неудачу. Заранее спасибо за помощь!


person Patriots_25    schedule 23.01.2020    source источник


Ответы (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
person Ronak Shah    schedule 24.01.2020
comment
Вероятно, не стоит заменять NA на 0, так как это может изменить волатильность, возможно, лучше использовать sd(ret, na.rm = TRUE). - person user2474226; 24.01.2020
comment
Это сработало отлично! Огромное спасибо за помощь!! - person Patriots_25; 24.01.2020