How to get historical data for currency exchange rates via Yahoo Finance?

Use YQL (https://developer.yahoo.com/yql/)

Then you can retrieve the data you need with a query like this:

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

Check here


Here's a solution to get your data into a pandas DataFrame. You can then export from the DataFrame to JSON, XML etc. using functions like pandas.DataFrame.to_json.

The symbols also may be different from the ones you are using.

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

You will need to install pandas-datareader. (I am assuming you already have pandas).

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

For the simplest solution, you should use CurrencyFreaks API. It provides historical exchange rates in JSON and XML formats for 179 currencies worldwide compatible with various programming languages such as Shell, Node.js, Java, JS, Python, PHP, Ruby, C, C#, Go, Swift

To get the historical rates between two dates, it provides a time-series endpoint.

$ curl 'https://api.currencyfreaks.com/timeseries?apikey=YOUR_APIKEY&start_date=2016-01-07&end_date=2016-03-07&base=EUR&symbols=EUR,USD'

The JSON response will be:

{
    "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"
        }
    }
}

To get the historical rates for a specific date, use the historical rates endpoint.

I hope it will useful for you.