こんにちは、@Yoshimiです。
株価予測アプリをリリースすることが決まりました!
初心にかえり、株価取得から機械学習で予測するところまで、さらにその先のチューニングまでをブログで粛々とアップしていきたいな〜なんて考えています。
目次
YahooのYahoo! Finance APIとは?
https://pypi.org/project/yahoo-finance-api2/
東京証券取引所に上場している銘柄の株価はほとんど取得できます。大体3,500銘柄くらいです。勉強のために利用するのであれば、十分なのですが、YahooのYahoo! Finance APIは2017年に公式の提供を終了しているのです。
「えっ???」と思われると思いますが、サポートされていないだけで利用することは可能なのです。
以前、「Pythonのライブラリpandas-datareaderで株価を取得する」でライブラリを紹介しましたが、案の定現在はエラーが出ており、解決するには時間がかかりそうです。個人的にも解決には色々コネコネしないといけないっぽいので、であれば動いているAPI利用した方が早いです。
Yahoo Finance APIの長所
- 無料で利用できること
- 情報の取得が簡単(プログラミングが容易)
- 取得できるデータの量が多い
- アカウント登録は不要
Yahoo Finance APIの短所
- 非公式
- データを取得しすぎると利用停止になる可能性がある
- データが脆い
- 取得できない日がある
公式ではないので、何かあっても文句は言えないですね・・・
YahooのYahoo! Finance APIで株価を取得してみよう
ライブラリをよみこみます。
CODE部分は、取得したい株価コードを入力します。S_yearは取得年数、S_dayは日です。
from yahoo_finance_api2 import share from yahoo_finance_api2.exceptions import YahooFinanceError import pandas as pd code = 3323 #ターゲット S_year = 5 #取得年数 S_day = 1 #取得単位
簡単な関数を作成しておきます。別に関数化しなくとも利用できますが、後続処理で利用するために、カスタム化するとき便利だと思います。
code
にターゲットとなる銘柄コードを変数で代入させています。なので、ループ処理などを行えば、多くの株価を取得することも可能です。
基本的に、'timestamp', 'open', 'high', 'low', 'volume'
が取得されます。分析で不要であればdropしてください。
# 目的変数を作成する def kabuka(): company_code = str(code) + '.T' my_share = share.Share(company_code) symbol_data = None try: symbol_data = my_share.get_historical(share.PERIOD_TYPE_YEAR, S_year, share.FREQUENCY_TYPE_DAY, S_day) except YahooFinanceError as e: print(e.message) sys.exit(1) # 株価をデータフレームに入れている df_base = pd.DataFrame(symbol_data) df_base = pd.DataFrame(symbol_data.values(), index=symbol_data.keys()).T df_base.timestamp = pd.to_datetime(df_base.timestamp, unit='ms') df_base.index = pd.DatetimeIndex(df_base.timestamp, name='timestamp').tz_localize('UTC').tz_convert('Asia/Tokyo') #df_base = df_base.drop(['timestamp', 'open', 'high', 'low', 'volume'], axis=1) #df_base = df_base.rename(columns={'close':company_code + '対象'}) #df_base = df_base[:-1] #一番最後の行を削除 df_base = df_base.reset_index(drop=True) return company_code, df_base
‘.T’がはじめ意味がわからなかったのですが、Yahoo! Finance URLを確認してわかりました。
コードに‘.T’が付与されており、東証の意味だったのです。他にも、北海道のH、名古屋のN、福岡のFなどあるのですが、Yahoo! Finance APIでは取得できるコードとできないコードが存在しております。というわけで、非公式ともいえます。ご注意ください。
取得した株価を確認します。
result = kabuka() print(str(result[0]), result[1].shape) # データフレームへもどす df_base = result[1] df_base.head()
無事、結果が返ってきました。
3233.Tは銘柄コードで、(1241, 6) は1241日分のデータ(レコード数)、6カラム(timestamp, open, high, low, close, volume)です。
- timestamp:取引日時
- open:始値
- high:高値
- low:底値
- close:終値
- volume:出来高
このデータがわかれば、前日の差、上がり幅、下り幅とか計算できますね。機械学習で予測するのであれば、closeを目的変数とし、日時以外を説明変数とすることで何とか予測できそうですね。
他にもあるYahooAPI
yfinance
株価データはもちろん財務データ等やオプションの情報も取得できるようです。
Yahoo!Financeの企業ページには多くの情報が掲載されているので、どんなデータを取得したいのか?株価に影響があるデータは?の要件を見定めればこのAPIも有効に使えると思います。
ただし、どのようなデータがどこまで取得できるのかは調べきれていません。
yahoo_fin
yfinance同様に取得できるデータが多いです。sp500やダウの株価コード一覧が取得できます。が、しかし、日経225やTopixの一覧はデータは取得できないようです。
最後に
YahooのYahoo! Finance APIのエントリー記事はたくさんあるので、株価を取得して機械学習で予測するお勉強APIとしては十分だと思います。
2021年2月に東証から月額8万円で株価を取得できるAPIが発表されたようです。公式APIなのでまずトラブルは起きないことでしょう。ただ、今まで私も携わってきたシステムでもバグやトラブルって100%で起きていたので何らかの不具合とか出てくることも考えておいてくださいね。人間が作ったものですからエラーはつきものです。
とはいえ、公式API使ってみたい。