株価の分析を行うときには,当然ながらどこかから株価の時系列データを持ってくる必要があります.
株価の時系列データを持ってくる方法として,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')
コメント