これまで当ブログで紹介した手法をアレンジして米国の株価データに適用してみようとしたところ、Python実行に用いているJupyter Labのカーネルが落ちるというトラブルに見舞われました。
これはどうやらデータが利用できない銘柄についてデータを取りに行ったときに起こるものだということが推察されましたが、解決策がなかなか見つからず、いろいろ調べた結果、なんとか解決しました。以下ではその解決策について記述します。
まずいつものように必要なライブラリをインポートします。
import numpy as np from datetime import datetime import pandas as pd import yfinance as yf from datetime import datetime, timedelta from pandas_datareader import data as pdr
次に、"S&P 500 Companies with Financial Information"というサイトからS&P500の銘柄リスト(CSV形式)をダウンロードして、それを読み込み、(一例として)ヘルスケア業界のみに絞り込みます。
df_tickers = pd.read_csv('constituents.csv') df_healthcare = df_tickers[df_tickers['Sector'] == 'Health Care'] df_healthcare.head()
次に、上記で作成したデータフレームから銘柄コードのリストを作成し、そのリストの銘柄についてYahoo! Financeからデータを取得します。ここでは取得データフレームが空の場合の処理をしています。これにより、当該銘柄のデータが存在しない場合のトラブルは回避できるようです。
# 抽出する銘柄リストと抽出期間を指定 symbols = df_healthcare['Symbol'].tolist() start = datetime(2023,10,1) end = datetime(2023,10,31) # Yahoo! Financeからデータを取得 df0 = pd.DataFrame() for symbol in symbols: yf.pdr_override() df1 = pdr.get_data_yahoo(symbol, start, end) df1['ticker'] = symbol # 取得したデータフレームが空の場合の処理 if df1.empty: print(symbol + " data is empty") else: df1['close'] = df1['Adj Close'] df0 = pd.concat([df0, df1], axis=0) df0.head()