こんにちは。TATです。
今日のテーマは「Pythonで株価チャートを描く」です。
株価チャートを描くライブラリーとしてplotlyをご紹介します。
過去にもmpl_financeとmplfinanceをご紹介しました。
-
【コード解説】Pythonで株価チャートを描く【mpl_finance編】
続きを見る
-
【コード解説】Pythonで株価チャートを描く【mplfinance編】
続きを見る
plotlyはこれらとかなり違います。
一番の違いはインタラクティブなチャートが描けることです。
インタラクティブなチャートでは、カーソルを合わせると該当データが表示されたり、チャートの拡大や縮小などができます。
また、Pythonで株価データを扱う記事については記事が散在しているのでこちらにまとめました!
株価データの取得方法やテクニカル分析の計算方法についてはこちらからどうぞ。
-
【まとめ】Pythonで株価データを扱う
続きを見る
-
【コード解説】Pythonで株価チャートを描く【mpl_finance編】
続きを見る
-
【コード解説】Pythonで株価チャートを描く【mplfinance編】
続きを見る
目次
【コード解説】Pythonで株価チャートを描く【plotly編】
おさらい:株価を取得する
まずはおさらいとして、チャートを描くために必要な株価データを取得します。
例として、トヨタ自動車(7203)の日足データを取得します。
過去半年分のデータを取ってみましょう。
株価データを取得するために使ったコードはこちらです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import sys from yahoo_finance_api2 import share from yahoo_finance_api2.exceptions import YahooFinanceError import pandas as pd import datetime import trading_calendars as tc my_share = share.Share('7203.T') symbol_data = None try: symbol_data = my_share.get_historical( share.PERIOD_TYPE_MONTH, 6, share.FREQUENCY_TYPE_DAY, 1) except YahooFinanceError as e: print(e.message) sys.exit(1) df = pd.DataFrame(symbol_data) df["datetime"] = pd.to_datetime(df.timestamp, unit="ms") |
取得したデータがこちらです。
このデータを使って、plotlyでチャートを描いていきます。
コードの内容を詳しく知りたい方は、こちらの記事で解説しているので参考にしてください。
-
【コード解説】Pythonで株価データを取得する!【3つの方法を解説】
-
【Pythonコード解説】yahoo_finance_api2で日本株の株価データを取得する
plotlyでローソク足チャートを描く
まずは基本的なローソク足チャートを描いていきます。
Candlestick
ローソク足チャートを描くには、plotlyのCandlestickを使います。
まずはコードをどうぞ。
1 2 3 4 5 6 7 | import plotly.graph_objects as go fig = go.Figure( data=[go.Candlestick(x=df["datetime"], open=df["open"], high=df["high"], low=df["low"], close=df["close"], name="OHLC")] ) fig.show() |
これで表示されるチャートがこちらです。
ローソク足チャートを使うためにはplotly.graph_objectsにあるCandlestickを使います。
Candlestickには、日時、始値、高値、安値、終値データを引き渡せばOKです。
シンプルですね。
インタラクティブにチャートを扱えます
こちらのチャートは、カーソルを合わせるとデータが表示されたり、チャートの拡大や縮小が可能です。
細かいところを拡大して確認できたりするのでとても便利です。
下にあるデータの範囲を選択できるバーは削除することができます。
チャートを直接いじくれるので、僕は基本的にここはなしに設定しています。
この場合はfig.update(layout_xaxis_rangeslider_visible=False)と追加すればOKです。
1 2 3 4 5 6 7 8 9 | import plotly.graph_objects as go fig = go.Figure( data=[go.Candlestick(x=df["datetime"], open=df["open"], high=df["high"], low=df["low"], close=df["close"], name="OHLC")] ) fig.update(layout_xaxis_rangeslider_visible=False) #追加 fig.show() |
これで表示されるチャートがこちらです。
以降、このバーは非表示にします。
タイトルなどを追加する
次にタイトルなどの情報を追加します。
x軸とy軸の名前もつけてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import plotly.graph_objects as go fig = go.Figure( data=[go.Candlestick(x=df["datetime"], open=df["open"], high=df["high"], low=df["low"], close=df["close"], name="OHLC")] ) fig.update(layout_xaxis_rangeslider_visible=False) #追加 # Layout fig.update_layout( title={ "text": "トヨタ自動車(7203)の日足チャート", "y":0.9, "x":0.5, }, yaxis_title='株価', xaxis_title="Date" ) fig.show() |
表示されるチャートがこちらです。
タイトルなどを設定するにはupdate_layoutを使います。
ここでタイトルやx軸やy軸の名前も指定できます。
タイトルでは、xとyを指定していますが、これは0〜1の範囲で指定します。
x=0.5というのは横軸でちょうど真ん中という意味です。y=0.9はチャートの縦軸でほぼ一番上を指します。(y=1だと文字がはみ出ます)
xaxis_titleやyaxis_titleは名前の通りですね。
これで必要な情報を書き込むことができました。
営業日のみを表示する
最後に営業日のみだけを表示するようにチャートをいじくってみます。
これまでのチャートはところどころ不自然な空白があります。
これは土日と祝日によるものです。
年末年始やゴールデンウィークを見ると隙間が目立ちます。
よって、より見やすいチャートにするために、株式市場が開いている営業日のみを表示するようにします。
plotlyには、指定した日付データを非表示にする機能があります。
非表示にしたい日付データをリスト形式で渡せばOKです。
先ほど取得したトヨタの株価データの日付をもとに、非表示にしたい日付をリストアップします。
これにはpandasのdate_rangeを使うと便利です。
data_rangeで対象期間の日付リストを取得して、それらが株価データの日付リストに含まれているかをチェックします。
含まれていないものをリストアップすれば、非表示にしたい日付リストが出来上がります。
コードとしては3行で完了します。
1 2 3 4 5 6 7 8 9 10 | import pandas as pd #日付リストを取得 d_all = pd.date_range(start=df['datetime'].iloc[0],end=df['datetime'].iloc[-1]) #株価データの日付リストを取得 d_obs = [d.strftime("%Y-%m-%d") for d in df['datetime']] # 株価データの日付データに含まれていない日付を抽出 d_breaks = [d for d in d_all.strftime("%Y-%m-%d").tolist() if not d in d_obs] |
d_breaksが非表示にしたい日付リストになります。
d_breaksを非表示にしてチャートを描くコードがこちらです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import plotly.graph_objects as go import pandas as pd d_all = pd.date_range(start=df['datetime'].iloc[0],end=df['datetime'].iloc[-1]) d_obs = [d.strftime("%Y-%m-%d") for d in df['datetime']] d_breaks = [d for d in d_all.strftime("%Y-%m-%d").tolist() if not d in d_obs] fig = go.Figure( data=[go.Candlestick(x=df["datetime"], open=df["open"], high=df["high"], low=df["low"], close=df["close"], name="OHLC")] ) fig.update(layout_xaxis_rangeslider_visible=False) #追加 # Layout fig.update_layout( title={ "text": "トヨタ自動車(7203)の日足チャート", "y":0.9, "x":0.5, }, yaxis_title='株価', xaxis_title="Date" ) # 不要な日付を非表示にする fig.update_xaxes( rangebreaks=[dict(values=d_breaks)] ) fig.update(layout_xaxis_rangeslider_visible=False) fig.show() |
完成したチャートがこちらです。
これで営業日のみを表示することができ、不自然な空白はなくなりました。
以上が、基本的なローソク足の描き方になります。
複数のチャートを組み合わせる
次に複数のグラフを組み合わせてみます。
出来高や移動平均線などを追加していきます。
plotlyでもこのようなチャートを描くことはもちろん可能です。
各テクニカル分析の計算のためのコードはこちらの記事で解説しています。
-
【コード解説】Pythonで株価データから主要なテクニカル分析を計算して可視化する【移動平均線、MACD、RSI】
make_subplots
複数のチャートを描くには、make_subplotsを使います。
これを使うと、複数のチャートを描いたり、同じチャートの中に複数のグラフを描くことができるようになります。
matplotlibのsubplotsとほぼ同じような使い方です。
基本的な使い方としては、subplotsでfigを定義して、fig.add_traceで各チャートを追加していく流れになります。
出来高を追加する
まずは出来高を追加してみます。
いきなりコードからどうぞ。なるべく多くコメントつけました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots # 非表示にする日付をリストアップ d_all = pd.date_range(start=df['datetime'].iloc[0],end=df['datetime'].iloc[-1]) d_obs = [d.strftime("%Y-%m-%d") for d in df['datetime']] d_breaks = [d for d in d_all.strftime("%Y-%m-%d").tolist() if not d in d_obs] # figを定義 fig = make_subplots(rows=2, cols=1, shared_xaxes=True, vertical_spacing=0.05, row_width=[0.2, 0.7], x_title="Date") # Candlestick fig.add_trace( go.Candlestick(x=df["datetime"], open=df["open"], high=df["high"], low=df["low"], close=df["close"], name="OHLC"), row=1, col=1 ) # Volume fig.add_trace( go.Bar(x=df["datetime"], y=df["volume"], name="Volume"), row=2, col=1 ) # Layout fig.update_layout( title={ "text": "トヨタ自動車(7203)の日足チャート", "y":0.9, "x":0.5, } ) # y軸名を定義 fig.update_yaxes(title_text="株価", row=1, col=1) fig.update_yaxes(title_text="出来高", row=2, col=1) # 不要な日付を非表示にする fig.update_xaxes( rangebreaks=[dict(values=d_breaks)] ) fig.update(layout_xaxis_rangeslider_visible=False) fig.show() |
make_subplotsで、rows(行)とcols(列)を指定し、shared_xaxes=Trueとしてx軸を共有するように設定します。
vertical_spacingはチャート間の隙間の大きさで0〜1で指定します。
この設定は好みですが、僕はだいたい0.05にすることが多いです。適宜調整してみてください。
row_widthではrow(行)の高さを指定します。x_titleはその名の通り、x軸名です。
y軸名は2つあるので、fig.update_yaxesを使ってそれぞれ指定します。
add_traceでrowとcolを指定することで、任意の場所にチャートを描くことができます。
このコードで描かれるチャートがこちらです。
出来高も表示できていることがわかります。
移動平均線を追加する
次に移動平均線を追加します。
テクニカル分析の計算方法についてはこちらの記事で解説しているので、詳細は割愛します。
-
【コード解説】Pythonで株価データから主要なテクニカル分析を計算して可視化する【移動平均線、MACD、RSI】
続きを見る
ここでは、先ほどの出来高付きのチャートに、5日と25日移動平均線を追加してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots d_all = pd.date_range(start=df['datetime'].iloc[0],end=df['datetime'].iloc[-1]) d_obs = [d.strftime("%Y-%m-%d") for d in df['datetime']] d_breaks = [d for d in d_all.strftime("%Y-%m-%d").tolist() if not d in d_obs] # SMAを計算 df["SMA5"] = df["close"].rolling(window=5).mean() df["SMA25"] = df["close"].rolling(window=25).mean() # figを定義 fig = make_subplots(rows=2, cols=1, shared_xaxes=True, vertical_spacing=0.05, row_width=[0.2, 0.7], x_title="Date") # Candlestick fig.add_trace( go.Candlestick(x=df["datetime"], open=df["open"], high=df["high"], low=df["low"], close=df["close"], name="OHLC"), row=1, col=1 ) # SMA fig.add_trace(go.Scatter(x=df["datetime"], y=df["SMA5"], name="SMA5", mode="lines"), row=1, col=1) fig.add_trace(go.Scatter(x=df["datetime"], y=df["SMA25"], name="SMA25", mode="lines"), row=1, col=1) # Volume fig.add_trace( go.Bar(x=df["datetime"], y=df["volume"], name="Volume"), row=2, col=1 ) # Layout fig.update_layout( title={ "text": "トヨタ自動車(7203)の日足チャート", "y":0.9, "x":0.5, } ) # y軸名を定義 fig.update_yaxes(title_text="株価", row=1, col=1) fig.update_yaxes(title_text="出来高", row=2, col=1) # 不要な日付を非表示にする fig.update_xaxes( rangebreaks=[dict(values=d_breaks)] ) fig.update(layout_xaxis_rangeslider_visible=False) fig.show() |
移動平均線は1行で計算完了です。
チャートで追加されたのはSMAの部分だけですね。
完成したチャートがこちらです。
移動平均線も追加されました。
ここまできたらYahooファイナンスや株探とかで見るようなチャートと同じレベルのものになってきます。
応用編:複数のテクニカル分析を組み合わせる
最後に複数のテクニカル分析を組み合わせて表示してみましょう。
ここまで使用した出来高と移動平均線に加えて、こちらの記事で紹介しているMACDとRSIも追加してみます。
-
【コード解説】Pythonで株価データから主要なテクニカル分析を計算して可視化する【移動平均線、MACD、RSI】
続きを見る
コードの詳細についてはこちら↑の記事でも書いているので割愛します。
計算に使ったコードだけのせておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | def macd(df): FastEMA_period = 12 # 短期EMAの期間 SlowEMA_period = 26 # 長期EMAの期間 SignalSMA_period = 9 # SMAを取る期間 df["MACD"] = df["close"].ewm(span=FastEMA_period).mean() - df["close"].ewm(span=SlowEMA_period).mean() df["Signal"] = df["MACD"].rolling(SignalSMA_period).mean() return df def rsi(df): # 前日との差分を計算 df_diff = df["close"].diff(1) # 計算用のDataFrameを定義 df_up, df_down = df_diff.copy(), df_diff.copy() # df_upはマイナス値を0に変換 # df_downはプラス値を0に変換して正負反転 df_up[df_up < 0] = 0 df_down[df_down > 0] = 0 df_down = df_down * -1 # 期間14でそれぞれの平均を算出 df_up_sma14 = df_up.rolling(window=14, center=False).mean() df_down_sma14 = df_down.rolling(window=14, center=False).mean() # RSIを算出 df["RSI"] = 100.0 * (df_up_sma14 / (df_up_sma14 + df_down_sma14)) return df # MACDを計算する df = macd(df) # RSIを算出 df = rsi(df) |
計算結果はこんな感じです。
これを使ってチャートを描いていきます。
今回はローソク足、出来高、MACD、RSIの4チャートを描くので、rowsは4になります。
あとはこれまでと同様にadd_traceでチャートを追加しておけばOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots # figを定義 fig = make_subplots(rows=4, cols=1, shared_xaxes=True, vertical_spacing=0.05, row_width=[0.2, 0.2, 0.2, 0.7], x_title="Date") # Candlestick fig.add_trace( go.Candlestick(x=df["datetime"], open=df["open"], high=df["high"], low=df["low"], close=df["close"], name="OHLC"), row=1, col=1 ) # SMA fig.add_trace(go.Scatter(x=df["datetime"], y=df["SMA5"], name="SMA5", mode="lines"), row=1, col=1) fig.add_trace(go.Scatter(x=df["datetime"], y=df["SMA25"], name="SMA25", mode="lines"), row=1, col=1) # Volume fig.add_trace( go.Bar(x=df["datetime"], y=df["volume"], name="Volume"), row=2, col=1 ) # MACD fig.add_trace(go.Scatter(x=df["datetime"], y=df["MACD"], name="MACD", mode="lines"), row=3, col=1) fig.add_trace(go.Scatter(x=df["datetime"], y=df["Signal"], name="Signal", mode="lines"), row=3, col=1) # RSI fig.add_trace(go.Scatter(x=df["datetime"], y=df["RSI"], name="RSI", mode="lines"), row=4, col=1) # Layout fig.update_layout( title={ "text": "トヨタ自動車(7203)の日足チャート", "y":0.9, "x":0.5, } ) # y軸名を定義 fig.update_yaxes(title_text="株価", row=1, col=1) fig.update_yaxes(title_text="出来高", row=2, col=1) fig.update_yaxes(title_text="MACD", row=3, col=1) fig.update_yaxes(title_text="RSI", row=4, col=1) #不要な日付を非表示にする fig.update_xaxes( rangebreaks=[dict(values=d_breaks)] ) fig.update(layout_xaxis_rangeslider_visible=False) fig.show() |
rows=4となり、MACDとRSIのチャートを追加して、y軸名を定義すればOKです。
慣れると結構シンプルで使いやすいです。
完成したチャートがこちらです。
いい感じに全てのテクニカル分析が盛り込まれていることがわかります。
plotlyは特に設定しなくてもきれいなグラフが描けるのでとても便利です。
データの分析・可視化にはPythonが最適!
本記事で紹介したコードは、全てPythonを使って書いています。
Pythonはデータの分析や可視化を得意とするプログラミング言語で、さらにAI関連のライブラリーも豊富で昨今のAIブームで需要が急拡大しています。
→ 【いますぐ始められます】データ分析をするならPythonが最適です。
また、Pythonは比較的学びやすい言語でもあります。
実際、僕は社会人になってからPythonを独学で習得して転職にも成功し、Python独学をきっかけに人生が大きく変わりました。
→ 【実体験】ゼロからのPython独学を決意してから転職を掴み取るまでのお話。
Pythonの学習方法についてはいろいろな方法があります。
僕はUdemyを選びましたが、書籍やプログラミングスクールも選択肢になります。
→ 【決定版】Python独学ロードマップ【完全初心者からでもOKです】
→ 【まとめ】Pythonが学べるおすすめプログラミングスクール
→ プログラミングの独学にUdemyをおすすめする理由!【僕はUdemyでPythonを独学しました!】
まとめ
いかがでしたでしょうか。
今回はplotlyを使った株価チャートの描き方について解説しました。
過去のご紹介したmpl_financeやmplfinanceと比べて、インタラクティブで美しいチャートが簡単に描けることが一番の特徴です。
plotlyを使えば、簡単にきれいでかっこいいグラフを描けるので、仕事などでも役立ちます。
僕も最近、仕事でグラフを描くときにはplotlyで書いていることが多くなってきました。(Excel苦手なので。。。)
チャートを描くためには、株価データの取得やテクニカル分析の計算が必要になります。
Pythonで株価データを扱う記事については記事が散在しているのでこちらにまとめています。
株価データの取得方法やテクニカル分析の計算方法やその他の可視化方法についてはこちらからどうぞ。
-
【まとめ】Pythonで株価データを扱う
続きを見る
ここまで読んでくださってありがとうございました。
-
【コード解説】Pythonで株価チャートを描く【mpl_finance編】
続きを見る
-
【コード解説】Pythonで株価チャートを描く【mplfinance編】
続きを見る