yahoo!-excel 中的金融(或其他)历史数据

yahoo!-finance (or other) historic data in excel

在我看来,将 yahoo!-Finance 数据导入 excel 有两种可能性。第一个用于实时数据,第二个用于历史数据。

我需要历史数据。我目前的VBA-代码如下:

firstcolumn = 2
lastcolumn = 6


For n = firstcolumn To lastcolumn

Ticker = Worksheets(1).Cells(3, n).Value

  ActiveWorkbook.Worksheets.Add After:=Worksheets(Worksheets.Count)
      With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;http://ichart.finance.yahoo.com/table.csv?s=" & Ticker & "&d=" & Month(Date) & "&e=" & Day(Date) & "&f=" & Year(Date) & "&g=d&" _
        & "a=" & Month(Date) & "&b=" & Day(Date) & "&c=" & Year(Date) - 1 & "&ignore=.csv" _
        , Destination:=Range("$A"))
        .Name = "table.csv?s=BMW.DE&d=6&e=31&f=2012&g=d&a=0&b=1&c=2003&ignore="
        .FieldNames = True
        .RowNumbers = True
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlOverwriteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 850
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(5, 1, 1, 1, 1, 1, 1)
        .TextFileDecimalSeparator = "."
        .TextFileThousandsSeparator = ","
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False

    End With
ActiveSheet.Name = Ticker

MsgBox "status ende"

ActiveWorkbook.Connections("table.csv?s=" & Ticker & "&d=" & Month(Date) & "&e=" & Day(Date) & "&f=" & Year(Date) & "&g=d&a=" & Month(Date) & "&b=" _
   & "" & Day(Date) & "&c=" & Year(Date) - 1 & "&ignore=").Delete
ActiveSheet.QueryTables.Item(ActiveSheet.QueryTables.Count).Delete
ActiveSheet.ListObjects.Add(xlSrcRange, ActiveSheet.Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells(1, 7).End(xlDown)), , xlYes).Name = Ticker

'MsgBox "The data for " & Ticker & " were downloaded to a new sheet."
Next n

Exit Sub
ERR:
MsgBox "Error. Please check."

它遍历股票代码列表并创建一个新的 sheet 以股票代码为名称,下载的历史数据如下:

然后由我来提取相关的列、日期和收盘价,并将其复制到我在工作中需要它们的地方sheet。

我在网上找到了我使用的 VBA 代码,但我无法确定如何使它只显示数据和收盘价栏。据我所知,该代码不包含对 "open"、"high"、"low"、"close" 的任何查询,我可以排除这些查询以仅接收我想要的数据。我也看不到什么行 .名称 = "table.csv?s=BMW.DE&d=6&e=31&f=2012&g=d&a=0&b=1&c=2003&ignore=" 可能是因为这些日期没有反映在我的数据中。 最后,尽管我要求提供从今天到一年前的每日数据,但数据可以追溯到 2000 年 1 月 3 日。

总而言之,这种不灵活的方式是我发现获得必要数据的唯一方式。然而,我想要的是如下形式的内容:

即不同之处在于我可以调整我需要的数据(而不是所有的开盘价、高价、低价……),以及将它插入现有 sheet 的位置(而不是新的 [中的 $A$1 =42=]).

或者,如果有建议,我会使用任何其他数据库。 Excel的版本是2013。我看了Webservice函数,但是那个好像也只能获取当前数据,而不是历史数据。

我找到了一种使用 Webservice 功能的方法(并且很难做到)。

在 table 中,A 列包含日期值,C1 包含代码。单元格 C2 包含:

=WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C&"&a="&MONTH($A2)-1&"&b="&DAY($A2)&"&c="&YEAR($A2)&"&d="&MONTH($A2)-1&"&e="&DAY($A2)&"&f="&YEAR($A2)&"&g=d&ignore=.csv")

这将导入数据(如问题中所示),但在 .csv-format 中为一天。使用给定的单元格引用 $A2 表示日期,C$1 表示股票代码,可以将此公式向右拖动到更多公司,向下拖动到更多日期。

那么C2单元格的内容是:

"日期、开盘价、最高价、最低价、收盘价、成交量、调整收盘价 2016-01-07,153.15,154.95,151.55,153.75,2454400,138.63 "

接下来,单元格 C8 包含第十个逗号的位置,因为收盘价在字段 C2 中的第十个逗号之后开始:

=FIND("X";SUBSTITUTE(C2;",";"X";10))

接下来,单元格 C9 是第 10 个逗号后的剩余字符串。

=RIGHT(C2;LEN(C2)-C8)

接下来,C10 是 C9 中第一个逗号之前的所有内容:

=LEFT(C9;FIND(",";C9)-1)

接下来,C11是C10,用给定的小数点分隔符转换为十进制:

=NUMBERVALUE(C10;".")

最后,为了节省空间,我们可以按顺序组合所有这些函数并将其放入 C2 中以获得相同的结果。它看起来像这样 (C13):

=NUMBERVALUE(LEFT(RIGHT(WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C&"&a="&MONTH($A2)-1&"&b="&DAY($A2)&"&c="&YEAR($A2)&"&d="&MONTH($A2)-1&"&e="&DAY($A2)&"&f="&YEAR($A2)&"&g=d&ignore=.csv");LEN(WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C&"&a="&MONTH($A2)-1&"&b="&DAY($A2)&"&c="&YEAR($A2)&"&d="&MONTH($A2)-1&"&e="&DAY($A2)&"&f="&YEAR($A2)&"&g=d&ignore=.csv"))-FIND("X";SUBSTITUTE(C2;",";"X";10)));FIND(",";RIGHT(WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C&"&a="&MONTH($A2)-1&"&b="&DAY($A2)&"&c="&YEAR($A2)&"&d="&MONTH($A2)-1&"&e="&DAY($A2)&"&f="&YEAR($A2)&"&g=d&ignore=.csv");LEN(WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C&"&a="&MONTH($A2)-1&"&b="&DAY($A2)&"&c="&YEAR($A2)&"&d="&MONTH($A2)-1&"&e="&DAY($A2)&"&f="&YEAR($A2)&"&g=d&ignore=.csv"))-FIND("X";SUBSTITUTE(WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C&"&a="&MONTH($A2)-1&"&b="&DAY($A2)&"&c="&YEAR($A2)&"&d="&MONTH($A2)-1&"&e="&DAY($A2)&"&f="&YEAR($A2)&"&g=d&ignore=.csv");",";"X";10))))-1);".")

现在同样可以将其向右和向下拖动,以获取更多公司更多天的数据。

不过,如果有更优雅的解决方案,我会很高兴看到的!

如果您的问题是关于从 YF 获取实时报价和历史数据到 Excel,那么有一种比使用 vba 简单得多的方法,顺便说一下,由于截至 2017 年 11 月,YF 关闭了 api 服务。 您可以使用几乎免费的 Deriscope 插件将这些数据检索到 Excel。 免责声明:我是 Deriscope 的开发者。