こんにちは。TATです。
今日のテーマは「yahoo_finance_api2で日本株の株価データを取得する」です。
以前にPythonで株価を取得する方法についてご紹介しました。
こちらの記事ではスクレイピングやライブラリーを使った株価の取得方法について解説しています。
【日本株対応】Pythonで株価のローソク足データを取得する方法まとめ【CSV、ライブラリ、スクレイピング】
続きを見る
今回はこれの進化版です。
Yahooファイナンスから株価を取得できるライブラリーを発見したのでご紹介します。
結論から言いますと、過去記事でご紹介した方法は不要になりますw
この記事で紹介する方法1つを理解しておけばOKです。
圧倒的に短いコードで簡単に株価データが取得できます。
日本株にも対応しているので無敵です。
なんで今まで気づかなかったのか、めちゃくちゃ後悔しています。。。w
この記事ではyahoo_finance_api2を使って株価データを取得する方法について解説していきます。
yahoo_finance_api2の基本的な使い方
まずはyahoo_finance_api2の基本的な使い方を見ていきます。
ライブラリーページへ行くと、基本的な使い方を確認できます。(英語ページ)
pipにも対応しているので、"pip install yahoo_finance_api2"で簡単にインストールできます。
とりあえず走らせてみる
とりあえずライブラリーページにあるデータをそのまま走らせてみます。
ちなみにMSFTはマイクロソフトです。
import sys from yahoo_finance_api2 import share from yahoo_finance_api2.exceptions import YahooFinanceError my_share = share.Share('MSFT') symbol_data = None try: symbol_data = my_share.get_historical( share.PERIOD_TYPE_DAY, 10, share.FREQUENCY_TYPE_MINUTE, 5) except YahooFinanceError as e: print(e.message) sys.exit(1) print(symbol_data)
上記のコードを走らせるとこうなります。
返り値は辞書型になっています。
それぞれの値はリストになっていますね。
そして時間はタイムスタンプになっているので、このままだと不便です。
ゆえに少し整形します。
DataFrameに変換してtimestampを整形する
まずはこの辞書型のデータをDataFrameに変換します。
import pandas as pd df = pd.DataFrame(symbol_data)
1行で完了です。
実行結果がこちら。
次にtimestampを変換します。
pandasにはtimestampを変換してくれるto_datetimeという関数があるので、これを利用すれば1行で完了します。
変換したデータをDatetimeというカラムに格納します。
df["datetime"] = pd.to_datetime(df.timestamp, unit="ms")
実行結果がこちらです。
timestampがきちんと変換されていることが確認できました。
ここまできたらデータ分析に問題なく使えます。
コードまとめ
基本的な使い方はこれで完了です。
流れとしては次の通りです。
- yahoo_finance_api2でデータを取得する
- DataFrameに変換する
- timestampを変換する
ここまでのコードをまとめるとこうなります。
import sys from yahoo_finance_api2 import share from yahoo_finance_api2.exceptions import YahooFinanceError import pandas as pd my_share = share.Share('MSFT') symbol_data = None try: symbol_data = my_share.get_historical( share.PERIOD_TYPE_DAY, 10, share.FREQUENCY_TYPE_MINUTE, 5) except YahooFinanceError as e: print(e.message) sys.exit(1) df = pd.DataFrame(symbol_data) df["datetime"] = pd.to_datetime(df.timestamp, unit="ms") df.head()
こちらのコードはご自由にコピペしちゃってください!
カスタマイズ機能が充実
次に設定周りを見ていきます。
柔軟になカスタマイズが可能です。
60分足・日足・週足・月足なども指定可能
まずは頻度の設定です。
先ほどのコードでいうところのshare.FREQUENCY_TYPE_MINUTE, 5が該当します。
これは5分おきのデータを取得しています。
FREQUENCYは次のような設定が可能です。
- 分足:share.FREQUENCY_TYPE_MINUTE
- 時間足:share.FREQUENCY_TYPE_HOUR
- 日足:share.FREQUENCY_TYPE_DAY
- 週足:share.FREQUENCY_TYPE_WEEK
- 月足:share.FREQUENCY_TYPE_MONTH
4時間足の場合はshare.FREQUENCY_TYPE_HOUR, 4となります。
使うことはないと思いますが、2日足とか3週間足なども設定できます。
日足にする場合はこんな感じ。share.FREQUENCY_TYPE_DAY, 1とすればOKです。
引数を設定するだけで完了するのでとても使い勝手がいいですね。
みた感じ、日足以上ならVolume(出来高)も取得できるようです。
取得するデータの期間もある程度なら指定可能
次に期間の設定です。
先ほどのコードでいうところのshare.PERIOD_TYPE_DAY, 10になります。
これは10日間という意味になります。
設定できる期間は次の通りです。
- 日で指定:share.PERIOD_TYPE_DAY
- 週で指定:share.PERIOD_TYPE_WEEK
- 月で指定:share.PERIOD_TYPE_MONTH
- 年で指定:share.PERIOD_TYPE_YEAR
例えば、日足で過去30日分のデータを取得する場合にはこうなります。
期間を指定する際の注意点
ここで一点だけ注意すべきことがあります。
期間を指定する際には、それぞれ上限があります。
正直なところ、正確な上限はわかりません。
しかし僕なりに見た感じだと、例えば日で100日分指定しても42日分しか取得できません。
この場合は週や月で指定する必要があります。
よって、指定する期間が大きい場合には気をつけてください。
過去1000週間と指定しても無理です。
こういった場合はさらに大きい単位(月や年)で指定するようにすれば大丈夫です
ちなみにマクロソフトで過去100年分の日足データを取得したら、一番古いデータで1986年3月13日でした。
これで、yahoo_finance_api2でできることは一通り網羅できたかなと思います。
【朗報】日本株も取得できます
次にお待ちかねの日本株についてみていきます。
大変ありがたいことにyahoo_finance_api2では日本株の株価データも取得可能です。
このライブラリーを作ってくれた方、データを提供してくれているYahoo様にこの場を借りて御礼申し上げます。
ありがとうございます。
証券コード4桁+.Tで日本株を指定できます
日本株のデータを取得する際には、証券コードの後に.TをつければOKです。
例としてトヨタ自動車の株価データを取得してみます。
トヨタ自動車の証券コードは7203なので、yahoo_finance_api2で指定する場合には7203.Tとなります。
過去100年分を指定してみたところ、一番古いデータで1999年5月6日でした。
日本株も取得が可能ということで、もはや過去記事で紹介したPythonによる株価を取得する方法は不要になりそうです。
頑張ってまとめたのに・・・(涙)
【日本株対応】Pythonで株価のローソク足データを取得する方法まとめ【CSV、ライブラリ、スクレイピング】
続きを見る
(念のため)注意点
最後に注意点です。
正直なところ、ここでお伝えする注意点については一部確信はないです。
- アクセス制限があるのか謎
- DatetimeはUTCなので日本時間への変換が必要
- データの遅延がどれくらいあるのか謎
順番に簡単に解説します。
アクセス制限があるのか謎
まず、アクセス制限が謎です。
ライブラリーページには制限の記述はありません。
yahoo_finance_apiでは1時間に2,000アクセスまでみたいな制限がありました。(うる覚えw)
しかし、yahoo_finance_api2にはそういった制限に関する記述がないんです。
もしかしたら使いまくっていたら制限が出てくるかもしれないので、利用する際には少し意識しておいたほうがいいかもです。
DatetimeはUTCなので日本時間への変換が必要
2つ目は、DatetimeはUTCであるという点です。
ゆえに日本時間で利用するには変換が必要です。
9時間足せば完了です。
参考がてらコードの一例をご紹介しておきます。
トヨタの株価データを60分足で過去30日分のデータを取得しています。
import sys from yahoo_finance_api2 import share from yahoo_finance_api2.exceptions import YahooFinanceError import pandas as pd import datetime my_share = share.Share('7203.T') symbol_data = None try: symbol_data = my_share.get_historical( share.PERIOD_TYPE_DAY, 30, share.FREQUENCY_TYPE_MINUTE, 60) except YahooFinanceError as e: print(e.message) sys.exit(1) df = pd.DataFrame(symbol_data) df["datetime"] = pd.to_datetime(df.timestamp, unit="ms") #日本時間へ変換 df["datetime_JST"] = df["datetime"] + datetime.timedelta(hours=9)
追加したのは最後の1行だけです。
結果はこうなります。
きちんと日本時間に変換されていることがわかります。
ただここでも追加で注意点があります。
時間をよく見ると、9時からスタートして最後は14時になっています。
日本の株式市場は9時から15時に取引可能です。
となると15時のデータが足りないように見えますが、これは見方が少し違います。
例えば、9時のデータは9:00~9:59までのデータを示しています。
14時のデータは14:00~14:59のデータです。
ゆえに15時のデータは存在しません。
ここの解釈だけ理解しておけば問題ないかと思います。
データの遅延がどれくらいあるのか謎
3つ目として、データの遅延がどれくらいあるのか謎です。
もともとYahooファイナンスで表示されている株価データは20分の遅延があります。
yahoo_finance_api2はこれと同じ遅延なのか、あるいはこれよりもさらに遅延があるのかについては正直なところわかりません。
わかる方いたら教えてください。
よって、リアルタイムトレードとかに利用するのは厳しいかと思います。
とはいっても、僕がチェックした感じでは、18時の時点で当日の株価データは取得できたので、日足でデータを収集するには十分利用可能と思います。
データの分析・可視化にはPythonが最適!
本記事で紹介したコードは、全てPythonを使って書いています。
Pythonはデータの分析や可視化を得意とするプログラミング言語で、さらにAI関連のライブラリーも豊富で昨今のAIブームで需要が急拡大しています。
→ 【いますぐ始められます】データ分析をするならPythonが最適です。
また、Pythonは比較的学びやすい言語でもあります。
実際、僕は社会人になってからPythonを独学で習得して転職にも成功し、Python独学をきっかけに人生が大きく変わりました。
→ 【実体験】ゼロからのPython独学を決意してから転職を掴み取るまでのお話。
Pythonの学習方法についてはいろいろな方法があります。
僕はUdemyを選びましたが、書籍やプログラミングスクールも選択肢になります。
→ 【決定版】Python独学ロードマップ【完全初心者からでもOKです】
→ 【まとめ】Pythonが学べるおすすめプログラミングスクール
→ プログラミングの独学にUdemyをおすすめする理由!【僕はUdemyでPythonを独学しました!】
まとめ
いかがでしたでしょうか。
ここではyahoo_finance_api2を利用した株価データの取得方法について解説しました。
日本株のデータも取得可能なので、かなり万能な感じがします。
短いコードで実装できて、取得データも期間や頻度を自由にカスタマイズできるので使い勝手も抜群です。
ただし、使う際には、使いまくってたら制限などをかけられる可能性はゼロではないということだけは頭に入れておいてください。(現状、制限に関する記述はないです)
yahoo_finance_api2を使えば、過去に紹介したPythonで株価データを取得する方法については不要になりそうです。
【日本株対応】Pythonで株価のローソク足データを取得する方法まとめ【CSV、ライブラリ、スクレイピング】
続きを見る
ここまで読んでくださってありがとうございました。