こんにちは。TATです。
今日のテーマは「Pythonで株価の新高値ブレイクを自動検出する方法」です。
株価がボックス圏を抜けて新高値ブレイクするタイミングをPythonを使って自動検出する方法について解説します。
さらにブレイクしたタイミングをチャートで可視化する方法についてもあわせてご紹介していきます。
この方法を使えばボックス圏から株価がブレイクしたタイミングを自動検出することができるようになり、エントリーポイントの判定にも活用できます。
目次
最初に完成したチャートをご紹介
最初に、成果物を先に紹介してしまいます。
こんな感じでにボックス圏からのブレイクを自動検出することができるようになります。
こちらはトレジャー・ファクトリー(証券コード: 3093)の日足チャートです。
オレンジの丸がボックス圏をブレイクしたポイントになります。
直前の高値を青線で加えました。
ちなみに移動平均線は、20日、50日、200日です。
自分で言うのもなんですが、なかなかいい感じなのではないでしょうかw
直前の高値を検出して、そこをブレイクしたタイミングをうまく捉えることができています。
ここでエントリーすることができればそこそこいい結果が得られそうな感じがします、たぶん。
Pythonで株価の新高値ブレイクを自動検出する方法
それでは、ここから上記のチャートを作る方法について順番に解説していきます。
まずは必要な作業を確認しておきます。
必要な作業の確認
- 高値から極大値を検出してその時の高値と日付を取得する(ここである程度のノイズを消しておく)
- 当日の高値が直近の極大値を超えた日を検出する
- 前日データと比較して、連日でブレイクした日を排除する
- チャートで可視化する
ざっくりの次のような流れになります。
順番に解説していきます。
高値から極大値を検出してその時の高値と日付を取得する(ここである程度のノイズを消しておく)
まずは株価の高値データから極大値を検出していきます。
この時の高値と日付が後々必要になってきます。
次のコードでは、トレジャーファクトリーの株価データを取得して、極大値を検出しています。
詳細についてはこちらの記事でも解説しております。
from pandas_datareader import data from scipy.signal import argrelmax # 株価データの取得 df = data.DataReader("3093.T","yahoo", start="2019-01-01") df = df[["Open", "High", "Low", "Close", "Volume"]] peaks = argrelmax(df["High"].values, order=5) df_peak = df.iloc[peaks] df_peak.head()
極大値となっているデータを判定して抽出することができました。
この高値と日付データを株価データ(df)に加えます。
import pandas as pd import numpy as np # 極大値の高値データの追加 df["Peak_Price"] = df_peak["High"] # 極大値の日付データの追加 df["Peak_Date"] = df.apply(lambda x: x.name if not pd.isnull(x["Peak_Price"]) else np.nan, axis=1) # Nullを直前の値で補完 df["Peak_Date"] = df["Peak_Date"].fillna(method="ffill") df["Peak_Price"] = df["Peak_Price"].fillna(method="ffill") df.tail()
Peak_PriceとPeak_Dateが追加されました。
直前の極大値の値が格納されていることが確認できます。
これで最初のステップは完了です。
【Pythonで株式投資】株価データの極大値と極小値を計算して可視化する!
続きを見る
当日の高値が直近の極大値を超えた日を検出する
次に、当日の高値が直近の極大値を超えた日を検出します。
これは一行で完了します。
df["Break_d0"] = df["High"] > df["Peak_Price"] df.tail()
当日のデータであることがわかるようにd0をつけました。
これで直近の高値を超えた場合にはTrue、そうでない場合はFalseとなります。
ステップ2はこれでOKです。
前日データと比較して、連日でブレイクした日を排除する
次に前日データを比較して、連日でブレイクした日を排除します。
上記の結果で見ると、2022年の12月9日と12日で連続でブレイクしています。
12日の方は不要なので、こういったデータを排除していきます。
これを行うには、前日データと比較すればOKです。
# Break_d0を1日シフト df["Break_d1"] = df["Break_d0"].shift() # 前日と比較して、連続してるものは排除してNullとする BreakしていたらPeak_Priceを代入する df["Break"] = np.where(df["Break_d0"] - df["Break_d1"]==1, df["Peak_Price"], np.nan) df.tail()
これで、Breakの列に数字が入っているものが、ブレイクした日になります。
連日でブレイクしているものは排除されました。
直近のPeak_Priceを入れたのは、可視化の際に都合が良いためです。
チャートで可視化する
最後にチャートで可視化してみます。
今回は、可視化用ライブラリとしてmplfinanceを使います。
Pythonのmplfinanceで株価のローソク足チャートを描く方法【コード解説】
続きを見る
移動平均線の準備
まず、移動平均線を準備します。
なくてもいいのですが、見栄えが良くなるので追加しましたw
ここでは20日、50日、200日移動平均線を用意しました。
そしてデータ数を絞るために、直近の200日分のデータに絞ります。
# 移動平均線 df["SMA20"] = df["Close"].rolling(window=20).mean() df["SMA50"] = df["Close"].rolling(window=50).mean() df["SMA200"] = df["Close"].rolling(window=200).mean() # 直近200日分のデータに絞る df = df.tail(200) df.tail()
ブレイクポイントを可視化するための線を設定する
次にブレイクポイントを可視化するための線を設定します。
チャートの青色の点線部分です。
任意の線を追加するには、mplfinance.plotでalinesを指定します。
ここに引きたい線の始点と終点の組み合わせを引き渡せばOKです。
次のコードでは、この青線のリストを作成しています。
lines = [] for d in df[df["Break"].isnull()==False].index: if df.loc[d]["Peak_Date"] > df.index.min(): lines.append([(df.loc[d]["Peak_Date"], df.loc[d]["Peak_Price"]), (df.loc[d].name, df.loc[d]["Peak_Price"])]) print(lines)
リストの中には複数のリストがあります。
各リストにはタプルが2つあり、それぞれ始点と終点を定義しています。
これで準備完了です。
mplfinanceでチャートに描く
次にmplfinanceでこれまでの結果を全て描いていきます。
ついでに見栄えを良くするために体裁とか色々整えたので少しだけコードが長いです。
import mplfinance as mpf import matplotlib my_style = mpf.make_mpf_style( base_mpf_style='binance', rc={ 'xtick.labelsize': 8, 'ytick.labelsize': 8, 'grid.alpha': 0.7, } ) # ローソク足チャート以外に追加するチャートの定義 add_plot = [ mpf.make_addplot(df["SMA20"], panel=0, secondary_y=False, color="orange", width=0.8), mpf.make_addplot(df["SMA50"], panel=0, secondary_y=False, color="purple", width=0.8), mpf.make_addplot(df["SMA200"], panel=0, secondary_y=False, color="blue", width=0.8), mpf.make_addplot(df["Break"], type='scatter', marker='o', markersize=10, panel=0, color="orange"), # オレンジ丸のブレイクポイントを定義 ] # チャートの定義 fig, ax = mpf.plot( df, volume=True, type="candle", style=my_style, returnfig=True, figsize=(10, 5), datetime_format="%Y/%m/%d", addplot=add_plot, tight_layout=True, alines=dict(alines=lines, linewidths=0.7, alpha=0.7, colors="blue", linestyle='-.'), #ここで直近の高値ポイント(青線)を定義 ) # y軸の目盛りのカンマ区切りに変更 ax[0].get_yaxis().set_major_formatter( matplotlib.ticker.FuncFormatter(lambda x, p: format(int(x), ','))) ax[2].get_yaxis().set_major_formatter( matplotlib.ticker.FuncFormatter(lambda x, p: format(int(x), ','))) # ラベル名とラベルサイズの定義 ax[0].set_ylabel("Price", fontsize=9) ax[2].set_ylabel("Volume", fontsize=9) # 罫線はy軸のみに変更 ax[0].grid(axis="y") ax[2].grid(axis="y")
いい感じにチャーチで可視化することができました。
ブレイクポイントはオレンジの丸で示し、直近の高値ポイントを青点線で示しました。
これで新高値ブレイクしているタイミングをうまく捉えることができます。
冒頭でも同じこと言いましたが、結構いい感じですよねw
(おまけ)損切りポイントも加えてみる
最後におまけです。
ブレイクポイントから損切りポイントを計算して加えてみました。
8%を損切りラインにしています。
損切りポイントとして黒線を入れました。
結構うまく機能してますね。
トレジャーファクトリーの例では、損切りにかかることはありませんでした。全部いい感じになります。
ブレイクしたら新たなボックス圏に移動することが多いので、ブレイクポイントで指値を入れておけば結構いい感じに機能しそうな感じがします。
いろいろな銘柄で可視化してみる
トレジャーファクトリーだけだと寂しいので、別の銘柄でもいろいろと可視化してみました。
本記事を書いている2022年12月時点で、僕が個人的に注目していた銘柄をピックアップしました。
日本アクア(証券コード: 1429)
ハードオフコーポレーション(証券コード: 2674)
アクリート(証券コード: 4395)
KeePer技研(証券コード: 6036)
ジェイリース(証券コード: 7187)
(注意点)ボックス圏からの新高値ブレイクが機能するのは上昇局面だけ
ここで注意点です。
このボックス圏からの新高値ブレイクがうまく機能するのは上昇局面にいる時に限ります。
特に下落局面で使うと事故るケースが多い印象です。
トヨタ自動車(7203)で試したら事故りましたw
例としてトヨタ自動車を見てみます。
残念この上ない結果に終わっていますw
ブレイクポイントが天井になって下落に転じているパターンが多い印象です。
このように、ボックス圏からのブレイクが機能するのは、上昇局面の時に限ります。
下落局面とか調整局面ではうまく機能しません。
上昇局面にいる銘柄を判定する方法
ある銘柄が上昇局面にいるかどうかを判断するにはいろいろな方法があります。
こちらの記事でも紹介していますが、僕の場合は次の4つを使っています。
上昇トレンドにいる銘柄を見つける方法
- 移動平均線から判断する
- パーフェクトオーダーを利用する
- レラティブストレングスを計算する
- トレンドテンプレートを適用する
【まとめ】株価チャートから上昇トレンドにいる銘柄を見抜く方法
続きを見る
移動平均線から判断する
ある移動平均線を基準にして、それよりも現在の株価が上にあれば上昇トレンドと判断できます。
あるいは移動平均線の向き(上向きなら上昇、下向きなら下落)で判断する方法もあります。
パーフェクトオーダーを利用する
パーフェクトオーダーを使うのも有効です。
3つの移動平均線が綺麗に並んでいる状態をパーフェクトオーダーと言います。
本記事では、20日、50日、200日移動平均線を使っていますが、これらが上から順に20日、50日、200日と並んでいたらパーフェクトオーダーです。
Pythonで株価データからパーフェクトオーダーを判定してPlotlyで可視化する方法
続きを見る
レラティブストレングスを計算する
レラティブストレングスを使うと、株価がどれくらい活発に動いているかを判断することができます。
成長株投資で有名なオニールが考案した指標で、彼の著書である「オニールの成長株発掘法 【第4版】」でも紹介されています。
レラティブストレングスについては計算方法が公開されていないため、実際の数値を得るのは難しいのですが、僕の方で調べてみたところ良さそうな計算方法を見つけたので、僕はこれを日本株に適用して計算しています。
結果の一部は僕が運営している「投資でニート生活」でも公開しています。
【毎週無料公開】日本株でレラティブストレングスっぽいものを計算する【オニールの成長株発掘法】
続きを見る
トレンドテンプレートを適用する
最後にトレンドテンプレートをご紹介します。
これは成長株投資でオニールと並んで著名なミネルヴィニが自身の著書「ミネルヴィニの成長株投資法」で提唱している手法です。
トレンドテンプレートの条件を満たした銘柄は、上昇局面にいる可能性が高いと判断できます。
「投資でニート生活」では、このトレンドテンプレートを日本株に適用して、こちらで管理しています。
【毎週無料公開】日本株にミネルヴィニのトレンドテンプレートを適用してスクリーニングする!
続きを見る
上昇局面でブレイクしたらチャンス!
上記のように、上昇局面にいる銘柄を判定する方法はいろいろとあります。
これらの方法を駆使して、なおかつボックス圏からの新高値ブレイクが発生したらエントリーのチャンスになる可能性が高くなります。
(宣伝)noteでデータ提供中
最後にちょこっと宣伝です。
本記事で紹介したチャートを始め、特に日本株の成長株投資に必要な情報をまとめてnoteで発信しています。
基本的には、オニールやミネルヴィニの投資手法を参考にして、これを日本株に適用しています。
ここで必要な情報(株価チャート、決算情報など)を収集して、ないもの(レラティブストレングスやトレンドテンプレート)は独自にプログラムを開発して適用しています。
誰でもスクリーニングできるようにエクセル形式にデータをまとめたり、PDF形式にチャートや業績などの情報をレポートとしてまとめて提供したりしています。
もし興味あれば覗いてみてください。
本記事で紹介したボックス圏からのブレイクもシグナルとして利用しています。
まとめ
本記事では、「Pythonで株価の新高値ブレイクを自動検出する方法」について解説しました。
ボックス圏から抜けて新高値ブレイクをつけるタイミングをPythonを使って自動検出する方法について紹介しました。
特に上昇局面にいる場合は、ここで紹介した方法はいい感じに機能します。
下落局面や調整局面では失敗の可能性が高くなります。
大事なことは、パーフェクトオーダーやトレンドテンプレートなどを使って上昇局面にいることを判断した上で利用することです。
本記事が少しでも皆様のお役に立てれば幸いです。
ここまで読んでくださりありがとうございました。