quantmod - getQuote() 不适用于不同交易所的代码

quantmod - getQuote() not working for tickers on different exchanges

我正在经历 quantmod-getQuote() 以找到解决问题的方法 我正在 运行 进入 (link)

当我运行以下;

metrics <- yahooQF(c("Name", "Volume", "P/E Ratio", "Dividend Yield", "Shares Outstanding"))
symbols2 <- c("GOOG", "MSFT")
stats <- getQuote(symbols2, what = metrics)

我能够在 GOOGMSFT 上获得一些雅虎财务统计数据。但是,当我将符号 3888.HK 添加到列表中时,出现错误。

symbols2 <- c("GOOG", "MSFT", "3888.HK")
stats <- getQuote(symbols2, what = metrics)

错误信息:

Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : 
  arguments imply differing number of rows: 2, 3
In addition: Warning message:
In getQuote.yahoo(Symbols = c("GOOG", "MSFT", "3888.HK"), what = list( :
  symbols have different timezones; converting to local time

有人知道解决这个问题的方法吗,我似乎无法在 getQuote() 函数中找到要更改的内容。

我可能错了,但我认为错误发生是因为你有 2 个来自纳斯达克的柜台,但只有一个来自香港交易所的柜台(例如 "arguments imply differing number of rows" 错误)。

当我试图从纳斯达克获取两个柜台和从香港交易所获取两个柜台的财务信息时,问题得到解决:

metrics <- yahooQF(c("Name", "Volume", "P/E Ratio", "Dividend Yield", "Shares Outstanding"))
symbols2 <- c("GOOG", "MSFT", "0005.HK", "3888.HK")
stats <- getQuote(symbols2, what = metrics)

Warning message:
In getQuote.yahoo(Symbols = c("GOOG", "MSFT", "0005.HK", "3888.HK" :
  symbols have different timezones; converting to local time

stats
             Trade Time                  Name   Volume P/E Ratio Dividend Yield Shares Outstanding
GOOG    2018-09-20 04:00:01         Alphabet Inc.  1077192 50.576115             NA          349883008
MSFT    2018-09-20 04:00:01 Microsoft Corporation 18559784 52.441310    0.014839678         7668219904
0005.HK 2018-09-20 16:08:17         HSBC HOLDINGS 15168181 18.303152    0.007505519        19422699520
3888.HK 2018-09-20 16:08:17              KINGSOFT  5549058  4.991025    0.000952381         1365229952

另一种方法是您可以通过交换获得财务信息;您不必同时从您感兴趣的所有交易所获取所有柜台。也就是说,您可以执行以下操作:

US_symbols <- c("GOOG", "MSFT")
HK_symbols <- c("0005.HK", "3888.HK")

US_stats <- getQuote(US_symbols, what = metrics)
HK_stats <- getQuote(HK_symbols, what = metrics)

US_stats
          Trade Time                  Name  Volume P/E Ratio Dividend Yield Shares Outstanding
GOOG 2018-09-20 09:39:47         Alphabet Inc.   91776  50.93889             NA          349883008
MSFT 2018-09-20 09:40:07 Microsoft Corporation 1956869  52.62911     0.01504029         7668219904

HK_stats
             Trade Time          Name   Volume P/E Ratio Dividend Yield Shares Outstanding
0005.HK 2018-09-20 16:08:17 HSBC HOLDINGS 15168181 18.303152    0.007505519        19422699520
3888.HK 2018-09-20 16:08:17      KINGSOFT  5549058  4.991025    0.000952381         1365229952

问题不在于代码名称中的点。您实际上在函数中发现了一个错误。

如果你 运行 getQuote("3888.HK", what = metrics) 你会得到一个结果:

                 Trade Time     Name  Volume P/E Ratio Dividend Yield Shares Outstanding
3888.HK 2018-09-20 16:08:17 KINGSOFT 5549058  4.991025    0.000952381         1365229952

问题是时区不同。如果每个时区的代码不相等,您将收到错误消息。

这个有效:

symbols2 <- c("GOOG", "MSFT", "0005.HK", "3888.HK")
symbols2 <- c("GOOG", "MSFT", "0005.HK", "3888.HK", "FAGR.BR", "AGFB.BR")

这不是

symbols2 <- c("GOOG", "MSFT", "FB", "0005.HK", "3888.HK")
symbols2 <- c("GOOG", "MSFT", "0005.HK", "3888.HK", "FAGR.AB")

问题出在函数的这一部分:

 Qposix <- sapply(split(sq, sq$exchangeTimezoneName), convertTZ)

此 returns 是一个列表,而不是时区向量。如果每个证券交易所的股票数量不相等,您将收到此错误。调整它很简单,但需要更改 quantmod 包。我在 github 上开了一个 issue

目前的解决方法是 运行 每次交易都使用您的代码,而不是一次性处理一大堆代码。

编辑: 添加了 github 问题。