yahoo-finance-api2を用いたPythonによる株価の自動取得
yahoo-financeを使ってみようと思いましたが、python3.7までしか対応していないらしくM1で使用が出来ませんでした。そのためRaspberry Piで試してみましたが動きませんでした。Historyを見ると2016年から更新が止まっていました。もしかすると今は使えないのかもしれません。
その後調査するとyahoo-finance-api2というライブラリがあることがわかりました。pip経由でインストールが可能です。
$ pip install yahoo_finance_api2
早速インストールをして使ってみましたが、驚くほど簡単にデータが取得出来ました👍
東証の株式データを取得してみる
まずは「東証上場銘柄一覧のExcelファイルから東証コードのリスト抽出する」を参考にして、東証コード一覧のリストを取得してください。その後、codesにリストを渡すことで東証一覧の株価を取得できます。
※とりあえずyahoo_finance_api2の使い方を知りたいという方は、codesを使用せず直接codeに東証のコードを代入してください。
import sys
from yahoo_finance_api2 import share
from yahoo_finance_api2.exceptions import YahooFinanceError
#東証コードのリストを取得
codes = get_codes(file_path)
for code in codes:
print(code)
my_share = share.Share(code + ".T")
symbol_data = None
try:
symbol_data = my_share.get_historical(share.PERIOD_TYPE_DAY,
100,
share.FREQUENCY_TYPE_HOUR,
1)
except YahooFinanceError as e:
print(e.message)
print(symbol_data)
PERIOD_TYPEを変更するとデータを取得する期間が変更できます。DAY, MONTH, WEEK, YEARが選択できます。
FREQUENCY_TYPEはデータの取得頻度を表しています。DAY, HOUR, MINUTE, MONTH, WEEKが選択できます。
プログラムでは以下のデータが取得されます。
- タイムスタンプ
- 始値
- 高値
- 安値
- 終値
- 取引数
日経平均を取得したい方は「yahoo-finance-api2を使って日経平均株価を取得する」もご参照ください。
取得したデータをcsv形式で保存する
先程取得したデータをcsv形式で保存します。まず、pandasのライブラリをインストールします。
pip install pandas
yahoo_finance_api2で取得したデータはDictionary型になっています。キーはそれぞれ、
- datetime
- open
- high
- close
- volume
となっています。これらのデータがsymbol_dataに入っているので、Dataframe型に変換します。
その後to_csv関数でデータをcsv形式で保存します。
from datetime import date, datetime
import pandas as pd
df = pd.DataFrame({'datetime': [datetime.fromtimestamp(d / 1000) for d in symbol_data['timestamp']],\
'open' : symbol_data['open'], 'high' : symbol_data['high'],\
'close' : symbol_data['close'], 'volume' : symbol_data['volume']})
df.to_csv(code + '.csv', index=False)
timestampはそのまま保存すると見づらいので、datetimeに変換しています。また、csvの保存時にindexは不要なのでindex=Falseとしています。
完全なコードは以下になります。
from yahoo_finance_api2 import share
from yahoo_finance_api2.exceptions import YahooFinanceError
from datetime import date, datetime
import pandas as pd
#東証コードのリストを取得
codes = get_codes(file_path)
for code in codes:
print(code)
my_share = share.Share(code + ".T")
symbol_data = None
try:
symbol_data = my_share.get_historical(share.PERIOD_TYPE_DAY,
100,
share.FREQUENCY_TYPE_HOUR,
1)
except YahooFinanceError as e:
print(e.message)
print(symbol_data)
#csv形式で保存
if (symbol_data == None):
continue
df = pd.DataFrame({'datetime': [datetime.fromtimestamp(d / 1000) for d in symbol_data['timestamp']],\
'open' : symbol_data['open'], 'high' : symbol_data['high'],\
'close' : symbol_data['close'], 'volume' : symbol_data['volume']})
df.to_csv(code + '.csv', index=False)
こんなに簡単にデータが取れるなんて知りませんでした。途中から若干速度が低下するのでやはりYahoo側でなにかスクレイピングの対策を入れているのかもしれません。
次に取得したデータからチャートを描写したいという方は、「mplfinanceでSBI証券Likeなチャートを記載してみる」をご参照ください。株取引の理解を深めるためにチャートを記載してみるのもオススメです。
※追記 2021/07/17
プログラムを動かした際に「json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)」が出るようです。エラーの回避方法についてはこちらに記載しました。
→解消されました。「pip install -U yahoo-finance-api2」を使用してアップデートしてください。