Python 株価を取得するAPI「yahoo_finance_api2」

 本記事では例えば、下図のように1年分の株価データをダウンロードして、グラフ化とcsvファイル化するコードの雛形を記載しました。

f:id:HK29:20200425165308p:plain

ライブラリのインストールは下記のようにpipで行います。

pip install yahoo_finance_api2

■本プログラム

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# https://developer.yahoo.com/yql/guide/overview.html
# https://github.com/pkout/yahoo_finance_api2
# pip install yahoo_finance_api2
from yahoo_finance_api2 import share
from yahoo_finance_api2.exceptions import YahooFinanceError
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
import datetime
now = datetime.datetime.now()
now = now.strftime("%y%m%d")

def main():
    num = len(data_dict)
    #fig, ax = plt.subplots(num, 1, figsize=(16, 3*num))
    fig, ax = plt.subplots(figsize=(10, 6))
    legend_list = []
    i = 0
    for mykey, company_name in data_dict.items():
        company_code = str(mykey) + '.T'
        my_share = share.Share(company_code)
        
        try:
            # 1日毎の1年分のデータを取得する場合
            symbol_data = my_share.get_historical(share.PERIOD_TYPE_YEAR,
                                                  1,
                                                  share.FREQUENCY_TYPE_DAY,
                                                  1)
            # 5分毎の10日分のデータを取得する場合
            '''
            symbol_data = my_share.get_historical(share.PERIOD_TYPE_DAY,
                                                  10,
                                                  share.FREQUENCY_TYPE_MINUTE,
                                                  5)
            '''
            df = pd.DataFrame(symbol_data.values(), index=symbol_data.keys()).T
            df.timestamp = pd.to_datetime(df.timestamp, unit='ms')
            # 日本標準時間に変換
            df.index = pd.DatetimeIndex(df.timestamp, name='timestamp').tz_localize('UTC').tz_convert('Asia/Tokyo')
            # csvファイルに保存
            df.to_csv(now + "_" + str(mykey) + "_" + company_name + ".csv", index=False)
            #ax[i].set_title( "{0} ({1})".format(company_name, mykey))
            ax.plot(df.index, df.close, '.')
            ax.grid(True)
            ax.set_ylabel("Stock Price [Yen]")
            #ax[i].label_outer() 一番外側のラベルのみ表示
            legend_list.append(str(mykey) + " " + company_name)
            if i == (num - 1):
                ax.set_xlabel("Date")
        except YahooFinanceError as e:
            print(e.message)
            pass
        i += 1
    ax.legend(labels= legend_list,
              bbox_to_anchor=(1.05, 0.5, 0.5, .100), 
              borderaxespad=0.,
              ncol=1,
              mode="expand",
              title="Company")
    plt.rcParams['font.size'] = 18 # ラベルやタイトルなど全フォントのデフォルトサイズ
    plt.subplots_adjust(right=0.7)
    plt.tight_layout() # ラベルレイアウトを調整する。文字がはみ出ないようにする。
    #plt.show()
    fig_name = now + "_stock_price.png"
    plt.savefig(fig_name)

if __name__ == '__main__':
    data_dict = { 7201:'日産自動車',
                  7202:'いすゞ自動車',
                  7203:'トヨタ自動車',
                  7205:'日野自動車',
                  7211:'三菱自動車工業',
                  7261:'マツダ',
                  7267:'本田技研工業',
                  7269:'スズキ',
                  7270:'SUBARU',
                  7272:'ヤマハ発動機',
                  6902:'デンソー'}
                 
    main()

本プログラムを実行すると、下図のように株価データをcsvファイルでも保存します。

f:id:HK29:20200425165625p:plain

以上

<広告>