В SQLite я хотел бы найти стандартное отклонение первых разностей (зарегистрированных) рядов, которые я определяю с помощью GROUP BY
. Мой поставщик данных предоставляет мне ежедневные ценовые ряды, но я хотел бы найти годовую волатильность в годовом исчислении (стандартное отклонение дневной доходности - первое отличие натурального логарифма ряда - за каждый год). Я могу перенести данные в R, затем использовать ddply()
, но я бы хотел сделать это полностью в SQLite. Я попробовал функцию difference()
из пакета RSQLite.extfunctions
, но мое использование неверно. Я ожидал, что он будет работать как 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? Спасибо!