yfinance API を使って株のデータを取得する
こしかけです。こちらの記事ではタイトルどおり、Pythonを使って株のデータを取得する方法について書きます。
※記事もプログラムも無料で読めてダウンロードできます。金額がついているのはコンビニコーヒーくらい奢ってもいいかなという方いたら嬉しいなくらいの気持ちですw
Google Colabratoryを使っていきますので、Google Colabratoryの使い方は下記の記事を参考にしてください。
基本的にはこのコードを実行するとデータを取得できるので読むのが面倒な人は記事の最後に置いてある.ipynbファイルをダウンロードしてColabで実行してみてください。
それでもプログラム難しい…と言う方は日経225の過去データをまとめたものは用意してます。
もしよければこちらもご覧ください
あと、2024年からメンバーシップも始めました。
良かったらこちらも覗いてみてください
株のデータを取得するプログラム
今回の記事では株のデータである
・始値、高値、安値、終値、調整後終値 +出来高
を取得するプログラムです
またおまけとして、取得した後移動平均線を計算し、Colab上にチャートを表示するところまでやってみます。
※冒頭にも書きましたが、この先は添付しているプログラムの説明になりますので、記事を読みたくない人は飛ばして大丈夫です
yfinanceを使うためにインストールをする
pip install yfinance
まずは、データを取得するために yfinanceをインストールします。
こちらを実行した後、
下記のプログラムを実行するだけでデータ自体は取得ができます!
株データ取得のプログラム
下記が、株データ取得のためのプログラムです。初めての方もGoogle Colabだけでもわかりやすいようにコメントたくさん入れてありますが、
コード自体はすごく短く、これだけで取得ができてしまいます。
import yfinance as yf
from pandas_datareader import data as pdr
import pandas as pd
import datetime
# 指定したコードと期間でデータを取得をします。
# ticker → 個別株・指数のコード
# start → 取得したい初めの日付
# end → 取得したい終わりの日付
ticker = "^N225"
start = datetime.date(1980,1,1)
#翌日の日付を指定しないと当日の日付までのデータを取得できないので、翌日を指定しています
end = datetime.datetime.now() + datetime.timedelta(days = 1)
#日付を指定したい場合は↓の書き方。
#もし日付を変える場合は1日後を指定してください(5日まで取得したかったら6日を指定)
#下記だと7月19日まで取得
#end = datetime.date(2023,7,20)
#日本個別株を取得する場合はコードの番号.Tを末尾につける必要があります。
#例えばホクトの場合・・↓
#ticker = "1379.T"
#2024-10-05 こちらがエラーをしていたので変更しました
#yfinanceのライブラリで指定した条件でデータを取得 ※現在は下記は動かないためコメントアウト
#yf.pdr_override()
#df = pdr.get_data_yahoo(ticker, start, end)
#2024-10-05更新 こちらで動きます。
# yfinanceを使って直接株価データを取得
df = yf.download(ticker, start, end)
print(df)
#csvで保存
#ファイル名は上記tickerで指定した文字列_daily_data.csvとして保存されます
#日経225の場合は ^N225_daily_data.csv として保存されます。
#保存したファイルの保存の仕方は こしかけ の noteで説明します。
df.to_csv(ticker+'_daily_data.csv', encoding='utf8')
それぞれ、中身を説明していきます
プログラムの中身の説明:取得したい銘柄・指数と期間を指定する
プログラム内にコメントでも書いてありますので、同じ説明にはなりますが、
まずは取得した株と期間の情報を決めます
プログラム上では日経225のデータを1980年から2023年の4月5日までを取得するようにしています。
# 指定したコードと期間でデータを取得をします。
# ticker → 個別株・指数のコード
# start → 取得したい初めの日付
# end → 取得したい終わりの日付
ticker = "^N225"
start = datetime.date(1980,1,1)
#翌日の日付を指定しないと当日の日付までのデータを取得できないので、翌日を指定しています
end = datetime.datetime.now() + datetime.timedelta(days = 1)
#日付を指定したい場合は↓の書き方。
#もし日付を変える場合は1日後を指定してください(5日まで取得したかったら6日を指定)
#下記だと7月19日まで取得
#end = datetime.date(2023,7,20)
取得したい銘柄を変更したい場合
ticker = "^N225"
この部分の^N225を変更してください。
日本株の個別株の場合は4桁の銘柄ごとのコードの末尾に【 .T 】をつける必要があります。
例:ホクトの場合
ticker = "1379.T"
※またここは文字列で指定をしてあげる必要があるためダブルクオーテーションマーク【 " " 】は必要です。
期間を変えたい場合は、startの
datetime.date(1980,1,1)
この部分の数値を変えてください
例:2020年1月1日から取得したい場合
start = datetime.date(2020,1,1)
現在、期間の終わりはプログラムを起動した当日になるようにしています(2023年7月19日に改良)
もし、期間の終わり日付を指定したい場合は
end = datetime.date(2023,7,20)
とstartと同じように指定してください。
ただし、endに関しては、翌日の日付を指定しないと当日分までデータが取れません。そのため取得したい期間の翌日をendでは指定してください
※上記の記述では7月19日までのデータが取得されます。
プログラムの中身の説明:設定した期間と銘柄のデータを取得
(2024年10月4日更新)
※仕様変更が起きたのか過去の方法では動かなくなっていたためコードを変更していますが、説明文は変わらずです。コードだけ変わります。
ここを指定した後はもう、yfinanceが勝手に取得してきてくれます。
下記が取得部分。
# yfinanceを使って直接株価データを取得
df = yf.download(ticker, start, end)
print(df)
プログラムの中身の説明:取得したデータをCSVで保存
最後に、取得したデータをCSVで保存をします。
#csvで保存
#ファイル名は上記tickerで指定した文字列_daily_data.csvとして保存されます
#日経225の場合は ^N225_daily_data.csv として保存されます。
#保存したファイルの保存の仕方は こしかけ の noteで説明します。
df.to_csv(ticker+'_daily_data.csv', encoding='utf8')
今回、最初に指定したtickerを利用して名前を付けています。
そのためCSVは日経225の場合
^N225_daily_data.csv
という名前で保存されます。このファイルがGoogle Colab上でどこに保存されるかはこの後ご説明します。ここから自分のPCへダウンロードをしたら、ご自分のPCでデータをみることもできるます
CSVをご自身のPCに保存する方法
Google Colabで実行し、生成したファイルは現在開いているGoogle Colab上に保存されます。つまり、一定期間放置したり、ブラウザを閉じるとファイルが消えるのでもう一度実行をする必要がでてきます。
そのため、消える前に一度自分のPCにダウンロードするのがよいです。
下記どこに保存されて、どのようにダウンロードするかをご説明します。
Google Colab上にはこの画像にあるようにフォルダのアイコンが表示されています。ここが今実行しているプログラムで生成したファイルが保存されるフォルダです。
そのため、プログラムを実行した後にこのフォルダのアイコンをクリックします。
次に、ここをクリックすると、下記のようにメニューが広がります。
その中に、先ほど説明したようにtickerで設定した名前が冒頭についたCSVファイルができています。
このファイルを右クリックしてください
右クリックするとメニューがさらにポップしてきます。
その中のダウンロードをクリックすると生成したファイルをご自身のPCへ保存ができます。
以上が、データを取得し、そのデータをCSVにして保存するプログラムになります。
データの取得だけがやりたかった人はここまで読めば問題ないです。
この先、このデータを使って移動平均線を計算したり、チャートを表示する方法を説明していきます。
移動平均線の計算とチャート画像出力
データは無事に取得ができたかと思います。
ここからはデータを使って計算したり、チャート画像を作ったりという部分を書いていきます。
移動平均線の計算について
移動平均線については知らない人はあんまりいないのではと思いますので、移動平均線についての説明は省きます。
先ほど取得したデータから終値(Close)を使って、移動平均線を計算していきますが、正直1行で書けてしまいます。
下記がプログラムです。25MA,50MA,75MAを算出しています。
それぞれプログラム上は1行ずつで書けています。
25日スパン・50日スパン・75日スパンで計算をして、それを先ほど取得したデータに列を追加し値を入れています。
そして、最後の1行で、先ほど保存したデータを上書きする形で、移動平均線付きの情報を保存しています。
※この部分を実行すると、移動平均線付きのCSVが作られ、先ほどの方法でダウンロードすると移動平均線の値を見ることができます。
# 移動平均線
#それぞれデータ列 SMA25、 SMA50 ,SMA75として移動平均線を追加
#移動平均線の計算期間を変えたい時は(window=25) ここの数字を変更するといいです(いっしょに列名も変えるとわかりやすいです)
#例: 13MAの場合 df["SMA13"] = df["close"].rolling(window=13).mean()
df["SMA25"] = df["Close"].rolling(window=25).mean()
df["SMA50"] = df["Close"].rolling(window=50).mean()
df["SMA75"] = df["Close"].rolling(window=75).mean()
#計算できているか確認のため印字してみる
#中身を確認し値場合は print の前の # を消してください
#print(df.tail())
#csvで保存 移動平均線計算後のデータをCSVで保存
df.to_csv(ticker+'_daily_data.csv', encoding='utf8')
移動平均線付きのチャートを描画する
いよいよ描画です。ただ、実は描画に関しては一度記事化しており、細かい説明はそちらも読んでみてください。
今回のプログラムでは表示(画像にして保存)するだけのもので、MACDの表示などはまた別途記事化しようかとおもっています
今回はmatplotlibを使って、チャートを描いていきます
データダウンロードの時と同じように、チャートを書くためのモジュールをインストールします。こちら実行し必要なモジュールをインストールします。
pip install mplfinance
こちらをインストールした後は、下記のプログラムを実行します。
import matplotlib
import mplfinance as mpf
%matplotlib inline
#取得したデータが多すぎるとグラフ描画に時間がかかるため、表示期間のスタートを指定
#日足だと1年~半年くらいがいいです
graphStart = datetime.date(2022,1,1)
#移動平均線を計算しつつ、出来高付きローソク足チャートを作成し、表示
mpf.plot(df[graphStart:], type='candle', mav=(25, 50, 75),datetime_format='%Y/%m/%d', tight_layout=False, volume=True, figratio=(19,9), style='yahoo')
#移動平均線を計算しつつ、出来高付きローソク足チャートを作成し、画像で保存
mpf.plot(df[graphStart:], type='candle', mav=(25, 50, 75),datetime_format='%Y/%m/%d', tight_layout=False, volume=True, figratio=(19,9), style='yahoo',savefig=str(ticker)+'_daily.png')
まず初めにこちらの2行は、先ほどインストールしたmatplotlibを使えるようにするものです。
3行目はColab内で生成した画像を表示するために記載しております。
import matplotlib
import mplfinance as mpf
%matplotlib inline
続いて、実際にチャートを書く部分です。
#取得したデータが多すぎるとグラフ描画に時間がかかるため、表示期間のスタートを指定
#日足だと1年~半年くらいがいいです
graphStart = datetime.date(2022,1,1)
#移動平均線を計算しつつ、出来高付きローソク足チャートを作成し、表示
mpf.plot(df[graphStart:], type='candle', mav=(25, 50, 75),datetime_format='%Y/%m/%d', tight_layout=False, volume=True, figratio=(19,9), style='yahoo')
#移動平均線を計算しつつ、出来高付きローソク足チャートを作成し、画像で保存
mpf.plot(df[graphStart:], type='candle', mav=(25, 50, 75),datetime_format='%Y/%m/%d', tight_layout=False, volume=True, figratio=(19,9), style='yahoo',savefig=str(ticker)+'_daily.png')
初めに取得したデータは1980年からという膨大な量になっていますので、
チャートにする期間は絞った方がいいです。
今回コードの中では2022年1月1日からにしています。
日付を変える場合は下記の括弧()内を変更してください。
graphStart = datetime.date(2022,1,1)
移動平均線付きの画像については下記で表示します。
2行あるのは、1つ目がColab内での表示、2つ目がpng画像として作ったチャートを保存しているという役割の違いがあります。
また、この中で mav=(25, 50, 75)という部分があり、実はチャート生成時に移動平均線を計算してくれる機能があります。
#移動平均線を計算しつつ、出来高付きローソク足チャートを作成し、表示
mpf.plot(df[graphStart:], type='candle', mav=(25, 50, 75),datetime_format='%Y/%m/%d', tight_layout=False, volume=True, figratio=(19,9), style='yahoo')
#移動平均線を計算しつつ、出来高付きローソク足チャートを作成し、画像で保存
mpf.plot(df[graphStart:], type='candle', mav=(25, 50, 75),datetime_format='%Y/%m/%d', tight_layout=False, volume=True, figratio=(19,9), style='yahoo',savefig=str(ticker)+'_daily.png')
ただし、こちら、下記の結果の画像を見ると分かる通り、移動平均線が計算されるのはチャートのスタート位置からとなり、それぞれ冒頭の平均線が消えてしまいます。
こちらを防ぐための方法として、先ほど計算した移動平均線を使ってチャート画像を作る方法がこの次のコードになります。
期間冒頭の移動平均線が消えないようにする方法
移動平均線が消えないようにするために先ほど計算した移動平均線のデータを使います。
下記のように移動平均線のデータをリストとして準備します。
それぞれチャートを作るスタートからデータを取得してリスト化をしています。
またその中で移動平均線の色も指定しており、
color = 'r' → 赤
color = 'g' → 緑
color = 'b' → 青
です。他にも y(黄色)やc(シアン)、m(マゼンダ)での指定や
直接カラーコードを入力することも可能です。
alphaは移動平均線の透明度、widthは線の太さになります。
#計算した移動平均線を表示するための準備。
apd_day_ave = [
mpf.make_addplot(df[graphStart:]['SMA25'],
panel=0,color='r', width=1,alpha=0.7),
mpf.make_addplot(df[graphStart:]['SMA50'],
panel=0,color='g', width=1,alpha=0.7),
mpf.make_addplot(df[graphStart:]['SMA75'],
panel=0,color='b', width=1,alpha=0.7),
]
このリストを、先ほどのチャート画像を生成するコードに追加してあげます。
mpf.plot(df[graphStart:],addplot=apd_day_ave, type='candle',datetime_format='%m/%d',xrotation=360, tight_layout=False, volume=True, figratio=(19,9), style='yahoo',savefig=str(ticker)+'_03_daily.png')
mpf.plot(df[graphStart:],addplot=apd_day_ave, type='candle',datetime_format='%m/%d',xrotation=360, tight_layout=False, volume=True, figratio=(19,9), style='yahoo')
これを実行すると・・
下記のように頭から移動平均線を記載することができます。
※この部分のコード全文くっつけたものが下記です
#計算した移動平均線を表示するための準備。
apd_day_ave = [
mpf.make_addplot(df[graphStart:]['SMA25'],
panel=0,color='r', width=1,alpha=0.7),
mpf.make_addplot(df[graphStart:]['SMA50'],
panel=0,color='g', width=1,alpha=0.7),
mpf.make_addplot(df[graphStart:]['SMA75'],
panel=0,color='b', width=1,alpha=0.7),
]
mpf.plot(df[graphStart:],addplot=apd_day_ave, type='candle',datetime_format='%m/%d',xrotation=360, tight_layout=False, volume=True, figratio=(19,9), style='yahoo',savefig=str(ticker)+'_03_daily.png')
mpf.plot(df[graphStart:],addplot=apd_day_ave, type='candle',datetime_format='%m/%d',xrotation=360, tight_layout=False, volume=True, figratio=(19,9), style='yahoo')
まとめ
以上、コードを取得する部分がメインですが、合わせてチャートまでを表示してみました。
そこまで多くのコードを書かなくてもできるのでpythonでデータ取得のハードルは下がるのではないかな?と思います。
Google Colabで使えるファイルを添付しておきますので、
こちらを使えばそのまま使うこともできます。
ぜひ一度、試してみてください
ここから先は
¥ 200
いただいたサポートは今後のbotの運用や新規機能開発の励みにします!!もっとがんばります🍄