【问题标题】:Loop function & quantmod循环函数 & quantmod
【发布时间】:2017-02-07 19:00:46
【问题描述】:

社区,这是我的代码。它运行时没有错误或警告。 顺便说一句,如果您查看 x.df(最终数据库),SMA 和布林带列有问题。 它们都是“NA”填充的。然后,BBands 在合并后删除了一些列。 怎么了?

library(quantmod) 
stockData <- new.env() #Make a new environment for quantmod to store data in
tickers <- c("AAPL","GOOG","YHOO","FB") # choose Symbols
start_date <- as.Date("2014-01-01") #Set start date
getSymbols(tickers, src="yahoo", env=stockData, from=start_date) # get data
x <- list() 

# loop on tickers
for (i in 1:length(tickers)) {
x[[i]] <- get(tickers[i], pos=stockData)   # get data from stockData environment  
colnames(x[[i]]) <- c("Open", "High", "Low", "Close","Volume", "Adjusted")  # rename Header for all tables in list
x[[i]]$gl <-((Cl(x[[i]])-Op(x[[i]]))/Op(x[[i]]))*100   # Daily gain loss percentage
SMA.n10 <- SMA(x[[i]][,4],n = 10)  # Calculate moving averages (MA) on "Close Price" <-column(4)
BBands<- BBands(x[[i]][,2:4])
x[[i]]$Symbol<- 0   # create "0" vector for Symbol name
x[[i]]$Symbol<- tickers[[i]]  # add Symbol name
x[[i]]<-data.frame(x[[i]],SMA.n10[[i]],BBands[[i]])  # merge data
}
x.df<- do.call(rbind, x) # call rbind to merge all xts objs in a single dataframe

谢谢

编辑: 我的目标是获得具有以下列的单个数据框 (x.df):

“开盘”、“高”、“低”、“收盘”、“成交量”、“调整”、符号、“SMA10”、“dn”、“mavg”、“上”、“pctB”。

但是,如果您运行代码,您可以在 SMA 列上看到 NA 值。 然后没有关于“dn”、“mavg”、“up”、“pctB”(布林带值)的痕迹。

【问题讨论】:

  • 描述更多...

标签: r loops quantmod


【解决方案1】:

这更正了您代码中的一些错误:

x <- list() 

# loop on tickers
for (i in 1:length(tickers)) {
    x[[i]] <- get(tickers[i], pos=stockData)   # get data from stockData environment  
    colnames(x[[i]]) <- c("Open", "High", "Low", "Close","Volume", "Adjusted")  # rename Header for all tables in list
    x[[i]]$gl <-((Cl(x[[i]])-Op(x[[i]]))/Op(x[[i]]))*100   # Daily gain loss percentage
    SMA.n10 <- SMA(x[[i]][,4],n = 10)  # Calculate moving averages (MA) on "Close Price" <-column(4)
    BBands<- BBands(x[[i]][,2:4])
    x[[i]]$Symbol<- 0   # create "0" vector for Symbol name
    x[[i]]$Symbol<- tickers[i]  # add Symbol name
    x[[i]]<-data.frame(x[[i]], coredata(SMA.n10), coredata(BBands))  # merge data
}
x.df<- do.call(rbind, x) # call rbind to merge all xts objs in a single dataframe

您应该了解使用[][[]] 的子集向量、列表、数据帧之间的区别。我推荐此资源以了解更多信息:http://adv-r.had.co.nz/Subsetting.html

coredata(SMA.n10) 返回值的底层矩阵,如果NROW(SMA.n10) == NROW(x[[i]])SMA.n10[[i]] 返回NA 则按预期工作,并且在R 中使用回收规则将在data.frame(.....) 中创建一列NA 值,不是你所期望的。

如果您想在x.df 中包含正确的“时间/日期”列(使用x.df 的行名来保存时间,就像您在代码,当您跨符号绑定数据时会给出无意义的值):

x <- list() 

# loop on tickers
for (i in 1:length(tickers)) {
    tmp <- get(tickers[i], pos=stockData)   # get data from stockData environment  
    colnames(tmp) <- c("Open", "High", "Low", "Close","Volume", "Adjusted")  # rename Header for all tables in list
    tmp$gl <-((Cl(tmp)-Op(tmp))/Op(tmp))*100   # Daily gain loss percentage
    SMA.n10 <- SMA(tmp[,4],n = 10)  # Calculate moving averages (MA) on "Close Price" <-column(4)
    BBands<- BBands(tmp[,2:4])
    tmp <- merge(tmp, SMA.n10, BBands)

    x[[i]]<-data.frame("time" = index(tmp), coredata(tmp), "Symbol" = tickers[i])  # merge data

}
x.df<- do.call(rbind, x) # call rbind to merge all xts objs in a single dataframe

【讨论】:

  • 感谢 FXQuantTrader 分享知识。我从你的链接中学到了很多东西。你的帖子让事情更清楚了。
猜你喜欢
  • 2016-03-28
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多