米国Yahoo Financeからのデータ取得の覚書2
本記事は自分用の備忘です。
私はVTという米国ETFの積立投資を続けています。その運用状況を把握するため、米国Yahoo FinanceからVT価格や為替の時系列データを取得する必要がありました。当時の概要は以下の記事参照。
参考: 米国Yahoo Financeから米国ETFの時系列データをPythonにより取得する一方法の覚書
最近、円建に変換したVTの分配金額を調べる機会がありました。
その際、以前書いた汚いコードを少し見直しました。米国Yahoo Financeからデータを取得する機能をクラス化しました。また、流用が多いので、自作外部モジュールとして利用するようになりました。コードは文末に載せます。
このモジュールはFundというクラスを利用してデータを取得します。コンストラクタで時系列データも分配金データも取得してしまいます。
インスタンス生成時の第一引数はETFのコード、第二引数と第三引数はデータ取得期間の最初と最初の日のタイムスタンプです。以下の例では、JPY=XとVTの各データが取得できる最初の日のタイムスタンプです。VTI、VOO、QQQ、VYMの例も文末コード内に記載しています。
インスタンスに対して、例えばjpyx.dataで終値の時系列データを、vt.divで分配金データを取得できます。
類似の作業する人も楽になるのではないかと。
ただ、米国Yahoo Financeの分配金の日付がEx-dividends dateだけでなのですよね。欲を言えば、Payable dateも併記されていると、ありがたいのですが。
使用例
from yahoofinance import Fund # 自作モジュールよりクラスを読込
import pandas as pd
import datetime
# 本日UNIXタイムスタンプ
UTS_NOW = str(int(datetime.datetime.now().timestamp() ) )
jpyx = Fund('JPY=X', '846633600', UTS_NOW)
vt = Fund('VT', '1214438400', UTS_NOW)
data = pd.merge(vt.div, jpyx.data, on = '年月日', how = 'inner')
data['年'] = data['年月日'].dt.strftime('%Y')
data['月'] = data['年月日'].dt.strftime('%m')
data['円建VT分配金'] = data['VT分配金'] * data['JPY=X終値']
data = data[ ['年月日', '年', '月', 'VT分配金', 'JPY=X終値', '円建VT分配金'] ]
data
米国Yahoo Financeのデータを元に円建のVTの分配金を計算した例です。ドル建で増減率を聞いても、自分の肌感覚とかなり違うので気になっていました。
自作モジュール
面倒でしたら、『yahoofinance.py』というファイル名で作業フォルダに保存し、上述コードのようにインポートして使用してもらえばよいかと思います。
# ファイル名 yahoofinance.py
import pandas as pd
import numpy as np
import urllib.request
import datetime
# 関数定義: Yahoo Financeのデータ取得
def get_yf_data(url):
flag = True
while flag:
try:
with urllib.request.urlopen(url) as response:
data = pd.read_csv(response)
flag = False
except urllib.error.URLError as e:
print(e)
print('urllib.error.URLError: ' + url)
except Exception as e:
print(e)
print('Exception: ' + url)
data['Date'] = pd.to_datetime(data['Date'], format='%Y-%m-%d')
data = data.dropna().reset_index(drop=True)
return data
# クラス定義
class Fund:
# コンストラクタ
def __init__(self, symbol, start, end):
self.symbol = symbol
self.start = start
self.end = end
# 価格データ取得
self.url = 'https://query1.finance.yahoo.com/v7/finance/download/' \
+ self.symbol + '?period1=' + self.start + '&period2=' + self.end \
+ '&interval=1d&events=history&includeAdjustedClose=true'
self.raw_data = get_yf_data(self.url)
temp = self.raw_data.rename(columns = {'Date': '年月日', 'Close': self.symbol + '終値'} )
self.data = temp[ ['年月日', self.symbol + '終値'] ]
# 分配金データ取得
self.div_url = self.url.replace('history', 'div')
temp = get_yf_data(self.div_url)
temp = temp.rename(columns = {'Date': '年月日', 'Dividends': self.symbol + '分配金'} )
self.div = temp
# テストコード(代表用途)
if __name__ == '__main__':
# 本日UNIXタイムスタンプ
UTS_NOW = str(int(datetime.datetime.now().timestamp() ) )
jpyx = Fund('JPY=X', '846633600', UTS_NOW)
vt = Fund('VT', '1214438400', UTS_NOW)
vti = Fund('VTI', '992563200', UTS_NOW)
voo = Fund('VOO', '1283990400', UTS_NOW)
qqq = Fund('QQQ', '1230854400', UTS_NOW)
vym = Fund('VYM', '1163635200', UTS_NOW)
print('jpyx.url')
print(jpyx.url)
print('vt.raw_data')
print(vt.raw_data)
print('vti.symbol')
print(vti.symbol)
print('voo.data')
print(voo.data)
print('qqq.start')
print(qqq.start)
print('vym.div')
print(vym.div)
コメント
コメントを投稿