AIを使いながら、日本株の売買判断を自動化するツールを作っています。
前回の記事では、バックテストを20銘柄・224取引まで拡大し、最大損失-62%の原因や、当日終値でシグナルを判定して同じ終値で約定していた問題を検証しました。
→ 株のバックテストを20銘柄に拡大|224取引で勝率75%、でも最大損失-62%
その検証を踏まえ、売買シグナルが出た日の終値で約定する方式から、
「当日終値でシグナルを判定 → 翌営業日の始値で約定」
という、より実際の取引に近い方式へ変更しました。
その結果は、
- 総取引数:224回
- 勝率:76.3%
- 平均損益率:+8.23%
- 中央値:+6.32%
となりました。
数字だけを見ると、かなり良さそうです。
しかし、バックテストの中身を詳しく確認すると、
最大利益率:+118.25%
最大損失率:-61.30%
という、かなり極端な数字も含まれていました。
今回は、この2つの数字を詳しく調べたうえで、全取引の値動きを分析し、固定STOP(損切り)を実装するまでをまとめます。
- 最大利益+118.25%は本当に正しいのか?
- 次に問題になった「最大損失-61.30%」
- MFE・MAEで全224取引を分析
- 勝った取引も途中ではかなり下がっていた
- 一方で負け取引はかなり深く沈んでいた
- 一度は利益が出ていたのに、最終的に負けた取引もある
- 固定STOPをバックテストに実装
- ギャップダウンも考慮したSTOPにする
- STOPを入れたら取引回数まで変わった
- STOPなしと5種類の損切りを比較
- なぜ-15%STOPなのに-19.40%で損切りされるのか?
- -15%STOPが現時点では比較的バランスが良さそう
- 勝率だけではバックテストの良し悪しは判断できない
- 現在のバックテストもまだ完成ではない
- 次は「損失を切る」から「利益を守る」へ
- まとめ
最大利益+118.25%は本当に正しいのか?
まず気になったのが、最大利益率の**+118.25%**です。
翌営業日の始値で約定する方式へ変更する前は、最大利益率は+84.13%でした。
それが、
+84.13% → +118.25%
まで一気に上昇しました。
さすがに大きな変化だったため、
「株式分割などで価格データがおかしくなっているのでは?」
と疑い、該当する取引まで遡って確認しました。
+118.25%を記録したのはフジクラ
該当したのは**フジクラ(5803)**でした。
| 項目 | 内容 |
|---|---|
| BUYシグナル | 2024年8月2日 |
| BUY約定 | 2024年8月5日 始値 |
| BUY価格 | 約373.01円 |
| SELLシグナル | 2024年9月26日 |
| SELL約定 | 2024年9月27日 始値 |
| SELL価格 | 約814.10円 |
| 損益率 | +118.25% |
原因は株式分割ではなく、BUY時の大幅なギャップダウンでした。
BUYシグナルが出た日の終値は約438.46円。
ところが、翌営業日の始値は約373.01円まで下落していました。
ギャップ率は約**-14.93%**です。
つまり翌営業日の始値で約定する方式では、従来より約15%安い価格で買えたことになります。
その後、株価が大きく上昇したため、最終的な利益率も大きくなりました。
比較すると、
| 約定方式 | BUY | SELL | 損益率 |
|---|---|---|---|
| 当日終値 | 約438.46円 | 約807.34円 | +84.13% |
| 翌営業日始値 | 約373.01円 | 約814.10円 | +118.25% |
株式分割についても確認しましたが、対象となる取引期間には該当する分割はありませんでした。
つまり、+118.25%という数字はデータの異常ではなく、
実際の市場で発生した価格ギャップを反映したバックテスト結果
ということになります。
ただし、これはかなり特殊な1取引です。
この結果からも、平均損益率だけではなく、中央値や個々の取引内容まで確認する必要があると感じました。
次に問題になった「最大損失-61.30%」
最大利益の原因は確認できました。
しかし、それ以上に問題なのが、
最大損失率-61.30%
です。
勝率が76.3%あったとしても、1回の取引で60%以上の損失を許容するシステムを、そのまま実際の売買に使うのは現実的ではありません。
そこで、すぐに「-5%で損切り」といったルールを追加するのではなく、
実際に224回の取引が、保有期間中にどのような値動きをしていたのか
を調べることにしました。
MFE・MAEで全224取引を分析
今回、新しくMFEとMAEを調べました。
MFEとは?
Maximum Favorable Excursion(最大順行幅)
保有している間に、最も大きく含み益になった地点を表します。
MAEとは?
Maximum Adverse Excursion(最大逆行幅)
逆に、保有している間に最も大きく含み損になった地点です。
たとえば最終的に+10%で利益確定した取引でも、途中で一度-8%まで下落していた可能性があります。
この値を調べることで、
「どのくらいの損切り幅なら勝ち取引を邪魔せず、大きな損失を防げるのか」
を考えられるようになります。

勝った取引も途中ではかなり下がっていた
171件の勝ち取引についてMAEを調べると、
- MAE平均:-7.05%
- MAE中央値:-5.51%
- 最悪:-33.48%
となりました。
さらに詳しく見ると、
| 一時的な下落率 | 最終的に勝った取引 |
|---|---|
| -3%以上 | 118件(69.01%) |
| -5%以上 | 92件(53.80%) |
| -7%以上 | 72件(42.11%) |
| -10%以上 | 41件(23.98%) |
| -15%以上 | 18件(10.53%) |
| -20%以上 | 8件(4.68%) |
これはかなり重要な結果でした。
単純に、
「損失が-5%になったら損切り」
というルールを設定すると、現在の勝ち取引の半数以上が途中でSTOPに触れる可能性があります。
損失を小さくすれば、それだけでバックテスト結果が良くなるわけではありません。
一方で負け取引はかなり深く沈んでいた
次に、最終的に負けた53件を確認しました。
こちらは、
- MAE平均:-22.96%
- MAE中央値:-21.99%
- 最悪:-72.06%
でした。
さらに、
- -10%到達:47/53件
- -15%到達:41/53件
- -20%到達:29/53件
- -30%到達:14/53件
となっています。
つまり、現在のSELLシグナルだけでは、
大きな下降トレンドに入った銘柄を早い段階で止める能力が弱い
という問題が見えてきました。
一度は利益が出ていたのに、最終的に負けた取引もある
MFEを調べたことで、もう一つ問題が見つかりました。
最終的に負けた53取引の中でも、
| 一時的な含み益 | 件数 |
|---|---|
| +3%以上 | 30件 |
| +5%以上 | 18件 |
| +10%以上 | 6件 |
| +15%以上 | 4件 |
| +20%以上 | 2件 |
となっていました。
つまり、
一度は利益が出ていたのに、SELLシグナルを待っている間に下落し、最終的に損失になった取引
が存在します。
象徴的だったレーザーテック
特に極端だったのが**レーザーテック(6920)**です。
この取引では、約35,954円でBUYしたあと、
一時+22.61%
まで上昇しました。
ところが、その時点ではSELLシグナルが出なかったため、そのまま保有を継続。
その後大きく下落し、
MAEは-72.06%
まで悪化しました。
最終的には約13,915円で売却され、
損益率-61.30%
となっています。
一度+20%以上の含み益が出ていた取引が、最終的には-60%以上の損失になる。
これは実際の運用を考えると、改善したい部分です。
固定STOPをバックテストに実装
MFE・MAEを確認したうえで、固定STOPを実装しました。
今回は既存のバックテストを書き換えるのではなく、
run_backtest_next_open_with_stop()
という新しい処理を追加しています。
これによって、
- 従来のバックテスト
- 翌営業日始値で約定するバックテスト
- 固定STOPを設定したバックテスト
をそれぞれ比較できるようにしました。
ギャップダウンも考慮したSTOPにする
STOPの実装でも、なるべく実際の売買に近づけました。
たとえば-15%STOPを設定していても、翌日の寄り付きがすでに-20%まで下落していた場合、
都合よく-15%で売却できるとは限りません。
そこで、
始値がSTOP価格以下なら、その日の始値で売却
するようにしました。
一方、
始値 > STOP価格
かつ、
安値 ≦ STOP価格
の場合は、STOP価格で売却します。
これによって、日足データではありますが、ギャップダウンによる損失もある程度反映できるようになりました。
STOPを入れたら取引回数まで変わった
固定STOPを実装したところ、想定していなかった変化もありました。
STOPなしの取引数は224件です。
ところが、
- -5%STOP:496件
- -7%STOP:418件
- -10%STOP:355件
- -15%STOP:302件
- -20%STOP:269件
と、STOPを厳しくするほど取引回数が増えました。
最初は、
「224取引にSTOPを適用しただけなのに、なぜ取引回数が増える?」
と思いました。
原因を調べると、
STOPによって早くポジションがなくなり、その後に発生した新しいBUYシグナルで再びエントリーできるようになった
ためでした。
従来なら保有中なので無視されていたBUYシグナルも、早期に損切りすれば新しい取引として成立します。
そのため、元の224取引に対して単純にSTOPを当てはめるのではなく、
それぞれのSTOP条件で最初から時系列を再シミュレーションする
方式にしています。
STOPなしと5種類の損切りを比較
実際に20銘柄で比較した結果がこちらです。
| STOP | 取引数 | 勝率 | 平均損益率 | 中央値 | 最大損失率 | 平均保有日数 |
|---|---|---|---|---|---|---|
| なし | 224 | 76.3% | +8.23% | +6.32% | -61.30% | 40.12日 |
| -5% | 496 | 38.7% | +3.20% | -5.00% | -20.84% | 14.66日 |
| -7% | 418 | 47.1% | +3.82% | -7.00% | -20.84% | 18.76日 |
| -10% | 355 | 58.0% | +4.90% | +4.74% | -21.74% | 23.57日 |
| -15% | 302 | 69.2% | +6.14% | +6.44% | -22.20% | 28.76日 |
| -20% | 269 | 72.1% | +5.97% | +6.27% | -31.27% | 32.52日 |
最大損失については、かなり改善しました。
特に-15%STOPでは、
最大損失 -61.30% → -22.20%
まで縮小しています。
一方で、
勝率 76.3% → 69.2%
平均損益率 +8.23% → +6.14%
と低下しました。
STOPを設定すれば大きな損失を防げますが、本来ならその後上昇して利益になった取引まで途中で切ってしまいます。
バックテストでも、そのトレードオフがはっきり表れました。
なぜ-15%STOPなのに-19.40%で損切りされるのか?
先ほど紹介したレーザーテックの取引でもSTOPを検証しました。
結果は、
- STOPなし:-61.30%
- -5%STOP:-5.00%
- -7%STOP:-7.00%
- -10%STOP:-10.00%
- -15%STOP:-19.40%
- -20%STOP:-20.00%
となりました。
ここで気になるのが、
「-15%STOPなのに、なぜ-19.40%で損切りされているのか?」
という点です。
このときのSTOP価格は約30,561円でした。
しかし、2024年7月18日の始値が約28,980円までギャップダウンしています。
すでにSTOP価格を下回って寄り付いているため、30,561円で売れたことにはせず、
実際の始値である約28,980円でSTOP
として計算しています。
自動売買を考えるのであれば、こうしたギャップリスクも無視できません。
-15%STOPが現時点では比較的バランスが良さそう
STOPなしで最終損益が-10%以下だった取引は14件ありました。
それぞれのSTOPを設定した場合、その14件のうち何件でSTOPが成立したかを見ると、
| STOP | 元の大損失14件でSTOP成立 |
|---|---|
| -5% | 14/14 |
| -7% | 14/14 |
| -10% | 14/14 |
| -15% | 14/14 |
| -20% | 13/14 |
となりました。
ただし、STOPが成立したからといって、必ず設定した損失率以内で売却できるわけではありません。
寄り付きからSTOP価格を下回るギャップダウンが発生した場合は、設定値を超える損失になる可能性があります。
一方、最終的には勝っていた取引を途中でSTOPしてしまった件数は、
- -5%:91件
- -7%:72件
- -10%:41件
- -15%:18件
- -20%:8件
でした。
-5%や-7%では、勝ち取引をかなり多く切ってしまいます。
一方、-20%まで許容すると、大きな損失を防ぐ効果が弱くなります。
今回比較した範囲では、-15%前後が比較的バランスの良い候補に見えました。
ただし、現時点で「-15%を正式採用」と決めたわけではありません。
多少勝率が下がったとしても、損失を一定範囲に抑えることは重要だと考えています。
特に今回は最終的に自動売買を目指しているので、「危なくなったら自分の判断で売る」という運用にはできません。
どの条件で損切りするのかを、あらかじめルールとして決めておくことが大切だと思います。
一方で、STOPを厳しくしすぎると、本来なら利益になっていた取引まで途中で損切りされてしまうことも今回の検証で分かりました。
そのため、単純に損切り幅を狭くするのではなく、利益とのバランスを見ながらルールを決めていきたいです。
勝率だけではバックテストの良し悪しは判断できない
今回の検証で特に印象的だったのは、
勝率76.3%という数字だけを見ていたら、かなり良い売買ロジックに見えていた
ということです。
しかし、中身を見ると最大損失は-61.30%。
さらに、一度+22%以上まで上昇したにもかかわらず、最終的に-61%以上の損失になった取引までありました。
逆に損失を恐れてSTOPを厳しくしすぎると、今度は本来の勝ち取引まで大量に損切りしてしまいます。
バックテストでは勝率や平均損益だけではなく、
「どうやって勝ったのか」
「どうやって負けたのか」
まで見る必要があることが分かりました。
現在のバックテストもまだ完成ではない
固定STOPまで実装しましたが、まだ実際の運用とは差があります。
現時点では、
- 売買手数料
- スプレッド
- スリッページ
- 税金
- 同時保有数
- 資金上限
- 100株単位での資金管理
- 複利
- ポートフォリオ全体の資産曲線
- 最大ドローダウン
- 未決済ポジションを含めた評価
などは十分に反映できていません。
そのため、
「勝率76.3%、平均損益+8.23%だから、このシステムなら儲かる」
とはまだ言えません。
むしろバックテストを進めるほど、確認しなければならないことが増えてきました。
次は「損失を切る」から「利益を守る」へ
そして今回のMFE分析で、次に検証すべき課題も見えてきました。
最終的に負けた53件のうち、
30件は一度+3%以上
18件は一度+5%以上
6件は一度+10%以上
まで上昇しています。
レーザーテックのように、
一時+22.61% → 最終-61.30%
となった取引もあります。
固定STOPは、大きく下落したときの損失を制限する仕組みです。
しかし、
「一度出た利益をどう守るか」
という問題は解決できません。
そこで次は、株価の上昇に合わせて損切りラインを引き上げていく、
トレーリングSTOP
を検証していきます。
固定STOPと組み合わせることで、最大損失を抑えながら、伸びた利益をどこまで残せるのか。
次の開発では、この部分を検証していきます。
まとめ
今回の開発では、翌営業日始値で約定するバックテストをさらに詳しく分析し、固定STOPを実装しました。
分かったことをまとめると、
- 最大利益+118.25%はデータ異常ではなく実際の価格ギャップが原因
- 勝ち取引でも53.8%が一時-5%以上下落していた
- 負け取引のMAE中央値は-21.99%
- 最大損失は-61.30%
- -15%STOPでは最大損失が-22.20%まで改善
- 一方、勝率は76.3%から69.2%へ低下
- 平均損益率も+8.23%から+6.14%へ低下
- 厳しすぎるSTOPは勝ち取引まで途中で切ってしまう
- 利益が出たあとに大きく下落する取引も存在する
という結果になりました。
単純に「損切りを入れれば安全になる」という話ではなく、
損失をどこまで許容し、利益をどこまで伸ばすか
というバランスをルールとして決める必要があります。
特に自動売買では、その場の感覚で判断することはできません。
だからこそ、こうした一つひとつのルールをバックテストで検証しながら決めていく必要があると考えています。
次回は、今回見つかった「一度出た利益を全部吐き出してしまう」という問題に対して、トレーリングSTOPを実装して検証していきます。



コメント