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 的开发者。
在我看来,将 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 的开发者。