akatak blog

プログラム初心者の50代ビジネスマンがセカンドキャリアを目指して働きながらPythonを中心に独学していましたが、昨年IT系企業に転職。新規事業開発の仕事をすることになりました。自らの覚え書きや成果物、感じたことなどを脈絡もなく書き連ねるブログです。

個人投資家のためのWebスクレイピング(5)〜 Pythonで「通貨インデックス」を作成してみよう

さて、個人投資家向けのスクレイピングシリーズが続いていますが、今回は、Webスクレイピングを利用して「通貨インデックス」を作成してみましょう。

日経ヴェリタス」の記事の中に、毎週連載されている「世界通貨番付」というものがあります。最近、身近に日経ヴェリタスがないので、「世界通貨番付」と同じように、各通貨が今強くなっているのか弱くなっているのか、通貨全体の中での強弱が分かるものが作れたらなと思っておりました。そうしないと、ドル円やユーロ円だけを見がちなので、全体感が掴めないからです。さらに、過去の推移も分かるともっといいですよね。

そこで、またまたまたPythonの出番です!

日経ヴェリタスを見てみると、「日経通貨インデックス 日本経済新聞社が算出する実効為替レートの指標。25通貨が対象。2008年=100」と記載されています。

どうやら実効為替レートを見れば良いみたい。

日銀のホームページによれば、実効為替レートとは、

実効為替レートは、特定の2通貨間の為替レートをみているだけでは捉えられない、相対的な通貨の実力を測るための総合的な指標です。具体的には、対象となる全ての通貨と日本円との間の2通貨間為替レートを、貿易額等で計った相対的な重要度でウエイト付けして集計・算出します。

とのことです。また、

最新の値は、国際決済銀行(Bank for International Settlements、BIS)公表の、Broadベースの実効為替レートを利用しています。同系列の作成方法やカバレッジ、ウエイト等の詳細については、BISのホームページを参照してください。

とありますので、早速、BISホームページに行ってみましょう。

https://www.bis.org/statistics/eer.htm

Daily data(更新は週次のようです)のCSVファイルがありますので、これを取得して展開していけば良いことが分かります。CSV horizontalとCSV verticalがありますが、時系列データなので縦に時系列データが蓄積されているCSV verticalを取得します。

import requests
import zipfile, io
import os

# BISホームページで実効為替レートが表示されているページのCSV verticalを指定します。
url = 'https://www.bis.org/statistics/full_webstats_eer_d_dataflow_csv_row.zip'

# requestsライブラリのgetメソッドを使って、ファイル情報をResponseオブジェクトとして取得
res = requests.get(url)
# Responseオブジェクトからバイナリデータを取り出し、ZipFileオブジェクトに変換し、解凍します。
z = zipfile.ZipFile(io.BytesIO(res.content))
z.extractall()

# 解凍して得られたcsvファイルを、BISフォルダの下に移動します。
os.rename('WEBSTATS_EER_D_DATAFLOW_csv_row.csv', 'BIS/WEBSTATS_EER_D_DATAFLOW_csv_row.csv')

その後は、PandasライブラリのDataFrameを使って、データを加工していきます。

import pandas as pd

# csvファイルを取り込み、DataFrameオブジェクトに転換します。その際に、余分な行をskipします。
df = pd.read_csv('BIS/WEBSTATS_EER_D_DATAFLOW_csv_row.csv', skiprows=[0,1,2,4])

# データのうち、日付データとBisがBroadデータと呼んでいる61通貨のヒストリカルデータのみ抽出
# そして、データがない行を削除したものをfx_broadとします。
fx_broad = df.iloc[:, :62].dropna()

この段階でfx_broadを表示させると以下の通り。

f:id:akatak:20180721122622p:plain

日付は現在Stringオブジェクトになっていますので、Datetimeオブジェクトに変換した上で、indexとして設定しましょう。 ついでにindex名をDateにしておきます。

df['Reference area'] = pd.to_datetime(df['Reference area'], format='%Y-%m-%d')
fx_broad.set_index(keys='Reference area', inplace=True)
fx_broad.index.name = 'Date'

現時点でのデータ系列は実効為替レートそのものなので、これをインデックス化します。世界通過番付における日経通貨インデックスが2008年を100としていますので、今回は2008-01-01が100となるように計算してみましょう。また、日経通貨インデックスが25通貨なので、同様に25通貨のDataFramefx_index_mainを作成します。

fx_index = fx_broad / fx_broad.loc['2008-01-01',:] * 100
main_fx_list = ['AE:United Arab Emirates','AU:Australia','BR:Brazil','CA:Canada','CH:Switzerland',
               'CN:China','DK:Denmark','GB:United Kingdom','HK:Hong Kong SAR',
               'ID:Indonesia','IN:India','JP:Japan','KR:Korea','MX:Mexico',
               'MY:Malaysia','NO:Norway','NZ:New Zealand','RU:Russia','SA:Saudi Arabia',
               'SE:Sweden','SG:Singapore','TH:Thailand','TW:Chinese Taipei',
                'US:United States','XM:Euro area']
fx_index_main = fx_index[main_fx_list]

さらに、pct_changeメソッドで週次、半年、2年、5年のインデックスの変化率を計算し、その結果を表示しましょう。

wk_chg = fx_index_main.pct_change(periods=5).iloc[-1]* 100
hy_chg = fx_index_main.pct_change(periods=130).iloc[-1] * 100
y2_chg = fx_index_main.pct_change(periods=520).iloc[-1] * 100
y5_chg = fx_index_main.pct_change(periods=1300).iloc[-1] * 100

table = pd.DataFrame([fx_index_main.iloc[-1], wk_chg, hy_chg, y2_chg, y5_chg], index=['FX_index', 'weekly-change', 'half-year-change', '2-year-change', '5-year-change'])
table_T = table.T.sort_values(by='weekly-change', ascending=False)

table_Tを表示すると
f:id:akatak:20180721133048p:plain

となります。日経通貨インデックスとは若干FX_indexの数値もその他変化率の数値も異なっていますが、全体感や方向感は良いようです。数値が異なっているのは、日経通貨インデックスが2008年=100(年平均値?)としているのに対し、ここでは2008年1月1日のデータを100としていることによるものかなぁと勝手に推測しています。

今後いろいろと修正が必要かと思いますが、取り敢えず「通貨インデックス」もどきが出来ました。

なお、変化幅を5年の変化率をもとにソートして、描画してみましたので、アップします。 また、今回利用したJupyter Notebookもアップしておきますね。

import matplotlib.pyplot as plt

plt.style.use('ggplot')
table_T.sort_values(by='5-year-change', ascending=True).drop('FX_index',axis=1).plot(kind='barh',fontsize=12, figsize=(8,20), colormap='viridis')

f:id:akatak:20180721133842p:plain

実効為替レートから「通貨インデックス」を作成する