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

时间:2017-02-01 08:50:26

标签: excel vba yahoo-finance

我看到它的方式,有两种可能性让雅虎!-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函数,但这似乎只能获取当前数据,而不是历史数据。

2 个答案:

答案 0 :(得分: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);".")

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

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

答案 1 :(得分:0)

如果您的问题是要从YF将实时报价和历史数据导入Excel,那么有一种比使用vba更为简单的方法,这种方式很可能由于YF自11月起已关闭其api服务而无法使用2017。 您可以使用几乎免费的Deriscope外接程序,将这些数据检索到Excel中。 免责声明:我是Deriscope的开发人员。