金融データソース紹介:Bank of Canada(カナダ銀行)

このページではBank of CanadaのデータをPython取得する方法を紹介します。取得のためにPythonライブラリのpandas-datareaderを使う方法とWebAPIから直接取得する方法を紹介します。

Bank of Canadaについて

Bank of Canada(カナダ銀行)はカナダの中央銀行です。1935年にカナダ銀行法に基づき、カナダ経済と金融の健全な発展を目的に設立されました。国内唯一の発行銀行としてカナダ銀行券の発行及びカナダドルの管理を行っています。

カナダ銀行は”Valet API”と呼ばれるWebAPIを公開しております。今回はこのWebAPIを利用してカナダ銀行のデータにアクセスしてみます。Valet APIを利用することで、為替レートや金融データを取得することができます。Valet APIに関する公式ドキュメントはこちらにございます。

Pythonを利用したデータ取得

ここからはカナダ銀行のデータをPythonを利用して取得してみます。

pandas-datareaderによる取得

pandas-datareaderについてはこちらに整理してますので必要に応じてご確認ください。

公式ドキュメントには、Bank Of Canadaについて以下のように紹介してあります。

上記の通り、使い方に関してはほとんど書かれていないです。”Note”に記載されてるようにBank of Canadaのページを参考にしながら各々で利用してもらう想定に感じます。

引数に関してみてみると、symbolsが取得したい対象データのコード、start, endに日付を指定すればその期間でデータが取れるといった感じのようです。その他の引数は、リクエストに関する調整用のもののようなのであまり気にしなくても良さそうです。

さっそく、pandas-datareaderを利用してBank Of Canadaのデータを取得してみます。
今回は為替レート(JPY/CAD)を取得してみます。

まず初めに、symbolsを特定します。
当方が確認した限りではWebページにはsymbolに関するページは見つけられませんでした。為替のデータであれば、こちらのページからCSV, JSON, XMLをダウンロードすることができ、そのファイル内にsymbolに関する情報がありました。ファイルを確認するのが面倒という方は、後ほどで紹介するAPIを活用ください。

ここからファイルをダウンロードし、必要なデータのIDを特定します。今回はcsvを確認しました。

"SERIES"
"id","label","description"
"FXAUDCAD","AUD/CAD","Australian dollar to Canadian dollar daily exchange rate"
"FXBRLCAD","BRL/CAD","Brazilian real to Canadian dollar daily exchange rate"
"FXCNYCAD","CNY/CAD","Chinese renminbi to Canadian dollar daily exchange rate"
"FXEURCAD","EUR/CAD","European euro to Canadian dollar daily exchange rate"
"FXHKDCAD","HKD/CAD","Hong Kong dollar to Canadian dollar daily exchange rate"
"FXINRCAD","INR/CAD","Indian rupee to Canadian dollar daily exchange rate"
"FXIDRCAD","IDR/CAD","Indonesian rupiah to Canadian dollar daily exchange rate"
"FXJPYCAD","JPY/CAD","Japanese yen to Canadian dollar daily exchange rate"
"FXMYRCAD","MYR/CAD","Malaysian ringgit to Canadian dollar daily exchange rate"
"FXMXNCAD","MXN/CAD","Mexican peso to Canadian dollar daily exchange rate"
"FXNZDCAD","NZD/CAD","New Zealand dollar to Canadian dollar daily exchange rate"
"FXNOKCAD","NOK/CAD","Norwegian krone to Canadian dollar daily exchange rate"
"FXPENCAD","PEN/CAD","Peruvian new sol to Canadian dollar daily exchange rate"
"FXRUBCAD","RUB/CAD","Russian ruble to Canadian dollar daily exchange rate"
"FXSARCAD","SAR/CAD","Saudi riyal to Canadian dollar daily exchange rate"
"FXSGDCAD","SGD/CAD","Singapore dollar to Canadian dollar daily exchange rate"
"FXZARCAD","ZAR/CAD","South African rand to Canadian dollar daily exchange rate"
"FXKRWCAD","KRW/CAD","South Korean won to Canadian dollar daily exchange rate"
"FXSEKCAD","SEK/CAD","Swedish krona to Canadian dollar daily exchange rate"
"FXCHFCAD","CHF/CAD","Swiss franc to Canadian dollar daily exchange rate"
"FXTWDCAD","TWD/CAD","Taiwanese dollar to Canadian dollar daily exchange rate"
"FXTHBCAD","THB/CAD","Thai baht to Canadian dollar daily exchange rate"
"FXTRYCAD","TRY/CAD","Turkish lira to Canadian dollar daily exchange rate"
"FXGBPCAD","GBP/CAD","UK pound sterling to Canadian dollar daily exchange rate"
"FXUSDCAD","USD/CAD","US dollar to Canadian dollar daily exchange rate"
"FXVNDCAD","VND/CAD","Vietnamese dong to Canadian dollar daily exchange rate"

為替に関しては上記が全貌だと思われます。ここからJPY/CADのIDはFXJPYCADであることがわかります。

symbolの特定ができたので、これを用いてpandas-datareaderからデータを取得してみます。

import pandas_datareader as pdr

# JPY/CADを取得してみる
data = pdr.bankofcanada.BankOfCanadaReader('FXJPYCAD')
display(data.read())

# 期間指定
# data = pdr.bankofcanada.BankOfCanadaReader(symbols='FXJPYCAD', start='2000/1/1', end='2023/3/31')
# display(data.read())

# 複数symbolの指定 => ValueError
# data = pdr.bankofcanada.BankOfCanadaReader(symbols=['FXJPYCAD', 'FXUSDCAD'], start='2023/1/1', end='2023/3/31')
# display(data.read())

上記のコードで問題なくデータを取得することができました。”symbols”という名前から複数のIDを指定した場合も動作すると思い確認してみましたが、複数指定には対応していないようです。

また、2000年から取得してみましたが、現時点では2017年以降のデータが取得できるようでした。

Web API (Valet API)からのデータ取得

こちらのドキュメントを参考にAPIを利用したデータ取得について試してみます。

Valet APIでは「ルートURL/パラメータ」をリクエストすることでデータを取得することができます。ルートURLはhttps://www.bankofcanada.ca/valetになります。

Valet APIでは、出力形式をJSON、XML、CSVを選択できます。デフォルトはJSON形式になっております。他の形式にしたい場合は、「ルートURL/パラメータ/csv」のようなフォーマットにすることで可能です。

取得可能データ一覧を取得する

Valet APIから入手できるデータ一覧を取得してみます。パラメータには、/lists/series/lists/groupを利用します。

まずは、/lists/seriesから確認してみる。

import requests
import pandas as pd

# APIで取得する際のルートURL
api_route = 'https://www.bankofcanada.ca/valet'

# 取得可能データ一覧
res = requests.get(f'{api_route}/lists/series')
data_list = res.json()

# pandas.DataFrameに整理
df_list = pd.DataFrame(data_list['series']).T

/lists/seriesには、現時点で10,108件のデータがあるようです。これらは時系列データに関するものです。

次に/lists/groupについて確認してみる。コードのseriesをgroupsに変えるだけなのでコードは省略します。

現時点で1,264件のデータがあるようす。これらのデータはレポート関連のものに見えます。

Seriesデータ

Seriesのデータを取得する方法について紹介します。
Valet APIでSeriesデータを取得する場合は、「ルートURL/observations/シリーズ名」を指定します。
実際にCAD/JPYのデータを取得してみます。

# 為替: CAD/JPYを取得する
res = requests.get(f"{api_route}/observations/FXJPYCAD/json")
# display(res.json())

# 直近の5日分を取得する
res = requests.get(f"{api_route}/observations/FXJPYCAD/json?recent=5")
# display(res.json())

# 複数の為替レートを取得することも可能
res = requests.get(f"{api_route}/observations/FXJPYCAD,FXUSDCAD/json?recent=5")
# display(res.json())

# 期間指定
res = requests.get(f"{api_route}/observations/FXJPYCAD/json?start_date=2023-04-01&end_date=2023-04-10")
# display(res.json())

パラメータにラベルだけを指定した場合は全期間のデータが取れます。
?rececentを使うと直近のデータを取得できます。?start_date?end_dateを使うことで期間指定をすることも可能のよです。また、”,”(カンマ)でlabelを区切ることで複数データも取得できます。

また、グループごとにデータを取得することも可能です。
リクエストには「ルートURL/observations/group/グループ名」を指定します。
ここでは、為替情報に関するデータを取得した例を示します。

# 為替情報をまとめて取得する
res = requests.get(f"{api_route}/observations/group/FX_RATES_DAILY/json?recent=2")
# display(res.json())

ここでは為替データを取得してみましたが、他にも債券、政策指標等とれるみたいです。

Groupデータについて

/lists/groupで取得したデータ一覧のデータについて確認してみます。

link = df_group['link'][0]
res = requests.get(link)
display(res.json())

res = requests.get(f"https://www.bankofcanada.ca/valet/series/SDP_PICL_20160630_01")
display(res.json())

各レポートのdiscription(概要)は取得ができるようです。自然言語処理を適用してみると何か得られるかもしれないですね。

今回の記事に関するNotebook

まとめ

今回はBank of Canada(カナダ銀行)のデータを取得する方法について整理しました。
pandas-datareaderを使えば手軽にデータを取得できます。しかし、複数symbolの同時取得ができなかったり、レポート情報を取得できませんでした。
一方でValet APIでは、複数symbolを同時取得やレポート情報(概要)が取得できました。また、データのシンボル一覧も取得できます。

以上からValet APIをメインで使い、サブでpandas-datareaderを使うくらいの温度感が良さそうに思いました。今回は為替データしか取得していません。債券や政策指標等のその他のデータについては各自で調べて活用いただければ幸いです。

コメント

タイトルとURLをコピーしました