将数据帧转换为适合 auto.arima 的时间序列
Convert data frame to time series suitable for auto.arima
我有以下数据框:
read.csv(file="CNY % returns.csv",head=TRUE,sep=",")
DATE LOG...RETURNS
1 03/09/13 -6.9106715
2 04/09/13 -6.9106715
3 05/09/13 -4.5839582
4 06/09/13 1.7554592
5 07/09/13 -0.8808549
6 08/09/13 4.1842420
DATE: obviosuly date; format dd/mm/yyyy.
LOG RETURNS: compounded returns from a bitcoin CNY exchange.
我希望使用 auto.arima
函数作为 select 合适模型的起点。
我已经试过了:
cnyX <- read.zoo(text=" DATE LOG...RETURNS
1 03/09/13 -6.9106715
2 04/09/13 -6.9106715
3 05/09/13 -4.5839582
4 06/09/13 1.7554592
5 07/09/13 -0.8808549
6 08/09/13 4.1842420")
index(cnyX) <- as.Date(as.character(index(cnyX)),format="%D%m%y")
这会产生:
<NA> <NA> <NA> <NA> <NA> <NA>
0.2144527 -9.2553228 -0.8519708 -4.2074340 14.0817672 1.2212485 ....
我意识到 as.character
分隔符不正确,但不确定应该如何修复或更正。我已经阅读了有关创建 XTS 和 TS 对象的信息,但也无法使它们起作用。我也提到过:Convert data frame with date column to timeseries 但发现这个不合适。
我应该如何将我的数据框转换为适合 auto.arima
的格式?我可能存在重复值。
问题源于您传递给 as.Date
的 format
参数不正确。事实上,如果您尝试将某些内容从 character
转换为 Date
,并且您得到了所有 NA
的矢量,那么您几乎可以肯定没有正确指定 format
。
这是一个可比较的数据集:
Df <- data.frame(
Date = format(Sys.Date() - (729:0), "%d/%m/%y"),
LogReturns = log(rgamma(730, .25)),
stringsAsFactors = FALSE
)
使用正确的 format
、
ln_ret <- zoo::zoo(Df[,2], as.Date(Df[,1], format = "%d/%m/%y"))
ln_ret[1:4]
#2014-01-05 2014-01-06 2014-01-07 2014-01-08
# -2.268443 -3.562711 -4.546391 -0.707788
这将适用于 auto.arima
:
forecast::auto.arima(ln_ret)
#Series: ln_ret
#ARIMA(0,0,0) with non-zero mean
#
#Coefficients:
# intercept
# -4.0742
#s.e. 0.1454
#
#sigma^2 estimated as 15.43: log likelihood=-2034.46
#AIC=4072.93 AICc=4072.94 BIC=4082.11
如果您只想将 ARIMA 模型拟合到 log-return 数据,则无需担心日期格式是否正确。也就是说,您知道 ts 何时开始和结束,如果最终需要的话,跟踪任何预测的日期是微不足道的。
这也行。
tt <- read.csv(file="CNY % returns.csv",head=TRUE,sep=",")
# assuming default options for orders p, d, q, etc
forecast::auto.arima(x=tt[,2])
我有以下数据框:
read.csv(file="CNY % returns.csv",head=TRUE,sep=",")
DATE LOG...RETURNS
1 03/09/13 -6.9106715
2 04/09/13 -6.9106715
3 05/09/13 -4.5839582
4 06/09/13 1.7554592
5 07/09/13 -0.8808549
6 08/09/13 4.1842420
DATE: obviosuly date; format dd/mm/yyyy.
LOG RETURNS: compounded returns from a bitcoin CNY exchange.
我希望使用 auto.arima
函数作为 select 合适模型的起点。
我已经试过了:
cnyX <- read.zoo(text=" DATE LOG...RETURNS
1 03/09/13 -6.9106715
2 04/09/13 -6.9106715
3 05/09/13 -4.5839582
4 06/09/13 1.7554592
5 07/09/13 -0.8808549
6 08/09/13 4.1842420")
index(cnyX) <- as.Date(as.character(index(cnyX)),format="%D%m%y")
这会产生:
<NA> <NA> <NA> <NA> <NA> <NA>
0.2144527 -9.2553228 -0.8519708 -4.2074340 14.0817672 1.2212485 ....
我意识到 as.character
分隔符不正确,但不确定应该如何修复或更正。我已经阅读了有关创建 XTS 和 TS 对象的信息,但也无法使它们起作用。我也提到过:Convert data frame with date column to timeseries 但发现这个不合适。
我应该如何将我的数据框转换为适合 auto.arima
的格式?我可能存在重复值。
问题源于您传递给 as.Date
的 format
参数不正确。事实上,如果您尝试将某些内容从 character
转换为 Date
,并且您得到了所有 NA
的矢量,那么您几乎可以肯定没有正确指定 format
。
这是一个可比较的数据集:
Df <- data.frame(
Date = format(Sys.Date() - (729:0), "%d/%m/%y"),
LogReturns = log(rgamma(730, .25)),
stringsAsFactors = FALSE
)
使用正确的 format
、
ln_ret <- zoo::zoo(Df[,2], as.Date(Df[,1], format = "%d/%m/%y"))
ln_ret[1:4]
#2014-01-05 2014-01-06 2014-01-07 2014-01-08
# -2.268443 -3.562711 -4.546391 -0.707788
这将适用于 auto.arima
:
forecast::auto.arima(ln_ret)
#Series: ln_ret
#ARIMA(0,0,0) with non-zero mean
#
#Coefficients:
# intercept
# -4.0742
#s.e. 0.1454
#
#sigma^2 estimated as 15.43: log likelihood=-2034.46
#AIC=4072.93 AICc=4072.94 BIC=4082.11
如果您只想将 ARIMA 模型拟合到 log-return 数据,则无需担心日期格式是否正确。也就是说,您知道 ts 何时开始和结束,如果最终需要的话,跟踪任何预测的日期是微不足道的。
这也行。
tt <- read.csv(file="CNY % returns.csv",head=TRUE,sep=",")
# assuming default options for orders p, d, q, etc
forecast::auto.arima(x=tt[,2])