9

我想估计大约 2250 万个观测值的数据集的滚动风险价值,因此我想使用 sparklyr 进行快速计算。这是我所做的(使用示例数据库):

library(PerformanceAnalytics)
library(reshape2)
library(dplyr)

data(managers)
data <- zerofill(managers)
data<-as.data.frame(data)
class(data)
data$date=row.names(data)
lmanagers<-melt(data, id.vars=c('date'))

现在我使用 dplyr 和 PerformanceAnalytics 包估计 VaR:

library(zoo) # for rollapply()
var <- lmanagers %>% group_by(variable) %>% arrange(variable,date) %>% 
  mutate(var=rollapply(value, 10,FUN=function(x) VaR(x, p=.95, method="modified",align = "right"), partial=T))

这工作正常。现在我这样做是为了利用 sparklyr:

library(sparklyr)
sc <- spark_connect(master = "local")
lmanagers_sp <- copy_to(sc,lmanagers)
src_tbls(sc)

var_sp <- lmanagers_sp %>% group_by(variable) %>% arrange(variable,date) %>% 
  mutate(var=rollapply(value, 10,FUN=function(x) VaR(x, p=.95, method="modified",align = "right"), partial=T)) %>% 
  collect

但这会产生以下错误:

Error: Unknown input type: pairlist

谁能告诉我错误在哪里,正确的代码是什么?或者任何其他更快地估计滚动 VaR 的解决方案也值得赞赏。

4

2 回答 2

5

对于自定义dplyr后端sparklyrmutate目前不支持在其他包中定义的任意 R 函数;因此,rollapply()目前不支持。

为了计算 中的风险价值sparklyr,一种方法是使用 Scala 和 R 扩展 sparklyr,并遵循类似于:使用 Apache Spark 估算财务风险的方法。

于 2017-09-05T22:32:34.277 回答
0

让我把你的问题分成两个任务:

  • 如何使用界面进行滚动自连接(即, a.manager_id = b.manager_id and a.date < b.date and b.date <= a.date + 10sparklyr
  • 如何使用带有接口的自定义函数(即VaRsparklyr

第一个任务可能dplyr动词,它支持一组有限的窗口函数,包括lead()lag()。你可能会得到一些非常丑陋的东西,(lag(return,1) + lag(return,2) + lag(return,3))/(3 - is.na(lag(return,1)) - is.na(lag(return,2)) - is.na(lag(return,3))就像——只是一个通用的例子。(不幸的是,条件连接,例如日期窗口,仍然不受支持dplyr- 这个问题似乎经常出现,例如这个。)

DBI::dbGetQuery().

第二个任务是统计任务,不能简单地使用dplyr或直接 SQL 完成,并且它具有sparklyr不支持的库依赖项,因此您需要使用 Scala(或 Python)用户定义函数(UDF)来计算 VaR,例如在另一个答案中已经链接的那个。

tl;博士第一个任务是通过sparklyr(但使用 SQL,而不是dplyr)来完成的。第二个任务需要一个外部 UDF,然后您可以invoke()通过sparklyr.

于 2017-09-07T15:46:13.940 回答