米国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)

コメント

このブログの人気の投稿

本家VTの代わりに楽天VT、雪だるま、オルカンを比較した覚書

さといもちゃんの本家VT一本積立投資の方針

本家VTと楽天VTと雪だるま(全世界株式)との比較