gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:45:53 27 4
gpt4 key购买 nike

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

这会生成一些数据。

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com