こんにちは。TATです。
今日のテーマは「【Pythonで株式投資】レラティブストレングスと52週高値は買いシグナルに有効か検証してみる【前編】」です。
こちら完全に僕の思いつきですw
思いついたからには、実際にデータで検証してみることにしました。
思いついたのは結構前ですが、データが十分に少なかったので1つのアイデアとして温めていました。
ようやくレラティブストレングスのデータも1年分以上蓄積できたのである程度の検証ができる状況となりました。
いろいろやってるうちにかなり長くなってしまったので、前編と後編に分けてご紹介していきます。
今回は前編です。
前編では、シンプルにレラティブストレングスと52週高値のデータだけを使って検証を行っていきます。
後編では、ここに業績データや時価総額などの情報を加えて検証します。
いい感じの発見があれば、今後に活用していこうと思います。
目次
【Pythonで株式投資】レラティブストレングスと52週高値は買いシグナルに有効かを検証してみる【前編】
必要なデータを準備する
検証を行うには、まずはデータの準備です。
レラティブストレングスは独自ロジックで自動収集
メインデータの1つとなるレラティブストレングスについては、オニールやミネルヴィニの投資手法で重視されているものです。
1〜99の数値で表され、その株が市場全体でどれくらい活発に値動きしているのかがわかります。
レラティブストレングスの計算方法については明らかになっていません。
しかしながら、ググってみるとそこそこ信憑性がありそうな計算方法が見つかったので、これを日本株に適用して毎週土曜日に計算しています。
プログラムによる自動計算です。
【毎週無料公開】日本株でレラティブストレングスっぽいものを計算する【オニールの成長株発掘法】
続きを見る
結果の一部は僕が運営する「投資でニート生活」で公開しています。
より詳細な結果はnoteで公開しています。
このレラティブストレングスのデータは2021年3月13日から収集を開始したので、1年以上のデータが溜まりました。
今回はこれを用います。
52週高値もプログラムで自動収集
もう1つのメインデータである52週高値に関しても「投資でニート生活」で集計しています。
こちらは2020年5月19日からデータを集計・収集しています。
毎日集計しているので、銘柄単位でいつ52週高値を出したのかをすぐに確認することができます。
「投資でニート生活」で収集しているデータは、APIを介していつでも簡単にデータを取得できるようになっているので、今回はこれを使います。
株価データはDBで管理しています
最後に株価データです。
株価データも「投資でニート生活」のDBで収集しています。
こちらもAPIを介して簡単に取得できるようになっています。
本記事では僕がDBで管理している株価データを使用しますが、yahoo_finance_api2とかを使うと簡単に株価データを取得できます。
【Pythonコード解説】yahoo_finance_api2で日本株の株価データを取得する
続きを見る
検証のためのデータセットを作る
上記のデータを組み合わせて、検証のために必要なデータセットを作ります。
ここの作り方はいろいろと考えられますが、今回は次のような条件でデータを用意しました。
データセット
- データの範囲はレラティブストレングスの集計を開始した2021年3月13日からこの分析を行った2022年4月末まで
- 52週高値を更新した銘柄を対象とする
- 52週高値更新日の株価やレラティブストレングスなどをまとめる
ざっくりですが、上記のような条件でデータセットを作りました。
各銘柄の52週高値を更新した日ごとのデータを集計します。
集計したカラムは以下の通りです。
ここでは、52週高値を更新していから1週間と1ヶ月の株価データをまとめました。
これでどれくらい利益が得られるのかを検証していきます。
データセット
- ticker: 証券コード
- signal_date: 52週高値更新日
- buy_date: 52週高値更新日翌営業日の日付
- sell_date_W1: 1週間後(5営業日後)の日付
- sell_date_M1: 1ヶ月後(21営業日後)の日付
- relative_strength: 52週高値更新日直近のレラティブストレングス
- diff_52w: 前回の52週高値更新日からの経過日数
- signal_price_close: 52週高値更新日の終値
- buy_price_open: 52週高値更新日翌営業日の始値
- sell_price_W1_close: 1週間後(5営業日後)の終値
- sell_price_W1_close_highest:1週間後(5営業日後)の終値の最高値
- sell_price_W1_close_lowest:1週間後(5営業日後)の終値の最安値
- sell_price_W1_high_highest:1週間後(5営業日後)の高値の最高値
- sell_price_W1_low_lowest:1週間後(5営業日後)の安値の最安値
- sell_price_M1_close: 1ヶ月後(21営業日後)の終値
- sell_price_M1_close_highest: 1ヶ月間(21営業日)の終値の最高値
- sell_price_M1_close_lowest: 1ヶ月間(21営業日)の終値の最安値
- sell_price_M1_high_highest: 1ヶ月間(21営業日)の高値の最高値
- sell_price_M1_low_lowest: 1ヶ月間(21営業日)の安値の最安値
集計したデータはこんな感じです。
カラムが多すぎて全部は表示されていません、すみませんw
あとは必要に応じて株価データから損益率とかを計算しながら検証していきます。
ちなみにデータ数は21,231個でした。
1週間後・1ヶ月後の株価から損益を検証
データの準備ができたところで早速検証していきます。
1週間後と1ヶ月後の利益率を計算してみる
まずは利益率をいろいろと出してみます。
ここではbuy_price_openカラム(52週高値更新日の翌営業日の始値)の株価データを基準に考えます。
シンプルに1週間後の終値で売却した利益率(change_W1_close)、1ヶ月後の終値で売却した利益率(change_M1_close)で見てみます。
こちらは%単位になります。200なら200%上昇という意味になります。
結果を見ると、どちらも平均ではマイナスです。そんな簡単にうまくはいきませんよね。
ちなみに平均値(m)と標準偏差(σ)を計算してm±2σで外れ値を除去してもいずれも平均はマイナスになりました。
分布も見ておきます。
どちらも0あたりを中心とする正規分布を形成していることがわかります。
このプラスとマイナスを分ける条件を見つけることができれば勝ちですね。
利益率とレラティブストレングスとの関係を見る
次に利益率とレラティブストレングスの関係を見てみます。
どちらの結果でも1つ言えるのは、レラティブストレングスが大きくなる(右にいくにつれて)、利益率のボラティリティ(上下の幅)が大きくなっているということです。
レラティブストレングスは株価がどれくらい活発に動いているのかを示す指数になるので、ここは納得ですね。
大きなリターンを狙うなら、レラティブストレングスが大きい方が好ましいですが、マイナスにいくと大ダメージを被ることになるので、さらに分析が必要です。
一応、レラティブストレングスが80以上と80未満で利益率のボラティリティを比較してみました。
ちなみに、外れ値を除外してもやっぱりレラティブストレングスが高い方が利益率のボラティリティは高くなります。
でっかい利益を狙うなられラティブストレングスは高い方がいいです。リスクも大きくなりますが。。。
前回の52週高値更新からの日数と利益率の関係
次に前回の52週高値更新日からの日数を考慮してみます。
銘柄選定の際には、連続の52週高値更新も魅力的ですが、やはり半年ぶりとか1年ぶりの52週高値更新の方が、「何か起きてるんじゃね」と期待します。
業績が回復したり、経営陣が代わったり、何かしらのポジティブ材料が出ていることが多いです。
それも結果に影響するのかというのを検証してみます。
これにはdiff_52wというカラムを使います。
これは今回の52週高値更新が前回から何日ぶりかを示しています。
これと利益率の関係を見てみます。
なんか期待はずれと言いますか、残念な感じの結果ですね。。。
数値が上がるほどパフォーマンス上がるのかなと期待していたんですがそうでもなさそうです。
右側のM1の結果を見るとdiff_52wが大きくなるとマイナスの数値も目立ってきます。
これは52週高値を上値抵抗線として押し返されているイメージでしょうかね。
ただ、diff_52wがゼロに近づくとボラティリティが大きくなっているので、リスクを抑えるという意味では、ある程度の日数がある方が良さそうですね。
diff_52wを10個のグループに分割してそれぞれのボラティリティを見てみました。
真ん中にピークがありますね。
それを超えると少しボラティリティが下がって最後に急上昇しています。
他にもいろいろデータの見方が考えられますが、記事が無限に長くなりそうなのでこの辺で次に行きます。
とりあえずこの他にもいろいろ見ましたが、固定期間の終値だけで利益を出すのは難しいことがよくわかりました。
ワンチャン、レラティブストレングス高くて52週高値更新した銘柄選べば結構いいんじゃね、って思ってた僕は甘かったですねw
高値と安値から期待リターンとリスクを算出する
次にもう少しまともというか現実的な方法でデータを見てみます。
高値と安値データを使って期待利益とリスクを計算してみます。
1週間・1ヶ月の期待収益とリスクを計算する
まずは期待収益とリスクを計算します。
ここでは、1週間・1ヶ月間の高値と安値から計算します。
これで期待利益率と想定損失率を計算することができます。
用意したデータでは、終値ベースで高値と安値を計算したもの(sell_price_M1_close_highest、sell_price_M1_close_lowest)と、高値ベース・安値ベースでそれぞれ高値と安値を計算したもの(sell_price_M1_high_highest, sell_price_M1_low_lowest)があります。
例えば、sell_price_M1_high_highestは、エントリーしてから1ヶ月間における高値の最高値を示しています。
どっちで計算しても良いですが、ここでは最大の利益と最大の損失ということで高値ベース・安値ベースでそれぞれ高値と安値を計算したもの(sell_price_M1_high_highest, sell_price_M1_low_lowest)を使って計算します。
それぞれ期待収益率とリスクとして計算します。
結果概要はこちらです。
当然ながら、1週間より1ヶ月の方がボラティリティは大きくなります。
期待収益率を見ると、1週間では5%、1ヶ月では9%です。
ただし、リスクも同様の結果になっています。
それぞれヒストグラムにしてみます。
外れ値がすごいので、x軸は-50~50にしました。
リスクの方が横に伸びていることが確認できます。
きちんと損切りしないと大ダメージを被ることが想像できますねw
収益とリスクの関係
次に収益とリスクの関係を見ていきます。
カオスですね。
回帰直線を引くとすごい角度の右下の線が引けそうです。
returnに対してはriskの方がでかいことが想像できます。
要はreturnが大きい銘柄はボラティリティも激しいということです。
前回の52週高値更新からの日数と収益・リスクの関係
次に先ほどでもみた前回の52週高値更新からの日数との関係を見てみます。
大きいほど期待収益が大きくなることを期待します。
まずは1週間の期待収益とリスクの関係です。
リスクについては、微妙なところですが回帰直線は右肩上がりになりました。
ただ相関は弱いのでそこまで信用はできません。
右肩上がりになってるので、一応期間が長いと期待収益も大きくなってることになります。
リスクも同様で、期間が長くなるとリスクも大きくなります。
似たような結果ですが、1ヶ月の期待収益とリスクの関係もご紹介します。
同じような結果ですね。
期待収益>リスクの銘柄を見る
次に期待収益率がリスクを上回っている銘柄のデータを見てみます。
これはつまり、1週間あるいは1ヶ月間の高値と安値における利益率を比較すると、高値による利益の方が安値における損失を上回っていることを意味します。
この条件を満たす銘柄とそうでない銘柄で比較してみます。
比較できるデータもそこまでないですが、ここではレラティブストレングスとdiff_52wを比較しました。
リスクはマイナスの値になってるので絶対値で比較します。
ほぼ差なしです。。。
データ数もいい感じに分かれていますね。
これはやる意味なかった。。。w
いろんな条件でシミュレーションする
ここまでデータをいろいろとみてきましたが、ぶっちゃけ使えそうな知見はあまり得られていません。。。
一応、シミュレーションして、損益がどんなもんなのかをみておきます。
利確・損切りポイントを決める
シミュレーションするにあたり、利確ポイントと損切りポイントを決めます。
先ほどの収益とリスクの集計値をもう一度確認します。
利確・損切りポイントは平均値を使います。
つまり、1週間なら5%で1ヶ月なら9%です。
1週間で見る場合は、5%上がったら利確、5%下がったら損切りです。
結果を見てどちらも満たしている場合は、負けを認めて損切りを選ぶことにします。
どちらも満たしていない場合は、1週間後、あるいは1ヶ月後の終値から判断します。
この条件で損益を計算して、いろいろとデータをフィルターしながら利益が出そうな戦略を見てみます。
損益の概要を見る
上記の条件で集計した損益の概要を見てみます。
ヒストグラムにしてみました。
W1は-5%〜+5%、M1は-9%~+9%の範囲内に収まっていることがわかります。
どちらも結果においても、−5あるいは−9の数値が+5あるいは+9よりも多いことがわかります。
これは損切りに追い込まれた方が多いことを示しています。
ちなみにここでは、利益と損失の基準値をどちらも超過していた場合は損切りと判定していました。
これを利確で想定するとわりといい勝負になったりします。
ここをきちんとするには高値と安値をつけた日付を考慮しないといけないので今のデータではできませんね。。。やらかしました。。。
とりあえず今は最悪の想定をするために、利益と損失の基準値をどちらも超過していた場合は損切りと判定して進めます。
統計値をまとめるとこんな感じになりました。
平均がマイナス。。。
条件を設定してここがプラスになればいいのですが、どうなるでしょうか。
1回あたりの投資金額を設定する
現実的な方法として、まずは1回あたりの投資金額を決めます。
これは僕が勝手に目安程度に設けている基準ですが、株価5,000円以下の銘柄に絞ってみます。
株価が5,000円を超えていたら投資しません。
つまり1回あたりの投資金額を上限50万円とします。
そしてなるべく50万円に超えない範囲で近づくように投資します。
例えば株価が2,300円ならば100株ではなくて200株買います。
これでなるべく投資金額を上限50万円で限りなく50万円に近くなるようにして投資します。
この条件でシミュレーションしたらどうなるでしょうか。
酷い結果ですw
この上限をいろいろと変化させてみるとどうなるか試してみました。
時系列ではなく最終結果だけまとめます。
株価の上限を100円にした時だけプラスになりましたw
あとはマイナスです。
さらに条件を追加しないとですね。
レラティブストレングスを調整してみる
次にレラティブストレングスを調整してみます。
オニールやミネルヴィニでは80以上の銘柄を推奨しているので、これを基準にしつつ、さらに90や95以上の場合でもみてみます。
こちらも一回の入金額を調整ながらいろいろ検証してみました。
悲惨でした。
レラティブストレングスが高いと株価がより活発に動いていることになるので、ボラティリティも高くなります。
何でもかんでも買っていると大ダメージを被ることがよくわかります。
前回の52週高値更新からの日数を調整する
次に前回の52週高値からの日数を調整してみます。
こちらも色々試した結果をまとめました。
diff_52wを5日以上に設定して株価の上限を500円いかにしたら、W1でもM1でもプラスになりました。
ただとにかく全体的にしょぼいですねw
低位株の方がリスクも小さい感じがしますがどうなんでしょう。
利確・損切りポイントを調整する
お次に利確・損切りポイントを調整してみます。
ここまでは、W1では5%、M1では9%を利確・損切りポイントにしていました。
これは平均値からとったものです。
これを少し弄って結果がどうなるかをみていきます。
先ほどの期待収益とリスクの統計値をもう一度見てみます。
先ほどはこちらの平均値を使いました。
これを少し変動してみます。
利確ポイントは、1%, 5%, 10%, 15%, 20%、損切りポイントは-1%, -5%, -10%, -15%, -20%でシミュレーションしてみます。
投資金額は50万円つまり株価5,000円を上限でいきます。
これは僕が投資戦略の目安にしているためです。。
結果がすごい量になるので最も成績の良かったトップ10だけご紹介します。
残念ながら全てマイナスです。
M1で見ても全てマイナスです。
確定ポイントを変えただけではプラスにはなりません。。。
これまでのデータ全部組み合わせる *やけくそですw
最後に、これまでやったこと全て組み合わせます。
もう半分やけくそですねw
やはりレラティブストレングスと52週高値だけでは難しいのでしょうか。
最後にあがいてみます。
調整内容は以下の通りです。
調整内容
- 投資金額(株価上限):100円, 500円, 1,000円, 2,000円, 3,000円, 4,000円, 5,000円, 10,000円, 20,000円, 30,000円, 50,000円, 100,000円
- レラティブストレングスの最低ライン:0, 80, 90, 95, 99
- 前回の52週高値更新からの日数:5, 20, 50, 100, 200
- 利確ポイント:1%, 5%, 10%, 15%, 20%
- 損切りポイント:-1%, -5%, -10%, -15%, -20%
これら全ての組み合わせでシミュレーションします。
結果概要
これもすごいデータ数になるので、結果の良かったものだけランキング形式にまとめます。
まずは全体から見てみます。
プラス収益になったものとマイナスになったものをカウントしてみました。
データ数は全部でピッタリ6,000個になりました。
W1で見ると、約1,000パターンでプラス収益となっています。M1では510個です。
期間が長くなると利益を上げるのは難しくなることがわかります。
トップ10
次に成績が最も良かった上位トップ10を見てみます。
まずは1週間(W1)のデータです。
今回は投資金額から損益率を計算しつつ、合計投資金額と投資回数も追加しました。
利益率の最も高いデータトップ10を出してみます。
全部500円以下の銘柄になってますね。
利益20%はそこそこありますが、圧倒的なパフォーマンスとは言えません。
投資回数が多すぎると手数料でマイナスになりそうな気しかしないので、なるべく少ない方がいいですね。
次に1ヶ月(M1)のトップ10です。
ほぼ変わらずです。
共通して言えるのは、株価が低い(1000円以下)、レラティブストレングスが高い(90以上)、利確・損切りポイントを幅広く取る、52週高値の更新日の間隔はある程度広い方が良いということです。
この辺りを気をつければうまく利益が取れそうな気がします。(気がするだけw)
株価上限5,000円とした場合のトップ10
上記の結果では、1,000円以下の銘柄にしか投資できなくなってしまうので、少し条件を加えてみましょう。
株価上限5,000円とした場合の成績の良かった組み合わせトップ10を見てみます。
僕が今後使うために参考にしようと思います。
まさかの1位でも利益率2.51%です。しょぼすぎる。。。
M1でもみてみます。
これでも3.25%です。。。これもまたしょぼすぎる
全体の結果と同様に、確定ポイントは割と幅広く設定して、レラティブストレングスは90以上、52週高値の更新間隔も50日以上とした方がパフォーマンスが良くなっていることがわかります。
一応これでプラス運用にはなりますが、しょぼすぎて実装する気になれません。
圧倒的なパフォーマンスを出すにはさらにここにデータを突っ込まないといけないのかもしれません。
とりあえずテクニカルだけで見るのはこれくらいにしておこうと思います。
前編ですが、長くなりすぎましたw
データの分析・可視化にはPythonが最適!
本記事で紹介したコードは、全てPythonを使って書いています。
Pythonはデータの分析や可視化を得意とするプログラミング言語で、さらにAI関連のライブラリーも豊富で昨今のAIブームで需要が急拡大しています。
→ 【いますぐ始められます】データ分析をするならPythonが最適です。
また、Pythonは比較的学びやすい言語でもあります。
実際、僕は社会人になってからPythonを独学で習得して転職にも成功し、Python独学をきっかけに人生が大きく変わりました。
→ 【実体験】ゼロからのPython独学を決意してから転職を掴み取るまでのお話。
Pythonの学習方法についてはいろいろな方法があります。
僕はUdemyを選びましたが、書籍やプログラミングスクールも選択肢になります。
→ 【決定版】Python独学ロードマップ【完全初心者からでもOKです】
→ 【まとめ】Pythonが学べるおすすめプログラミングスクール
→ プログラミングの独学にUdemyをおすすめする理由!【僕はUdemyでPythonを独学しました!】
まとめ
いかがでしたでしょうか。
ここでは「【Pythonで株式投資】レラティブストレングスと52週高値は買いシグナルに有効か検証してみる【前編】」というテーマで、独自に集計しているレラティブストレングスと52週高値のデータを使って利益が出せるのかどうかを検証してみました。
結論、条件をうまく調整すれば利益を出すことは不可能ではありません。
ただ、圧倒的なパフォーマンスを出すことは難しそうです。。。
今回は手数料を加味していないので、これを加えたらさらに利益は下がります。
もしかしたらマイナスになっちゃうかも。。。
今回は前編ということで、テクニカルデータしか活用していませんでしたが、後編ではここにファンダメンタルデータを加えてもう少し分析してみようと思います。
とりあえず前編は長くなりすぎてしまったので、後編はもう少しコンパクトにまとめるように努めますw
もう疲れましたw
ここまで読んでくださり、ありがとうございました。