【Python, pandas】株価時系列データを取得してCSVファイルに保存する方法と呼び出す方法

4月 24, 2021

株価の分析を行うときには,当然ながらどこかから株価の時系列データを持ってくる必要があります.

株価の時系列データを持ってくる方法として,Pythonライブラリを使ってYahoo!ファイナンスなどのAPIから取得する方法があります.

しかし,プログラムを実行する度に何度もYahoo!ファイナンスから株価を取得するのはYahoo!ファイナンスのサーバーに優しくありません

また,Yahoo!ファイナンスからデータを取得するには,インターネットに接続されていなければならないため,ネット環境がないときにプログラムを実行できず困る場合があります

他のAPIからデータを取得する場合も同様です.

そこで今回は,APIから取得した株価データを自分のパソコンにCSVファイルとして保存し,またそのCSVファイルから株価データをコード上に呼び出す方法を紹介します

これによって,一度株価データを取得してしまえば,それ以降はAPIからデータを引っ張ってくる必要がなくなります.

株価データを取得する

株価データを持ってくる方法はいくつかありますが,ここではpandas datareaderというPythonライブラリを使ってYahoo!ファイルから取得します.

pandas datareaderはpipでインストールできます.

pip install pandas_datareader

今回は例として,コカ・コーラ(KO),P&G(PG),テスラ(TSLA)の株価を取得したいと思います.

pandas datareaderでの株価取得方法は以下です.

import datetime
import pandas_datareader.data as web

start = datetime.date(2019,1,1)
end = datetime.date.today()

tickers = ['KO', 'PG', 'TSLA']
data = web.DataReader(tickers, 'yahoo', start, end)["Adj Close"] #株価データの取得

startは株価データの開始日,endは株価データの終了日です.このコードではendは今日の日付を取得するようになっています.

tickersが取得したい銘柄,dataが株価データです.ただし,ここでは調整後終値("Adj Close")だけを取得しています.

他の銘柄(日本株など)を取得したかったり,他のAPIで株価を呼び出したい場合は,Pythonのpandas datareaderをインストールして株価データを取得する方法【日本株・米国株】をご覧ください.

dataは以下のようにデータフレームで与えられます.print(data)で確認してみてください.

Symbols            KO          PG        TSLA
Date
2018-12-31  44.010803   86.727516   66.559998
2019-01-02  43.620419   86.123672   62.023998
2019-01-03  43.350868   85.519829   60.071999
2019-01-04  44.215286   87.265327   63.537998
2019-01-07  43.639008   86.916237   66.991997
...               ...         ...         ...
2021-04-12  53.349998  136.919998  701.979980
2021-04-13  53.090000  135.110001  762.320007
2021-04-14  53.080002  135.600006  732.229980
2021-04-15  53.330002  137.240005  738.849976
2021-04-16  53.680000  137.250000  739.780029

これで株価データが取得できました.

株価データをCSVファイルに保存する

では,先ほど取得した株価データをCSVファイルに保存します.

pandasのデータフレームなら簡単に保存できます.以下のコードでOKです.

data.to_csv('stocks_data.csv')

これで,実行したPythonファイルと同じディレクトリにstocks_data.csvというCSVファイルが保存されているはずです.中身をみて,株価データが書き込まれているか確認してみてください.

CSVファイルから株価データを呼び出す

それでは,今度は株価データを保存したCSVファイルからPythonに株価データを呼び出してみましょう.

import pandas as pd
data_r = pd.read_csv('stocks_data.csv')

print(data_r)

'stocks_data.csv’の部分は保存されているファイル名と一致している必要があります.また,この場合は実行ファイルと同じディレクトリに置いておく必要があります.

実行結果

           Date         KO          PG        TSLA
0    2018-12-31  44.010803   86.727516   66.559998
1    2019-01-02  43.620419   86.123672   62.023998
2    2019-01-03  43.350868   85.519829   60.071999
3    2019-01-04  44.215286   87.265327   63.537998
4    2019-01-07  43.639008   86.916237   66.991997
..          ...        ...         ...         ...
573  2021-04-12  53.349998  136.919998  701.979980
574  2021-04-13  53.090000  135.110001  762.320007
575  2021-04-14  53.080002  135.600006  732.229980
576  2021-04-15  53.330002  137.240005  738.849976
577  2021-04-16  53.680000  137.250000  739.780029

CSVファイルから株価データを呼び出すことができました.

ただし,CSVファイルから呼び出すとインデックスが0から始まる数字となり,Dateがカラムになります.

Dateがインデックスの元の形に直すには,以下を実行します.

data_r = data_r.set_index('Date')
                   KO          PG        TSLA
Date
2018-12-31  44.010803   86.727516   66.559998
2019-01-02  43.620419   86.123672   62.023998
2019-01-03  43.350868   85.519829   60.071999
2019-01-04  44.215286   87.265327   63.537998
2019-01-07  43.639008   86.916237   66.991997
...               ...         ...         ...
2021-04-12  53.349998  136.919998  701.979980
2021-04-13  53.090000  135.110001  762.320007
2021-04-14  53.080002  135.600006  732.229980
2021-04-15  53.330002  137.240005  738.849976
2021-04-16  53.680000  137.250000  739.780029

まとめコード

import datetime
import pandas_datareader.data as web

start = datetime.date(2019,1,1)
end = datetime.date.today()

tickers = ['KO', 'PG', 'TSLA']
data = web.DataReader(tickers, 'yahoo', start, end)["Adj Close"] #株価データの取得

data.to_csv('stocks_data.csv') #CSVファイルに株価データを保存

import pandas as pd

data_r = pd.read_csv('stocks_data.csv') #CSVファイルから株価データを呼び出し

data_r = data_r.set_index('Date') #データフレームを元の形に直す

【実践編】S&P500の株価を取得してCSVファイルに保存しておく

S&P500(米国企業約500社)の銘柄を分析したいときが結構あります.何度もウェブ(API)上から500社の株価を取得するのはあまりよくありませんので,今回の内容の実践編としてS&P500銘柄の株価データを取得し,CSVファイルの保存しておきたいと思います.

S&P500のティッカーコード一覧は以下で取得できます.

import pandas as pd
url = "https://raw.githubusercontent.com/datasets/s-and-p-500-companies/master/data/constituents.csv"
sp500 = pd.read_csv(url, encoding="SHIFT_JIS")

このコードに関して,詳しくは【Python】S&P500から低PERの銘柄をスクリーニングするをご覧ください.

この時点では,取得したsp500は以下のようになっています.

    Symbol                 Name                  Sector
0      MMM           3M Company             Industrials
1      AOS      A.O. Smith Corp             Industrials
2      ABT  Abbott Laboratories             Health Care
3     ABBV          AbbVie Inc.             Health Care
4     ABMD              Abiomed             Health Care
..     ...                  ...                     ...
500    YUM      Yum! Brands Inc  Consumer Discretionary
501   ZBRA   Zebra Technologies  Information Technology
502    ZBH        Zimmer Biomet             Health Care
503   ZION        Zions Bancorp              Financials
504    ZTS               Zoetis             Health Care

欲しいのはティッカーコード(Symbol)のカラムだけなので,以下のようにSymbolカラムだけを取り出してリストに変換します.

sp500 = sp500['Symbol'] #sp500ティッカーコードのデータフレーム
sp500_tickers = sp500.values.tolist() #データフレームをリストに変換

あとは,先ほどと同じように株価データを取得し,CSVファイルに保存します.

import datetime
import pandas_datareader.data as web
start = datetime.date(2019,1,1)
end = datetime.date.today()

sp500_data = web.DataReader(sp500_tickers, 'yahoo', start, end)["Adj Close"] #sp500の株価データを取得
sp500_data.to_csv('sp500_stocks_data.csv')

これでS&P500の株価データがCSVファイルに保存されていると思います.データ取得には時間がかかりますから,しばらく待ってみてください.

これで今後は,S&P500の株価データが必要なときはCSVファイルから呼び出すことができますね.

import pandas as pd
data_r = pd.read_csv('sp500_stocks_data.csv')