sqlite - 使用 RSQLite 查找通过 GROUP BY 定义的序列的一阶差分的标准差

标签 sqlite r group-by

在 SQLite 中,我想找到我用 GROUP BY 定义的(记录的)系列的一阶差分的标准差。我的数据提供者为我提供了每日价格序列,但我想找到年化每日波动率(每日 yield 的标准差 - 该系列自然对数的第一个差异 - 每年)。我可以将数据导入 R,然后使用 ddply(),但我想完全在 SQLite 中完成此操作。我尝试了 RSQLite.extfunctions package 中的 difference() 函数,但我的用法是错误的。我希望它能像 R 中的 diff() 一样工作,但我找不到太多文档。

这会生成一些数据。

stocks <- 5
years <- 5
list.n <- as.list(rep(252, stocks * years))
list.mean <- as.list(rep(0, stocks * years))
list.sd <- as.list(abs(runif(stocks * years, min = 0, max = 0.1)))
list.po <- as.list(runif(n = stocks, min = 25, max = 100)) 
list.ret <- mapply(rnorm, n = list.n, mean = list.mean, sd = list.sd, SIMPLIFY = F)
my.price <- function(po, ret) po * exp(cumsum(ret))
list.price <- mapply(my.price, po = list.po, ret = list.ret, SIMPLIFY = F)
gvkey <- rep(seq(stocks), each = 252 * years)
day <- rep(seq(252), n = stocks * years)
fyr <- rep(seq(years), n = stocks, each = 252)
data.dly <- data.frame(gvkey, fyr, day, p = unlist(list.price))

这是我如何使用 ddply() 和结果来实现这一点。

# I could do this easily with ddply and subset
library(plyr)
data.dly <- ddply(data.dly, .(gvkey, fyr), transform, vol = sd(diff(log(p))))
data.ann <- subset(data.dly, day == 252)
head(data.ann)
     gvkey fyr day         p         vol
252      1   1 252  86.08568 0.077287182
504      1   2 252  43.32113 0.066741862
756      1   3 252  68.69734 0.084419564
1008     1   4 252  75.37267 0.006003969
1260     1   5 252  17.53583 0.083688727
1512     2   1 252 168.44656 0.035959492

这是我的(失败的)SQLite 尝试和错误。

# but I can't figure it out in SQLite
library(RSQLite)
library(RSQLite.extfuns)
db <- dbConnect(SQLite())
init_extensions(db)
[1] TRUE
dbWriteTable(db, name = "data_dly", value = data.dly)
[1] TRUE
temp <- dbGetQuery(db, "SELECT stdev(difference(log(p))) FROM data_dly GROUP BY gvkey, fyr ORDER BY gvkey, fyr, day")
Error in sqliteExecStatement(con, statement, bind.data) : 
  RS-DBI driver: (error in statement: wrong number of arguments to function difference())

difference() 是否需要逗号分隔的数字列表?我可以完全在 SQLite 中完成此操作吗?或者我需要用 R 来执行?谢谢!

最佳答案

尝试一下,其中 data.dly 是帖子中的数据框:

library(sqldf)
out <- sqldf("select A.gvkey, A.fyr, stdev(log(A.p) - log(B.p)) vol
    from `data.dly` A join `data.dly` B 
    where A.day = B.day + 1 
        and A.gvkey = B.gvkey 
        and A.fyr = B.fyr 
    group by A.gvkey, A.fyr")

这给出:

> head(out)
  gvkey fyr        vol
1     1   1 0.09312510
2     1   2 0.01905447
3     1   3 0.01651095
4     1   4 0.06962667
5     1   5 0.05243940
6     2   1 0.03039751

关于sqlite - 使用 RSQLite 查找通过 GROUP BY 定义的序列的一阶差分的标准差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6695673/

相关文章:

r - R 中的聚合命令,删除列?

r - 特定请求的版本号,盈透证券的IBrokers包

r - 如何使用现有的虚拟变量创建一个新虚拟变量,该变量对于组内的某些主要观察值采用值 1

linux - 如何在 Linux 中安全使用 wxsqlite3?

sqlite - sqlite和批处理文件

java - 为什么我在 Java/Android 中得到空 SQLite 字段的 "0.0"?

r - 将打印输出捕获为向量

mysql - 如何聚合 GROUP BY 查询中的非聚合值?

sql - 如何连接 PostgreSQL 'group by' 查询中字符串字段的字符串?

database - 存储很长的文本 : BLOB or TEXT