1

由于从 yahoo Finance 更改为不再支持自动下载,我检查了其他来源并且 www.alphavantage.co 似乎符合我的要求。但是,数据没有到达 excel。有人已经编程了吗?我使用的测试链接是https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol=MSFT&apikey=demo&datatype=csv。在浏览器中打开数据时,它会将数据下载到 csv 文件中,但 excel 中没有数据。

非常感谢,扬

4

1 回答 1

2

在 VBA 中,选择工具 > 参考并选择以下参考:

  • 微软脚本控制 1.0
  • Microsoft 脚本运行时

以下函数将检索特定交易品种的最新数据(开盘价、最高价、最低价、收盘价和成交量):

Public Function GetLastCloseData(symbol As String) As Dictionary
    Dim scriptControl As Object
    Dim json As Object
    Dim time_series As Object
    Dim date_data As Object
    Dim date_label As String
    Dim date_offset As Integer

    Set scriptControl = CreateObject("MSScriptControl.ScriptControl")
    scriptControl.Language = "JScript"

    'Retrieve historical price data in JSON format
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=" & symbol & "&apikey=" & API_KEY, False
        .send
        Set json = scriptControl.Eval("(" + .responseText + ")")
        .abort
    End With

    'CallByName returns an error if it cannot find the requested selection.
    'The code is written to skip over those errors.
    On Error Resume Next

    Set time_series = CallByName(json, "Time Series (Daily)", VbGet)

    'If time series property was found...
    If Not time_series Is Nothing Then
        date_offset = 0
        'Retrieve the most recent closing price by looking for todays date. If it's not found,
        'iterate through the last week of dates, stopping whenever the most recent is found.
        While date_data Is Nothing And date_offset < 8
            date_label = Format(DateAdd("d", -date_offset, Date), "yyyy-mm-dd")
            Set date_data = CallByName(time_series, date_label, VbGet)
            date_offset = date_offset + 1
        Wend
    End If

    If Not date_data Is Nothing Then
        Set GetLastCloseData = New Dictionary
        With GetLastCloseData
            .Add "Open", CDbl(CallByName(date_data, "1. open", VbGet))
            .Add "High", CDbl(CallByName(date_data, "2. high", VbGet))
            .Add "Low", CDbl(CallByName(date_data, "3. low", VbGet))
            .Add "Close", CDbl(CallByName(date_data, "4. close", VbGet))
            .Add "Volume", CLng(CallByName(date_data, "5. volume", VbGet))
        End With
    End If

    'set error handling back to normal
    On Error GoTo 0

End Function

以下 Sub 演示了如何使用结果:

Public Sub GetStockData()
    Dim daily_data As Dictionary

    Set daily_data = GetLastCloseData("SPY")
    Debug.Print daily_data("Open")
    Debug.Print daily_data("High")
    Debug.Print daily_data("Low")
    Debug.Print daily_data("Close")
    Debug.Print daily_data("Volume")
End Sub

输出:

260 
260.15 
259.57 
259.76 
45033392 
于 2017-11-24T03:24:14.730 回答