【问题标题】:Convert data frame to time series suitable for auto.arima将数据帧转换为适合 auto.arima 的时间序列
【发布时间】:2016-04-08 03:50:48
【问题描述】:

我有以下数据框:

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 函数为起点来选择合适的型号。

我已经试过了:

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 的格式?我可能存在重复的值。

【问题讨论】:

    标签: r time-series zoo bitcoin quantitative-finance


    【解决方案1】:

    问题源于您传递给as.Dateformat 参数不正确。事实上,如果你曾经尝试将 character 转换为 Date 并得到一个包含所有 NAs 的向量,那么几乎可以肯定你没有正确指定 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 
    

    【讨论】:

    • 谢谢。请原谅我缺乏编程专业知识,但我将如何修改:Df &lt;- data.frame( Date = format(Sys.Date() - (729:0), "%d/%m/%y"), LogReturns = log(rgamma(730, .25)), stringsAsFactors = FALSE ' ) 以确保开始日期为 03/09/15(英国格式),我认为 (Sys.Date() - (729:0), 是关键? ——
    • 我提供的Df 对象只是任意样本数据;但是我用来将字符列转换为zoo 对象的方法应该同样适用于您的数据。如果在您的实际数据集中,您需要将开始时间截断为 2015 年 9 月 3 日,您可以执行ln_ret[index(ln_ret) &gt;= as.Date("2015-09-03")] 之类的操作。
    【解决方案2】:

    如果您只想将 ARIMA 模型拟合到日志返回数据,则无需担心正确的日期格式。也就是说,您知道 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]) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      相关资源
      最近更新 更多