【问题标题】:QuantMod: How do I get data in a tabular format?QuantMod:如何获取表格格式的数据?
【发布时间】:2020-07-16 17:01:12
【问题描述】:

我为 100 家公司创建了一个 for 循环,并绘制了布林带、成交量、商品通道指数、MACD 和相对强弱指数。对于我提到的所有指标,我如何将该表转换为表?

For循环脚本:

for (stock in ls(stockEnv)){
  chartSeries(stockEnv[[stock]], theme="white", name=stock,
              TA="addVo();addBBands();addCCI();addSMA(20, col='blue');
        addSMA(5, col='red');addMACD();addRSI();addROC()", subset='last 30 days')     
}

附上剧情。我要做的是将我拥有的其他 99 个股票代码的所有数据绑定在一起,以表格格式显示您在图像中看到的指标。

【问题讨论】:

  • stockEnv

标签: r dataframe xts quantmod


【解决方案1】:

我发现你的代码来自这个SO answer

我认为这种方法应该适合你。

library(quantmod)
library(data.table)
stockEnv <- new.env()
stocks <- c("AAPL","MSFT","FB")
getSymbols(stocks, src='yahoo', env=stockEnv)
datalist <- list()
for(stock in ls(stockEnv)){
table <- as.data.frame(stockEnv[[stock]])
date = rownames(table)
rownames(table) <- NULL
colnames(table) <- c("Open","High","Low","Close","Volume","Adjusted")
bound.table <- data.frame(Symbol = stock, date ,table)
datalist[[stock]] <-  bound.table
}
Result <- rbindlist(datalist,fill=TRUE)  
Result
#      Symbol       date      Open      High       Low     Close    Volume  Adjusted
#   1:   AAPL 2007-01-03  12.32714  12.36857  11.70000  11.97143 309579900  10.39169
#   2:   AAPL 2007-01-04  12.00714  12.27857  11.97429  12.23714 211815100  10.62234
#   3:   AAPL 2007-01-05  12.25286  12.31428  12.05714  12.15000 208685400  10.54669
#   4:   AAPL 2007-01-08  12.28000  12.36143  12.18286  12.21000 199276700  10.59878
#   5:   AAPL 2007-01-09  12.35000  13.28286  12.16429  13.22429 837324600  11.47922
#  ---                                                                              
#8652:   MSFT 2020-03-30 152.44000 160.60001 150.01000 160.23000  63420300 160.23000
#8653:   MSFT 2020-03-31 159.39999 164.78000 156.56000 157.71001  77927200 157.71001
#8654:   MSFT 2020-04-01 153.00000 157.75000 150.82001 152.11000  57969900 152.11000
#8655:   MSFT 2020-04-02 151.86000 155.48000 150.36000 155.26000  49630700 155.26000
#8656:   MSFT 2020-04-03 155.10001 157.38001 152.19000 153.83000  41212700 153.83000

这些代码行将添加布林带。

Result[,(c("dn","mavg","up","pctB")):= 
         apply(BBands(.SD),2,function(x){as.list(x)}),
       by = "Symbol",
       .SDcols = c("High","Low","Close")]

您还可以轻松添加任何其他TTR 函数结果。您只需要知道它接受作为输入的列以及它输出的列数。

对于 MACD:

Result[,(c("macd","signal")):= 
         apply(MACD(.SD,type="EMA"),2,function(x){as.list(x)}),
       by = "Symbol",
       .SDcols = c("Close")]

请注意,CCI 等单列输出存在细微差异。

因此,对于商品渠道指数。

Result[,(c("CCI")):= list(as.vector(CCI(.SD))),by = "Symbol", .SDcols = c("High","Low","Close")]

或相对强弱指数

Result[,(c("RSI")):= list(as.vector(RSI(.SD, maType="EMA"))),by = "Symbol", .SDcols = c("Close")]

请参阅所有其他 TTR 函数的帮助,例如 help(SMA)

【讨论】:

  • 所以这有效,但仅适用于 for 循环中的最后一个股票代码
  • 啊,成功了,非常感谢你。现在我看到我们有这 8 列,但是有什么方法可以从图中看到的布林带中提取数据,或者我可以自己在 R 或 SQL 中创建这些计算?
  • 不,这太棒了。再次感谢你。无法表达我的感激之情。我能否将您对 BBand 所做的相同逻辑应用于其他指标,例如 CCI、RSI、MACD 等?
  • 为窃听而道歉,但是我在 RSI 上苦苦挣扎,因为 RSI 公式使用了我理解的移动平均线。
  • 好的,我真的认为我们这次成功了。如果它不起作用,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多