こんにちは。TATです。
今日のテーマは、「株価データの極大値と極小値を計算して可視化する!」です。
過去に任意期間における最大値と最小値を計算する解説記事を書きましたが、今回は極大値と極小値なので少しニュアンスが異なります。
-
【Pythonで株式投資】任意期間における高値・安値を計算して可視化する!
続きを見る
極大値や極小値とは、適当な領域における最大値や最小値を示します。
株価チャートを見ていると、波のように上昇と下落を繰り返しながら、トレンドを描いていく傾向が見られます。
それぞれの波では、最大となる点と最小となる点が存在します。
これらが極大値や極小値に相当します。
株探などのサイトを見ても、こういった値がチャートに併記されている場合が多いです。
引用元:株探(トヨタ自動車)
本記事では、Pythonを使って極大値や極小値を自動的に算出し、さらにそれらをチャートに可視化する方法について解説していきます。
極大値や極小値は、今後の株価を予測する上で目安となる場合が多いのでプログラムで自動算出できると便利な使い方がいろいろできます。
目次
【Pythonで株式投資】株価データの極大値と極小値を計算して可視化する!
(おさらい)株価データの取得とローソク足チャートの描画
まずは、今回利用する株価データの取得と、そのデータを使ってローソク足チャートを描く方法についてサクッとみておきます。
株価データの準備
まずは株価データを取得します。
こちらについては過去記事でも解説しているので、詳細は割愛します。
-
【日本株対応】Pythonで株価のローソク足データを取得する方法まとめ【CSV、ライブラリ、スクレイピング】
続きを見る
-
【Pythonコード解説】yahoo_finance_api2で日本株の株価データを取得する
続きを見る
今回はyahoo_finance_api2を利用して株価データを取得しました。
対象銘柄はトヨタ自動車(証券コード:7203)で過去1年分の株価データを取得しています。
使用したコードはこちらです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import sys from yahoo_finance_api2 import share from yahoo_finance_api2.exceptions import YahooFinanceError import pandas as pd my_share = share.Share('7203.T') symbol_data = None try: symbol_data = my_share.get_historical( share.PERIOD_TYPE_YEAR, 1, 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を使います。
Plotlyの使い方についてはこちらの記事で解説済みなので、ここでも詳細は割愛していきます。
-
PythonのPlotlyでインタラクティブな株価のローソク足チャートを描く【コード解説】
続きを見る
ここでは出来高も合わせて表記しています。
使用したコードはこちらです。
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() |
これで表示されるチャートがこちらです。
ポイントは、営業日のみが表示されるように不要な日付はマスキングしていることです。
こうすることで、不自然な空白がなくなりきれいなチャートを描くことができます。
Pythonで極大値と極小値を計算する
さて、ここからが本題です。
先ほど取得したデータを使って、極大値と極小値を計算していきます。
scipy.signalの"argrelmin"と"argrelmax"を利用する
極大値と極小値を求めるには、いろいろな方法があります。
ゼロからプログラムを作るのも良いですが、ここではscipyというライブラリを使っていきます。
scipyは、数値解析に必要な様々な機能を備えたライブラリです。
工学系の方ならほぼ必ず使うと思います。
このscipyの中にsignalがあり、この中にargrelminとargrelmaxという関数があります。
それぞれ極小値と極大値を計算するための関数です。
極大値を算出してみる
早速、まずは極大値を計算してみましょう。
極大値を計算するには、argrelmaxを使います。
ここにはarray形式でデータを渡す必要があるので、カラムを指定したらvaluesで配列に変換して渡します。
これで、極大値に該当するindexが返ってきます。
簡単ですね。前後の数値を見てどちらも対象データよりも低ければ極大値と判断しています
チャートで可視化する
算出した極大値を早速可視化してみます。
取得できた値は、ただのindexなので、これを使って該当するデータを抽出する必要があります。
locを使えば、任意のindexのデータを取得することができます。
このhighカラムをチャートに追加すれば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 53 54 55 56 57 58 59 60 61 62 63 | 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 ) ###################追加部分##################### # 極大値 peak = df.loc[argrelmax(df["high"].values)] fig.add_trace( go.Scatter( x=peak["datetime"], y=peak["high"], showlegend=False, mode="markers", marker=dict( size=5, color='blue', symbol='triangle-down') ,) ) ############################################## # 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() |
完成したチャートがこちらです。
きちんと極大値に印がついていることが確認できます。
極小値も同様に処理すればOKです。
(少し応用)ノイズを消す
基本的な可視化がわかったところで少し応用編に進みます。
先ほどのチャートはいい感じに見えますが、一つ大きな問題があります。
それが、極大値が多すぎるということですw
細かくデータを見すぎて、小さな極大値も表示するようになっています。
これだとチャートが煩雑になってしまい、みるべきデータがわかりにくくなってしまいます。
ということでノイズを取ります。
これには、orderという引数を使います。
これで左右それぞれ何個のデータを考慮するかを指定することができます。
試してみましょう。
例としてorderを5にしてみます。
こんな感じに指定すればOKです。
1 | argrelmax(df["high"].values, order=5) |
これで完成したチャートがこちらです。
だいぶスッキリしたことがお分かりいただけるかと思います。
このように、orderをうまく調整してあげれば、不要なノイズを取り除くことができます。
(完成形)極大値と極小値をチャートに描画する
ここまできたらやることは自明と思いますが、一応極小値も描画したチャートも紹介しておきます。
やることは極大値と全く同じです。
コードはこちらです。
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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | 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 ) ###################追加部分##################### # 極大値 peak = df.loc[argrelmax(df["high"].values, order=5)] fig.add_trace( go.Scatter( x=peak["datetime"], y=peak["high"], showlegend=False, mode="markers", marker=dict( size=5, color='blue', symbol='triangle-down') ,) ) # 極小値 valley = df.loc[argrelmin(df["low"].values, order=5)] fig.add_trace( go.Scatter( x=valley["datetime"], y=valley["low"], showlegend=False, mode="markers", marker=dict( size=5, color='blue', symbol='triangle-up') ,) ) ############################################## # 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() |
完成したチャートがこちらです。
極大値と極小値がきちんと描画されていることが確認できます。
(おまけ)極大値と極小値をいろいろな方法で可視化する
最後におまけです。
極大値と極小値を使った可視化方法を2つご紹介します。
ここで紹介するのは僕がパッと思いついただけのものなので、もっといい可視化方法があれば教えてくださいm(_ _)m
極大値、極小値を線で結ぶとトレンドが見える
1つ目は極大値同士と極小値同士を線で結ぶことです。
これまでのチャートでは、印をつけていただけですが、これらを結ぶとトレンドが見えてきます。
トレンドラインは、極大値同士、あるいは極小値同士を結ぶことが多いので、トレンドラインを描画しているのとほぼ同義になります。
完成したチャートがこんな感じです。
極小値と極大値がだんだんと上がっていれば上昇トレンド、下がっていたら下降トレンドと判断することができます。
直前の極大値と極小値をプロットする
2つ目の可視化方法は、直前の極大値と極小値をプロットするというものです。
直前の極大値や極小値は、いろいろな使い方ができます。
株価の今後の動きのターゲットの目安になったり、ピボットポイントに活用することもできます。
直前の極大値を超えたら買いみたいな使い方もできます。
この方法で可視化するとこんな感じになります。
これらのラインを超えると大きく株価が動く可能性が出てきます。
このチャートを見ると、2021年5月に直前の極大値を超えてから大きく株価が上昇していることがわかりますね。
こんな感じで、直前の極大値や極小値をうまく活用できる場面があります。
必ずとは言い切れないので、さらにいろいろと検証する必要があると思いますが、1つの活用方法として紹介しました。
データの分析・可視化にはPythonが最適!
本記事で紹介したコードは、全てPythonを使って書いています。
Pythonはデータの分析や可視化を得意とするプログラミング言語で、さらにAI関連のライブラリーも豊富で昨今のAIブームで需要が急拡大しています。
→ 【いますぐ始められます】データ分析をするならPythonが最適です。
また、Pythonは比較的学びやすい言語でもあります。
実際、僕は社会人になってからPythonを独学で習得して転職にも成功し、Python独学をきっかけに人生が大きく変わりました。
→ 【実体験】ゼロからのPython独学を決意してから転職を掴み取るまでのお話。
Pythonの学習方法についてはいろいろな方法があります。
僕はUdemyを選びましたが、書籍やプログラミングスクールも選択肢になります。
→ 【決定版】Python独学ロードマップ【完全初心者からでもOKです】
→ 【まとめ】Pythonが学べるおすすめプログラミングスクール
→ プログラミングの独学にUdemyをおすすめする理由!【僕はUdemyでPythonを独学しました!】
まとめ
いかがでしたでしょうか。
ここでは「株価データの極大値と極小値を計算して可視化する!」というテーマで解説してきました。
極大値や極小値は、今後の株価を予測する上で目安となったり、ピボットピントに活用できたりと、いろいろな利用方法があります。
プログラムで計算することができれば自動売買のロジックに利用することも可能になります。
本記事で紹介しているコードは自由にパクっていただいてもらって構いませんので、どんどん活用いただけたらと思います。
そしてさらにいい可視化方法があれば是非とも教えてくださいm(_ _)m
ここまで読んでくださり、ありがとうございました。