
Pythonでサクッと株価データをゲットする方法
Pythonを使って株価分析をしてみたい方向けの記事になります。
Pandas Datareaderというライブラリーを使って
サクッと株価データをゲットする方法をご紹介します。
Googleコラボラトリーで実装していきますので、
環境構築不要で
超簡単にゲットできます!!
✅ Pandas Datareaderってどんなライブラリー?
Pandas Datareaderは、
株価、為替レート、経済指標などのデータを簡単に取得し、
PandasのDataFrame形式で扱うことができるライブラリーです。
データソースとして、
Stooq、
Yahoo ファイナンス,
Google ファナンス,
Quandl
などをサポートしています。
この記事では、
データソースとして、
StooqとYahooファイナンスを使っていきます。
📈"Stooq"でゲットしよう
TOPIX(東証株価指数)の1年分の株価を取得します。
TOPIXは後から説明するYahooファイナスでは取得できないようです。
1️⃣必要なライブラリーをインポートします
import pandas_datareader.data as web
from datetime import date
import pandas as pd
2️⃣データソース、取得期間、株価ティッカーコードの指定をします。
データソースは、"Stooq"
取得期間は、2023年4月1日〜2024年3月29日
取得する株価は、TOPIX(ティッカー:^TPX)とします。
# データソース
source = 'stooq'
# 取得期間
dt_s = date(2023, 4 1)
dt_e = date(2024, 3, 29)
# 株価ティッカー
symbol = '^TPX'
個別株式をゲットしたい場合は、
株価ティッカーを"証券コード.JP"で指定します。
証券コードが9021なら
symbol = "9021.JP"とします
3️⃣DataReaderに引数を与えて実行します。
実行結果をデータフレームで取得します。
df_topix = web.DataReader(symbol, source, dt_s, dt_e)
df_topix = df_topix.sort_values("Date").reset_index()
df_topix
実行結果
TOPIXの値動きが取得できていますね。

Stooqは、株式が分割・併合された場合、価格への反映に時間がかかるようなので注意が必要です。
Yahoo!ファイナンスは調整前、調整後の株価を持っているので、その心配はありません。
📈 "Yahooファイナンス"でゲットしよう
日経平均株価の1年分の株価を取得します。
1️⃣ライブラリーのインポートと、データソースのインスタンス化をします
import yfinance as yf
yf.pdr_override()
2️⃣取得期間、ティッカーの指定をします。
取得期間は、2021年4月1日〜2024年3月29日
取得する株価は、日経平均株価(ティッカー:^N225)とします。
# 取得期間
dt_s = date(2023, 4, 1)
dt_e = date(2024, 3, 30) #エンドは最終日+1日
# 株価ティッカー
ticker = '^N225'
個別株式をゲットしたい場合は、
株価ティッカーを"証券コード.T"で指定します。
証券コードが9021なら
ticker = "9021.T"とします
3️⃣DataReaderに引数を与えて実行します。
実行結果をデータフレームで取得します。
df = web.get_data_yahoo(tickers=ticker,start=dt_s,end=dt_e).reset_index()
df
実行結果
Yahooファイナンスの場合、
Adj Closeというカラムがあります。
これは、株価の分割・併合があった場合の
調整後株価になります。
基本的にはこのAdj Closeを使うと良いでしょう

🌈 複数銘柄の株価情報をまとめてゲットしよう
ここまでは1銘柄の株価を取得してきましたが、
最後に、複数銘柄の株価をまとめて取得してみましょう。
Yahooファイナンスを使います。
▶️▶️証券コードのファイル
以下のファイルは、東証プライム市場に上場している銘柄の証券コード(Code)と企業名(CompanyName)が格納されたCSVファイルです。
このCSVファイルに格納されている企業の
株価を取得していきます。
1️⃣CSVファイルの読み込み&codeリストの作成
まず、CSVファイルを読み込み、
codeというリストに証券コードを格納します。
df_code = pd.read_csv("/content/prime_code.csv")
code = df_code["Code"].tolist()
code
2️⃣取得開始日と終了日を設定したうえで、以下のコードを実行します
from tqdm import tqdm
# 開始日と終了日を設定
dt_s = date(2023,4,1)
dt_e = date(2024,3,30) #エンドは最終日+1日
# 株価データを格納するDataFrameを作成
stock_data = pd.DataFrame()
# 各銘柄について株価データを取得し、DataFrameに追加
for c in tqdm(code):
try:
data = web.get_data_yahoo(f"{c}.T",start=dt_s,end=dt_e).reset_index()
stock_data["Date"] = data["Date"]
stock_data[c] = data[["Adj Close"]]
except Exception as e:
print(e)
銘柄によっては上場廃止等によりデータを取得できない場合があります。
この場合、エラーで止まってしまうので、それを避けるために例外処理を入れます。
#欠損データは削除します
stock_data.dropna(axis=1,inplace=True)
stock_data
実行結果
1,646銘柄の株価が取得できました。

🎉Stooqで取得したTOPIXデータとマージしてみます
stock_data = pd.merge(
stock_data,
df_topix[["Date","Close"]],
how="left",
on="Date"
)
stock_data = stock_data.rename(columns={"Close":"TOPIX"})
stock_data
TOPIXとマージできましたね

🎁おまけ 為替情報をゲットする
Yahooファイナンスなら
米ドル円などの為替情報も簡単にゲットできます
1996年11月からの
米ドル円の月足データを取得してみました。
1996年11月が遡れる限界のようです。
ティッカーは、"USDJPY=X"を指定します。
get_data_yahooの引数として、interval="1mo"を指定します。
# 取得期間
dt_s = date(1996, 11, 1)
dt_e = date(2024, 3, 30) #エンドは最終日+1日
ticker = "USDJPY=X"
df = web.get_data_yahoo(tickers=ticker,start=dt_s,end=dt_e,interval='1mo').reset_index()
df
インターバルとして、
1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 1d, 5d, 1wk, 1mo, 3mo
をサポートしています。
出力結果
ちゃんとゲットできていますね

さいごに
Pythonを最大限活用して、
良き投資ライフを!!
いいなと思ったら応援しよう!
