こんにちは。TATです。
今日のテーマは「Pythonで高値・安値を計算して可視化する」です。
任意の期間における高値および安値を計算するとともに、計算結果を可視化していく方法について解説していきます。
高値と安値をうまく可視化することができると、エントリーポイントの基準に活用できたりすることができるので便利です。
特に長いレンジ期間からの上抜けあるいは下抜けはトレンドが大きく動く可能性があるので注目に値します。
目次
【Pythonで株式投資】任意期間における高値・安値を計算して可視化する!
(おさらい)株価データを用意する
まずは株価データを用意します。
今回は、yahoo_finance_api2を使って取得していきます。
例としてトヨタ自動車の株価データを2年分日足でとってみます。
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, 2, 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") df.head()
取得できたデータがこちらです。
このデータを使って高値と安値を計算していきます。
yahoo_finance_api2を使った株価データの取得方法については過去記事で解説しているのでご参照ください。
【Pythonコード解説】yahoo_finance_api2で日本株の株価データを取得する
続きを見る
任意の期間における高値・安値を計算する方法
データの準備ができたところで任意の期間における高値と安値を計算していきます。
この計算は非常に簡単でわずか1行で完了します。
rolling関数で一発計算
任意期間の高値と安値を計算するには、移動平均線などの計算でも使うrolling関数を使います。
【コード解説】Pythonで株価データから主要なテクニカル分析を計算して可視化する【移動平均線、MACD、RSI】
続きを見る
rolling関数を使えば、任意の期間において様々な計算をすることができます。
平均を計算すれば移動平均になります。
例えば、次のコードでは25日移動平均線を計算しています。
df["close"].rolling(window=25).mean()
終値に対して、windowで期間を指定し、最後のmean()は平均値を計算することを意味しています。
このmean()をmax()に書き換えれば最大値、つまりは高値を算出することができます。
min()なら安値です。
また、この場合は終値ではなくてそれぞれ高値と安値で計算する必要があります。
# 高値を計算 df["high"].rolling(window=25).max() # 安値を計算 df["low"].rolling(window=25).min()
上記のコードで過去25日間における高値と安値を計算することができます。
期間を変えるならこのwindowの数字を弄ればOKです。
簡単すぎますね。
カラムを追加してデータを確認
計算結果を新たなカラムに格納すればデータを追加することができます。
可視化も容易です。
ローソク足チャートを使った可視化については後述します。
期間はよく利用されるものが良い
ここで少し余談ですが、この期間設定についてです。
「どの期間を使えばいいのかわからない」といった疑問が湧いてくるかと思います。
この答えはいろいろなケースが考えられるので一概には言えませんが、1つの考え方としては、移動平均線などでよく利用する期間を用いることです。
例えば、日足なら25日、50日、75日、120日、200日など、週足なら40週や52週などです。
最終的にはチャートを見ながら適切に判断することになっていくと思いますが、最初の取っ掛かりとしては、こういった身近な期間を用いると良いかもしれません。
計算結果を可視化する
計算が完了したところで次に可視化していきます。
先ほどちらっと折れ線グラフで可視化してしまいましたが、ここからはきちんとローソク足チャートで可視化していきます。
過去にローソク足チャートを描く方法をいくつか解説してきました。
Pythonのmpl_financeで株価のローソク足チャートを描く方法【コード解説】
続きを見る
Pythonのmplfinanceで株価のローソク足チャートを描く方法【コード解説】
続きを見る
PythonのPlotlyでインタラクティブな株価のローソク足チャートを描く【コード解説】
続きを見る
今回は一番いけてるグラフが描ける(と個人的に思ってる)plotlyを使っていきます。
plotlyで株価チャートを描く方法については上記の記事で解説しているので、ここでは細かい説明は省きます。
(おさらい)基本のチャート
まずはおさらいとして基本の形となるチャートを描いてみます。
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")] ) # 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()
このコードで描けるチャートがこちらです。
ポイントは、 土日や祝日を非表示にすることです。
これをしないと不自然な空白期間が出来てしまうことになります。
このためにrange_breaksを指定して、非表示にする日付を設定しています。
これで、不自然な空白がなくなり、営業日のみの表示となります。
ローソク足チャートだけだと寂しいので出来高を加えます。
複数のチャートを描くにはmake_subplotsを使います。
行数と列数を指定して、それぞれにグラフを描けばOKです。
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 ) # 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()
完成したグラフがこちらになります。
出来高が追加されたことが確認できます。
基本のチャートができたところで高値と安値を加えていきます。
高値と安値を描画する
先ほど計算した高値と安値を描いてみます。
移動平均線を加えるときと全く同じで、add_traceを使えばOKです。
import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots # 高値と安値を計算 df["high_25"] = df["high"].rolling(window=25).max() df["low_25"] = df["low"].rolling(window=25).min() 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 ) # 高値と安値を追加 fig.add_trace(go.Scatter(x=df["datetime"], y=df["high_25"], name="25日高値", mode="lines"), row=1, col=1) fig.add_trace(go.Scatter(x=df["datetime"], y=df["low_25"], name="25日安値", 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()
high_25とlow_25というカラムを追加してグラフに加えました。
このコードで完成するチャートがこちらです。
過去25日間における高値と安値が描かれていることが確認できますね。
これを使えば、例えば過去25日の高値(あるいは安値)を更新したらエントリーするなどといった使い方もできるようになります。
より信ぴょう性をあげるなら、さらに期間を伸ばしてもいいかもしれません。
さらに言えば、現在の高値が過去何日間の高値(あるいは安値)に該当するのかをチェックするのもいいかもしれません。
この期間が長ければ長いと強力なシグナルになります。
データの分析・可視化にはPythonが最適!
本記事で紹介したコードは、全てPythonを使って書いています。
Pythonはデータの分析や可視化を得意とするプログラミング言語で、さらにAI関連のライブラリーも豊富で昨今のAIブームで需要が急拡大しています。
→ 【いますぐ始められます】データ分析をするならPythonが最適です。
また、Pythonは比較的学びやすい言語でもあります。
実際、僕は社会人になってからPythonを独学で習得して転職にも成功し、Python独学をきっかけに人生が大きく変わりました。
→ 【実体験】ゼロからのPython独学を決意してから転職を掴み取るまでのお話。
Pythonの学習方法についてはいろいろな方法があります。
僕はUdemyを選びましたが、書籍やプログラミングスクールも選択肢になります。
→ 【決定版】Python独学ロードマップ【完全初心者からでもOKです】
→ 【まとめ】Pythonが学べるおすすめプログラミングスクール
→ プログラミングの独学にUdemyをおすすめする理由!【僕はUdemyでPythonを独学しました!】
まとめ
いかがでしたでしょうか。
今回は「Pythonで高値・安値を計算して可視化する」というテーマで解説しました。
任意の期間における高値および安値を計算して、それを可視化することができると、エントリーポイントや利確の基準が明確になります。
特に長いレンジ期間を経て、高値あるいは安値を更新した銘柄はトレンドが大きく変わる可能性があるので注目に値します。
可視化することができれば、あらかじめ「ここまできたらエントリーだな」みたいな感じで目星をつけることにも役立ちます。
皆さんの参考になれば幸いです。
またPythonで株価を扱う方法についてはこちらの記事にまとめているのでご参照ください。
Pythonで株価データを扱う方法まとめ【データの取得・分析・可視化等、なんでもできます】
続きを見る
ここまで読んでくださり、ありがとうございました。