Оценка скользящей стоимости риска (VaR) с использованием R

Мне нужно выполнить скользящую оценку VaR ежедневной доходности акций. Сначала я сделал следующее:

library(PerformanceAnalytics)
data(edhec)
sample<-edhec[,1:5]
var605<-rollapply(as.zoo(sample),width=60,FUN=function(x) VaR(R=x,p=.95,method="modified",invert=T),by.column=TRUE,fill=NA)

Он выполняет вычисления и возвращает объект зоопарка, но выдает ряд предупреждений следующим образом:

VaR calculation produces unreliable result (inverse risk) for column: 1 : -0.00030977098532231 

Затем я попробовал то же самое с образцом моих данных следующим образом:

library(foreign)
sample2 <- read.dta("sample2.dta")
sample2.xts <- xts(sample2[,-1],order.by=as.Date(sample2$datadate,format= "%Y-%m-%d"))
any(is.na(sample2.xts))
var605<-rollapply(as.zoo(sample2.xts),width=60,FUN=function(x) VaR(R=x,p=.95,method="modified",invert=T),by.column=TRUE,fill=NA)

Но он не возвращает никакого объекта зоопарка и выдает следующие предупреждения и ошибки:

VaR calculation produces unreliable result (inverse risk) for column: 1 : -0.0077322590200255
Error in if (eval(tmp < 0)) { : missing value where TRUE/FALSE needed
Called from: top level

Из более раннего сообщения (Использование функции rollapply для расчета VaR с использованием R) Я понимаю, что скользящая оценка не может быть выполнена, если отсутствует полное скользящее окно, но в моих данных (sample2.dta) пропущенных значений нет.

sample2.dta можно загрузить с https://drive.google.com/file/d/0B8usDJAPeV85WDdDQTFEbGQwaUU/edit?usp=sharing

Может ли кто-нибудь помочь мне решить и понять эту проблему?


person Jairaj Gupta    schedule 28.08.2014    source источник


Ответы (2)


1) Мы можем воспроизвести предупреждение, используя только VaR, следующим образом:

> VaR(R = edhec[seq(25, length=60), 5], p = .95, method = "modified", invert = TRUE)
VaR calculation produces unreliable result (inverse risk) for column: 1 : -0.000203691774704274
    Equity Market Neutral
VaR                    NA

Попробуйте использовать другой method=.

> VaR(R = edhec[seq(25, length=60), 5], p = .95, method = "gaussian", invert = TRUE)
    Equity Market Neutral
VaR          -0.001499347

2) С "gaussian" я по-прежнему получал предупреждения о реальном наборе данных, но без ошибок. Попробуйте поэкспериментировать с другими доступными значениями аргумента "method". См. ?VaR .

3) Обратите внимание, что by.column = TRUE можно не указывать, так как он используется по умолчанию.

person G. Grothendieck    schedule 28.08.2014
comment
Мне нужно использовать модифицированный VaR, так как он учитывает асимметрию и эксцесс как дополнительные параметры при оценке VaR. Настоящая проблема возникает, когда выполняется скользящая оценка, как объясняется в вопросе. - person Jairaj Gupta; 31.08.2014
comment
Попробуйте заменить function(x) VaR(...) на function(x) { out <- try(VaR(...)); if (inherits(out, "try-error")) NA else out }, чтобы избежать остановки с ошибкой. - person G. Grothendieck; 31.08.2014
comment
Он выдает сообщение об ошибке, но не останавливается, а вместо этого дает ответ. Вы можете использовать try(..., silent = TRUE), если не хотите видеть сообщение об ошибке. - person G. Grothendieck; 02.09.2014
comment
Спасибо, это делает работу, а также решает проблему этого сообщения: stackoverflow.com/questions/25109672/ - person Jairaj Gupta; 06.09.2014
comment
Но это занимает около 40 секунд на столбец; У меня около 11 000 столбцов, а время вычислений превышает 100 часов. Можете ли вы придумать более быструю альтернативу этому? - person Jairaj Gupta; 07.09.2014

Проблема в том, что иногда в ваших данных нет никаких изменений для 60-периодного окна.

R> no_var <- rollapply(sample2.xts, 60, sd, by.column=TRUE)
R> any(no_var==0)
[1] TRUE
R> head(no_var[-(1:60),])
                  001034        001038 001055        001066 001109
1984-03-26 -0.0003322471 -0.0001498238      0 -0.0111818465      0
1984-03-27 -0.0003322471 -0.0001498238      0  0.0002076288      0
1984-03-28 -0.0003322471 -0.0545102488      0  0.0092900768      0
1984-03-29 -0.0199407074 -0.0565552432      0 -0.0183491390      0
1984-03-30  0.0192762133 -0.0023488011      0  0.0000000000      0
1984-04-02 -0.0003322471  0.0000000000      0  0.0560894683      0

Я зафиксировал патч для PerformanceAnalytics на R-Forge (r3525), чтобы позволить NaN пройти проверку разумности.

person Joshua Ulrich    schedule 05.09.2014
comment
Большое спасибо за объяснение. - person Jairaj Gupta; 06.09.2014