如何通过Yahoo Finance获取货币汇率的历史数据?

14
我需要获得货币汇率的时间顺序的JSON或XML响应,例如从2015-01-07到2015-03-07。
使用这个答案,我们可以获取所选货币的最新汇率信息。 在这里,我们可以使用以下URL获取特定日期的货币汇率:http://finance.yahoo.com/connection/currency-converter-cache?date=20150307并解析所获得的JSON以获取特定货币的汇率。 但是我需要获取一段时间内的货币汇率,就像这里一样,但是以JSON或XML格式。 有办法做到这一点吗?

@Nico:如果你有兴趣,请看下面的答案。 - Frank
@Mortimer 没有答案存在。 - Alex
6个回答

13

使用YQL (https://developer.yahoo.com/yql/)

然后你可以通过像这样的查询检索所需的数据:

SELECT * 
FROM 
    yahoo.finance.historicaldata 
WHERE 
    symbol = "EUR=X" 
AND 
    startDate = "2009-09-11" 
AND 
    endDate = "2010-03-10"

点击此处


3
这也适用于货币,您可以通过单击我在答案中发布的链接进行查看。 - dym
我的错误,昨天我仅收到空数组。非常好的答案,也是获取历史数据的最佳方式。 - Asain Kujovic
询问 EURCHF=X 怎么样?只是将其作为符号放置会得到空输出……我是否遗漏了一些基础知识? - Rho Phi
@dym,您用哪个值来除以才能得到EUR/CHF?我需要从历史价格创建图表(以便在给定时间段内提供货币对表现的总体视图)。我不确定应该使用哪个值 - 投标、收盘、开盘、低点还是高点? - Jamie White
3
这个API已经关闭了,我想。而且给出的链接也无法使用。你能否建议一个替代YQL的方案? - Usman Liaqat
显示剩余8条评论

2
对于最简单的解决方案,您应该使用CurrencyFreaks API。它提供了179种货币的历史汇率,支持JSON和XML格式,并且兼容各种编程语言,如Shell、Node.js、Java、JS、Python、PHP、Ruby、C、C#、Go、Swift。
为了获取两个日期之间的历史汇率,它提供了一个时间序列端点
$ curl 'https://api.currencyfreaks.com/timeseries?apikey=YOUR_APIKEY&start_date=2016-01-07&end_date=2016-03-07&base=EUR&symbols=EUR,USD'

JSON响应将是:
{
    "start_date": "2016-01-07",
    "end_date": "2016-01-10",
    "base": "EUR",
    "rates": {
        "2016-01-07 00:00:00+00": {
            "EUR": "1.0",
            "USD": "1.0776"
        },
        "2016-01-08 00:00:00+00": {
            "EUR": "1.0",
            "USD": "1.0921"
        },
        "2016-01-09 00:00:00+00": {
            "EUR": "1.0",
            "USD": "1.0932"
        },
        "2016-01-10 00:00:00+00": {
            "EUR": "1.0",
            "USD": "1.0932"
        }
    }
}

获取特定日期的历史汇率,请使用历史汇率端点
希望这对您有用。

该网站现在只有在专业计划下才能获取历史数据。 - Damon Brodie

2

以下是将数据导入pandas DataFrame的解决方案。您可以使用诸如pandas.DataFrame.to_json之类的函数,从DataFrame导出JSON、XML等格式。

符号也可能与您使用的符号不同。

import pandas as pd
import pandas_datareader.data as web
from datetime import datetime

start = datetime(2016, 1, 1)
end = datetime(2017, 3, 31)
aud = web.DataReader('AUD=X', 'yahoo', start, end)

In [29]: aud.head(5)
Out[29]: 
              Open    High     Low   Close  Volume  Adj Close
Date                                                         
2016-01-01  1.3752  1.3752  1.3752  1.3752       0     1.3752
2016-01-04  1.3725  1.3950  1.3712  1.3723       0     1.3723
2016-01-05  1.3921  1.4017  1.3857  1.3916       0     1.3916
2016-01-06  1.3963  1.4168  1.3941  1.3961       0     1.3961
2016-01-07  1.4124  1.4322  1.4109  1.4124       0     1.4124

您需要安装pandas-datareader。(我假设您已经安装了pandas)。

sudo -H pip install pandas-datareader (ubuntu)
pip install pandas-datareader (windows)

与chart.finance.yahoo.com连接出现错误。可能该API已不再可用,被YQL替代。 - user39086

0

或者,您也可以使用currencyapi.com。它提供了全球150多种货币的历史汇率JSON数据,并且与所有主要编程语言兼容。

要检索两个日期之间的特定汇率,请使用以下URL:

https://api.currencyapi.com/v3/range?apikey={{ API_KEY }}&datetime_start=2023-01-01T00:00:00Z&datetime_end=2023-01-31T23:59:59Z

JSON响应将是:

{  
  "data": [
  {
    "datetime": "2023-01-01T23:59:59Z",
    "currencies": {
      "CAD": {
        "code": "CAD",
        "value": 1.353397
      },
      "EUR": {
        "code": "EUR",
        "value": 0.934186
      }
    }
  },
  {
    "datetime": "2023-01-02T23:59:59Z",
    "currencies": {
      "CAD": {
        "code": "CAD",
        "value": 1.356151
      },
      "EUR": {
        "code": "EUR",
        "value": 0.936562
      }
    }
  },
  {
    "datetime": "2023-01-03T23:59:59Z",
    "currencies": {
      "CAD": {
        "code": "CAD",
        "value": 1.367522
      },
      "EUR": {
        "code": "EUR",
        "value": 0.948182
      }
    }
  },
  {...},
  {...}
  ]
}

要仅检索一个特定日期,您也可以使用历史终点:https://currencyapi.com/docs/historical


0

Yahoo货币API已经停止使用。

有几个替代API提供货币转换数据。我建议的一个选择是SWOP货币汇率API,这是一个由开发人员为开发人员制作的快速、易于使用、可靠和透明的外汇汇率API。

完全声明:我是创建SWOP的开发人员之一 :)

  • SWOP API提供180多种货币的当前和历史汇率。它们直接从可信赖的来源(各种中央银行和其他重要银行)收集而来。
  • SWOP API有两个端点,GraphQL和REST/JSON,方便开发人员使用。
  • 有一个免费计划,允许每月1000个请求,还有更多请求和功能的付费计划。

0

雅虎API不再工作,但是还有其他的API以JSON格式提供货币数据。FXMarketAPI 是唯一一个提供Pandas兼容的API,以JSON格式提供历史数据。有一个 pandas 端点可以帮助您拉取数据。尽管对于免费用户有1000个请求的限制,您可以在下面看到一个示例。

URL = "https://fxmarketapi.com/apipandas"
params = {'currency' : 'EURUSD',
'start_date' : '2018-07-02',
'end_date':'2018-12-06',
'api_key':'**************'}

response = requests.get("https://fxmarketapi.com/apipandas", params=params)
df= pd.read_json(response.text)

请记得获取api_key并添加到上述请求中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接