【问题标题】:yahoo!-finance (or other) historic data in excelyahoo!-excel 中的财务(或其他)历史数据
【发布时间】:2017-06-17 22:39:02
【问题描述】:

在我看来,将 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$1"))
        .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."

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

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

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

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

即不同之处在于我可以调整我需要的数据(而不是所有的开盘价、最高价、最低价……),以及将其插入现有工作表的位置(而不是在新工作表中插入 1 美元)。

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

【问题讨论】:

    标签: excel vba yahoo-finance


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      =WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C$1&"&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 格式。使用给定的单元格引用 $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$1&"&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$1&"&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$1&"&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$1&"&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$1&"&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);".")
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-29
        • 2017-10-28
        • 2012-12-05
        • 1970-01-01
        • 1970-01-01
        • 2017-09-18
        • 2015-10-19
        • 1970-01-01
        相关资源
        最近更新 更多