見出し画像

pythonとyfinanceで株価取得をする方法

先日yahoo finance api側の仕様変更のため、yahoo_finance_api2が使用できなくなったため、代わりにyfinanceでの株価の取得を行いました。

yahoo_finance_api2自体も仕様変更に対応したため、現在は使用可能です。

ただ、yahoo_finance_api2よりもyfinanceの使い勝手の方が良かったためyfinanceで株価取得する方法を載せていきたいと思います。

■yfinanceのメリット

・複数のティッカーのデータをまとめて取得できる
・財務情報の取得ができる

■実行環境について

pythonの実行はGoogle Colaboratoryが便利です。
Googleアカウントでログインすれば無料で使用可能です。

Google Colaboratoryの使い方

■株価を取得する方法

インストール

pip install yfinance

株価の取得

import yfinance as yf
data = yf.download('SPY AAPL', period='7d', interval = "1d")

たった2行のコードで、SPDR S&P 500 ETFとAppleの株価(日足)を取得することが出来ます。

出力結果

[*********************100%***********************]  2 of 2 completed
            Adj Close              ...     Volume           
                 AAPL         SPY  ...       AAPL        SPY
Date                                ...                      
2021-07-14  149.149994  436.239990  ...  127050800   64130400
2021-07-15  148.479996  434.750000  ...  106820300   55126400
2021-07-16  146.389999  431.339996  ...   93100300   75784700
2021-07-19  142.449997  424.970001  ...  121434600  147987000
2021-07-20  146.149994  431.059998  ...   96238600   99501600
2021-07-21  145.399994  434.549988  ...   74915000   64623000
2021-07-22  146.800003  435.459991  ...   77246300   47820500

項目は以下の通り。

'Open':始値
'High':高値
'Low':安値
'Close':終値
’Adj Close’:配当落調整済み終値
'Volume':出来高

大本のyahoo finance apiを利用したデータは基本的にUTC(協定世界時)で取得されます。
ただ、yfinanceで1日未満のデータを取得すると、米国株が現地時間-4、日本株が現地時間+9と表示されるので、すでに現地時間で調整されているみたいですね。

■他の銘柄のデータを取得する

上記コードの'SPY AAPL'を'MSFT'等、他のティッカーに変更することで株価を取得できます。
リスト、もしくは空白で区切ることで複数のティッカーを一度に取得出来ます。

日本株を取得したい場合は、証券コードの後に「.T」を追加すれば取得できます。
例)トヨタ:'7203.T'

インデックスについては、下記で取得が可能です。
日経225:'^N225'
ダウ:'^DJI'
SP500:'^GSPC'
ナスダック総合指数:'^IXIC'

基本的にYahoo financeでの指数のシンボルを使用すれば取得できるみたいですね。

■取得期間を変更する

period="7d"の7dを
「1d,5d,1mo,3mo,6mo,1y,2y,5y,10y,ytd,max」のいずれかに設定することで好きな期間の取得が出来ます。

1d:1日
1mo:1ヶ月
1y:1年
ytd:当会計年度
max:すべてのデータ

■取得する足の長さを変更する

interval = "1d"の1dを「1m,2m,5m,15m,30m,60m,90m,1h,1d,5d,1wk,1mo,3mo」のいずれかに設定することで好きな時間足の取得が出来ます。

1m:1分足
1h:1時間足
1d:日足
1mo:月足

こちらの記事に日足のデータは正確だったが月足でのデータが始値以外はずれていたという記述があるので、日足以外のデータを使用する場合は検証してから使用することをおすすめします。

■銘柄ごとにまとめたデータにする

デフォルト状態では、始値終値などの項目ごとにデータをまとめてあります。

グラフを書く場合には便利なのですが、各銘柄ごとにデータを分析したい場合には向きません。

銘柄ごとにデータをまとめる場合は、下記のようにカンマ区切りでgroup_byオプションを追加してください。

data = yf.download('SPY AAPL', period='7d', interval = "1d", group_by = 'ticker')

出力結果

[*********************100%***********************]  2 of 2 completed
                 AAPL              ...         SPY           
                 Open        High  ...   Adj Close     Volume
Date                                ...                       
2021-07-14  148.100006  149.570007  ...  436.239990   64130400
2021-07-15  149.240005  150.000000  ...  434.750000   55126400
2021-07-16  148.460007  149.759995  ...  431.339996   75784700
2021-07-19  143.750000  144.070007  ...  424.970001  147987000
2021-07-20  143.460007  147.100006  ...  431.059998   99501600
2021-07-21  145.529999  146.130005  ...  434.549988   64623000
2021-07-22  145.940002  148.199997  ...  435.459991   47820500

■その他のオプション

その他のオプションは以下の通りです。

#すべてのOHLCを自動的に調整する
#(オプション、デフォルトはFalse)
auto_adjust = True

#プレ/アフターマーケット(時間外取引)のデータをダウンロードする
#(オプション、デフォルトはFalse)
prepost = True

#periodの代わりに開始日を指定することも出来る
start="2017-01-01"

#終了日の指定
#デフォルトはプログラムの実行日
end="2017-04-30"

#プロキシURLスキームはダウンロード時に使用しますか?
#(オプション、デフォルトはなし)
proxy = None

複数銘柄取得した場合にマルチインデックスという形式でデータが取得されますが、操作が難しいので1つだけ例を挙げておきます。

■group_byオプションなしで取得したデータからSPYのデータだけ抽出

import yfinance as yf

data = yf.download('SPY AAPL', period='7d', interval = "1d")

idx = pd.IndexSlice
data2 = data.loc[:,idx[:,'SPY']].droplevel(level=1, axis=1)
print(data2)
             Adj Close       Close  ...        Open     Volume
Date                                ...                       
2021-07-14  436.239990  436.239990  ...  437.399994   64130400
2021-07-15  434.750000  434.750000  ...  434.809998   55126400
2021-07-16  431.339996  431.339996  ...  436.010010   75784700
2021-07-19  424.970001  424.970001  ...  426.190002  147987000
2021-07-20  431.059998  431.059998  ...  425.679993   99501600
2021-07-21  434.549988  434.549988  ...  432.339996   64623000
2021-07-22  435.459991  435.459991  ...  434.739990   47820500

■財務情報を取得する方法

yfinanceでは株価情報だけでなく財務情報を取得することもできます。
簡単にコードを載せておきます。

財務情報は通期では4期分、4半期は1年分のデータが取得できるようです。

import yfinance as yf

msft = yf.Ticker("MSFT"#株式情報を取得する msft.info

 #過去の市場データを取得する hist = msft.history(period = "max")

#アクション(配当、分割)を表示
msft.actions

#配当を表示
msft.dividends

#分割を表示
msft.splits

#財務情報を表示
msft.financials
msft.quarterly_financials

#主要な所有者を表示
msft.major_holders

#機関保有者を表示
msft.institutional_holders

#バランスシートを表示
msft.balance_sheet
msft.quarterly_balance_sheet

#キャッシュフローを表示
msft.cashflow
msft.quarterly_cashflow

#収益を表示
msft.earnings
msft.quarterly_earnings

#持続可能性を示す
msft.sustainability

#アナリストの推奨事項を表示
msft.recommendations

#次のイベント(収益など)を表示
msft.calendar

#ISINコードを表示-*実験的*
#ISIN =国際証券識別番号
msft.isin

#オプションの有効期限を表示
msft.options

#特定の有効期限のオプションチェーンを取得
opt = msft.option_chain( 'YYYY-MM-DD')
#データは次の方法で入手できます:opt.calls、opt.puts 

通期・四半期の利益や財務データ、キャッシュフローから機関保有者まで取得できるってすごいですね…(・ω・;)

■まとめ

様々な情報を取得できて便利なライブラリだと思ったのですが、日本語で解説しているサイトが見つからなかったので、yfinanceでの株価取得方法を簡単に書いてみました。

プログラミングでの株価分析に興味がある方のお役に立てればと思います。


この記事が気に入ったらサポートをしてみませんか?