雅虎! - excel中的财务(或其他)历史数据

问题描述 投票:0回答:2

我看到它的方式,有两种可能性来获得雅虎!-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."

其中列出了股票代码清单,并创建了一个新的工作表,并以股票的股票代码作为名称,下载的历史数据如下:

enter image description here

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

我找到了我在线使用的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 =”可能适用,因为这些日期没有反映在我的数据中。最后,即使我要求从今天到一年前的每日数据,数据仍会追溯到3.1.2000。

总而言之,这种不灵活的方式是我发现获得必要数据的唯一途径。但是,我想要的是以下形式:

enter image description here

即不同之处在于我可以调整我需要的数据(而不是全部打开,高,低......),以及将其插入现有工作表的位置(而不是新工作表中的$ A $ 1)。

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

excel vba yahoo-finance
2个回答
1
投票

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

enter image description here

在表中,列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);".")

现在,这可以同样向右和向下拖动,以便在更多天内为更多公司获取数据。

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.