yahoo-finance-api2を用いたPythonによる株価の自動取得

2022-05-07

 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」を使用してアップデートしてください。