【问题标题】:Add an ROC column to multiple xts files in r在 r 中向多个 xts 文件添加 ROC 列
【发布时间】:2019-12-31 00:15:28
【问题描述】:

我有几个带有股市数据的xts 对象。我正在尝试从 TTR 包中添加变化率 (ROC),但我想编写一个函数来做到这一点。

它以“冗长”的方式工作,但不知何故,该函数无法解决问题:

#Loading the data
library(xts)
library(quantmod)
library(ggplot2)
library(tidyquant)
library(Hmisc)
library(PerformanceAnalytics)
library(TTR)

StartDate <- "2017-01-01"

# Get data from yahoo finance

symbolsYahoo <- c("^FTSE", "^GDAXI")

loadSymbols(Symbols = symbolsYahoo, from = StartDate, periodicity = "daily" )


#verbose way
GDAXI$GDAXI.ROC <- na.locf(ROC(Cl(GDAXI)))

#function
rocFun <- function(x){
  x <- merge(x, na.locf(ROC(Cl(x))))
}

rocFun(GDAXI)

我尝试了其他几种编写该函数的方法,但都没有添加列。 你能帮忙吗?

【问题讨论】:

  • Cl 是做什么的?
  • @Gautam Cl 确保根据收盘价计算变化率。
  • 如果GDAXI$GDAXI.ROC &lt;- na.locf(ROC(Cl(GDAXI))) 有效,我希望rocFun &lt;- function(x){ x$ROC &lt;- na.locf(ROC(Cl(x))); return(x) } 有效。
  • @Gregor 我也是这么认为的,return(x) 也在控制台中输出数据,但是当我之后查看 xts 对象时,该列丢失了
  • 就像任何其他 R 函数一样,您需要分配结果来修改对象。如果你有x = 1,那么x + 2将打印3,但x仍然是1。如果你想修改x,你做x = x + 2,现在x是3。如果你想修改你的GDAXI对象GDAXI = rocFun(GDAXI)

标签: r function xts


【解决方案1】:

在不太了解xts 对象的情况下,这里有一个hacky 方法。我敢肯定有更优雅的方式来实现这一点:

library(xts)

GDAXI <- sample.xts

func1 <- function(df){
  k <- as.data.frame(z)
  k$ROC <- ROC(k$Close)
  return(k)
}

func2 <- function(xts_object, col = 4){
  names_initial <- names(xts_object)
  k <- ROC(xts_object[, col])
  ret <- merge(xts_object, k)
  names_new <- c(names_initial, 'ROC')
  names(ret) <- names_new
  return(ret)
}

func1xts 对象转换为data.frame 并添加一列,而func2 使用merge 添加ROC 列而不更改类。输出如下:

> str(func1(GDAXI))
'data.frame':   180 obs. of  5 variables:
 $ Open : num  50 50.2 50.4 50.4 50.2 ...
 $ High : num  50.1 50.4 50.4 50.4 50.2 ...
 $ Low  : num  50 50.2 50.3 50.2 50.1 ...
 $ Close: num  50.1 50.4 50.3 50.3 50.2 ...
 $ ROC  : num  NA 5.57e-03 -1.30e-03 4.45e-05 -3.05e-03 ...

> str(func2(GDAXI))
An ‘xts’ object on 2007-01-02/2007-06-30 containing:
  Data: num [1:180, 1:5] 50 50.2 50.4 50.4 50.2 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:5] "Open" "High" "Low" "Close" ...
  Indexed by objects of class: [POSIXct,POSIXt] TZ: 
  xts Attributes:  
List of 1
 $ descr: chr "my new xts object"

> head(func2(GDAXI))
               Open     High      Low    Close           ROC
2007-01-02 50.03978 50.11778 49.95041 50.11778            NA
2007-01-03 50.23050 50.42188 50.23050 50.39767  5.569091e-03
2007-01-04 50.42096 50.42096 50.26414 50.33236 -1.296719e-03
2007-01-05 50.37347 50.37347 50.22103 50.33459  4.445937e-05
2007-01-06 50.24433 50.24433 50.11121 50.18112 -3.053731e-03
2007-01-07 50.13211 50.21561 49.99185 49.99185 -3.778799e-03

您可以使用 lapply('GDAXI', function(z){...}) 循环遍历股票名称的向量,而不是传递单个 xts 对象。

【讨论】:

  • 谢谢。会试试看。
  • 是的,它确实有效。谢谢你。很抱歉花了这么长时间。
猜你喜欢
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多