【Python】米国S&P500のデータでローソク足チャートを作ってみる
概要
株式関連は証券会社のサイトなどで最初からローソク足を表示する機能が備わっていることが普通ですが、ライブラリの勉強目的であえてPythonでローソク足を描画してみたいと思います。
環境
- Python 3.8.10
- mpfinance 0.12.9b1
データ
Investing.comさんのサイトから米国S&P500のデータをcsv形式でダウンロードさせていただきました。
ここでは、2018/08/04~2022/09/02までの期間でダウンロードしました。
ローソク足を描画するライブラリ
金融系の描画ができるmplfinanceというライブラリがあるので、こちらをpipでインストールしておきます。
pip install mplfinance
データ確認
まずはcsvデータの中身を確認してみます。
注意点としては以下がありました。
- 日付データが日本語で年月日で入っている⇒parserで処理が必要そう
- 数値が千の位で’ , ‘区切りになっている⇒読み込み時に認識させる必要がありそう。
とりあえずローソク足描画
こちらが実際にデータを読み込んでmplfinanceを使って描画した様子です。
import pandas as pd
from datetime import datetime
import mplfinance as mpf
#parser関数
jpdateparse = lambda x: datetime.strptime(x, '%Y年%m月%d日')
df = pd.read_csv('S&P500 過去データ20180102_20220902.csv',index_col=0,parse_dates=['日付け'],date_parser=jpdateparse,thousands=',')
#カラム名変更
df.columns = ['Close', 'Open', 'High', 'Low', 'Volume','RateOfChange']
#昇順ソート
df.sort_index(inplace=True)
#ローソク足描画
mpf.plot(df,type='candle',figratio=(16, 9), mav=(5, 25, 75, 100, 200))
データを確認した際に「日付け」列のデータが日本語になっているのでそれをparserの関数を作ってdate_parserに指定した上でindexとして読み込んでいます。また、thousands=’,’ とすることで、千の位のカンマを認識させて、読み込み時に文字列ではなくfloatになる様にしています。
そのほか、mplfinanceのplotではClose, Open, High, Low Volumeにカラム名を設定しないとうまく動かないようなのでカラム名を変更、さらに元データが日付け降順になっていたため、これを昇順に直しています。
そのうえで描画した結果がこちらです。
================================================================= WARNING: YOU ARE PLOTTING SO MUCH DATA THAT IT MAY NOT BE POSSIBLE TO SEE DETAILS (Candles, Ohlc-Bars, Etc.) For more information see: - https://github.com/matplotlib/mplfinance/wiki/Plotting-Too-Much-Data TO SILENCE THIS WARNING, set `type='line'` in `mpf.plot()` OR set kwarg `warn_too_much_data=N` where N is an integer LARGER than the number of data points you want to plot. ================================================================ warnings.warn('\n\n ================================================================= '+
まず、上記で示したように警告メッセージが表示されました。どうやら、ローソク足を描画する上でデータ数が多すぎますという警告のようです。確かに、plotの引数としてtype=’candle’を指定したにも関わらず、つぶれて普通の折れ線に見えてしまっています。
なお、figratioはグラフサイズの比です。mavは移動平均描画のオプションで今回は25日, 50日, 75日, 100日, 200日を指定しています。
月足のローソクへ変更
警告と見た目の解消のため、resampleでサマリしたうえで再度描画してみます。月足なので移動平均は6か月、12か月、24か月に変更しています。
df_month = df.resample('M').agg({'Open': 'first', 'High': 'max', 'Low': 'min', 'Close': 'last'})
mpf.plot(df_month,type='candle',figratio=(16,9), mav=(6, 12, 24))
今度は良い感じに描画することができました。
出来高について
plotのオプションでvolume = Trueとすることで出来高を同じグラフ内に描画することが可能なようですが、S&P500はインデックスのため、今回は描画していません。また、別の個別銘柄などのデータで試してみようと思います。