日本株の検証を、実測で。

1分足の四本値では、損切りと利確のどちらが先に付いたか分からない

損切りと利確を同時に置いて検証するとき、同じ1分足の中で両方に触ってしまうことがあります。四本値(始値・高値・安値・終値)しか無いと、そのときどちらが先だったかは決められません

  • 建値±0.1%に置くと、どちらかに触った足の10.0%で両方に触りました
  • その中で先だったのは 上が47.1% / 下が52.9%。ほぼ半々です
  • 実際の売買で試すと、決め打ち次第で損益が −38%〜+35% 動きました
  • 両方に触った足が1回だけで、損益の符号が変わった銘柄もありました
  • ティックがあれば、決め打ちせず実際に先に触ったほうで決められます

何が決められないのか

1分足が持っているのは、その1分の始値・高値・安値・終値の4つだけです。高値と安値がどちらの順に付いたかという情報は入っていません。

普段はそれで困りません。困るのは、損切りと利確を同時に置いたときです。

bar_only.py
# よくある書き方。ここには決められないことが隠れている
if bar.Low <= stop:
    exit_at(stop)        # 損切り
elif bar.High >= target:
    exit_at(target)      # 利確

# 上から順に見ているので、
# 「安値も高値も条件を満たした足」は必ず損切りになる。
# それが正しいかどうかは、四本値からは分からない。

上から順に見ているので、安値も高値も条件を満たした足は必ず損切りになります。順番を入れ替えれば、必ず利確になります。どちらが正しいかは、四本値からは分かりません。

どれくらいの頻度で起きるか

東証上場80銘柄・14営業日のティックを使って、1分足ごとに「始値から上下に同じ幅を置いたとき、両方に触ったか」を数えました。317,760通りを調べています。

建値からの幅どちらかに触った足両方に触った足その割合上が先下が先
0.1%28,7302,86110.0%47.1%52.9%
0.2%12,5531,0168.1%46.1%53.9%
0.3%7,3926138.3%46.3%53.7%
0.5%3,6721935.3%48.7%51.3%
  • 幅を狭くするほど起きやすく、0.1%なら10回に1回
  • 幅を 0.5% に広げても 5.3% は残る
  • そしてどちらが先かは、ほぼ半々。片方に決め打ちすると、その半分が取り違えになる

「上が先 47%・下が先 53%」がほぼ半々なのは、むしろ当然です。始値から上下同じ幅に置いているので、偏る理由がありません。だからこそ決め打ちできないのです。

実際の売買で、いくら違うのか

頻度が2〜3%なら無視してよいのでは、と思うかもしれません。実際に測りました。

52銘柄・2,908取引(直近20本の高値を抜けたら買い、建値±0.2%に損切りと利確)。変えたのは「同じ足に両方入ったときの判定」だけです。

判定の仕方損益合計正しい値との差
実際に先に触ったほう(ティック)−226,770 円±0
損切りが先だったことにする−313,229 円−86,459 円
利確が先だったことにする−147,713 円+79,056 円

同じ戦略・同じ幅なのに、決め打ち次第で損益が 165,516円ぶん動きます。正しい値に対して −38% 〜 +35% の幅です。

決め打ち次第で損益がどれだけ動くか
同じ戦略・同じ幅で、判定の仕方だけを変えたときの損益

頻度が低いのに、なぜここまで動くのか

両方に触った足は、2,908取引のうち 77回(2.6%)しかありません。それでも損益が38%動くのは、1回あたりの影響が大きいからです。

銘柄取引両方の足損切り優先実際の順序利確優先振れ幅
29720351−33,760+8,440+8,44042,200
89540621−225,380−225,380−187,06038,320
9984025814+16,427+33,997+51,12634,699
662201462−5,478−414+4,58210,060

29720 は、両方に触った足が たった1回です。その1回の判定で、損益が −33,760円 から +8,440円 に変わりました。符号が反転しています。「めったに起きないから無視してよい」とは言えません。

ティックがあれば、決め打ちしなくてよい

約定データがあれば、その1分の中で実際にどちらが先に付いたかが分かります。

tick_way.py
# ティックがあれば、決め打ちしなくてよい
px = ticks_in_this_bar["Price"].to_numpy()

hit_stop   = np.flatnonzero(px <= stop)
hit_target = np.flatnonzero(px >= target)

if hit_stop.size and hit_target.size:
    # 両方に触った。先に触ったほうが本当の結果
    stop_first = hit_stop[0] < hit_target[0]
else:
    stop_first = hit_stop.size > 0

やっていることは単純で、その足の約定を順に見て、先に条件を満たしたほうを採るだけです。難しいのは、そのために1日431万件の約定を扱えるようにしておくことのほうです。

自分の検証がどちら側か確かめる

  1. 損切りと利確を同時に置いているか。片方だけなら、この問題は起きません
  2. 使っているデータは四本値だけか。四本値だけなら、必ずどこかで決め打ちしています
  3. その決め打ちがどちらか知っているか。多くのツールは「損切り優先」です(安全側に見せるため)
  4. 逆の決め打ちでも回してみる。結果が大きく変わるなら、その戦略の成績はその決め打ちに依存しています

4番目が、四本値しか無くてもできる確認です。両方で回して、差が小さければ気にしなくてよい。差が大きければ、その成績は信用できません。


まとめ

  • 1分足の四本値には高値と安値の順序が入っていない
  • 損切りと利確を同時に置くと、触った足の5〜10%で両方に触る
  • どちらが先かはほぼ半々なので、決め打ちの半分は取り違え
  • 実測では損益が −38%〜+35% 動き、1回で符号が変わる銘柄もあった
  • ティックがあれば決め打ちが要らない

これは MT4 のバックテストで「1分足モデル」と「全ティック」の結果が違う理由と、まったく同じ構造の話です。日本株でも同じことが起きていますが、測った人をまだ見かけません。

この記事の出どころ

  • データ:J-Quants API「株価 分足・ティック」アドオン(ベースは Light プラン)
  • 頻度の調査:東証上場80銘柄・14営業日 / 1分足×幅4種で 317,760通り
  • 売買の調査:52銘柄・2,908取引 / 20本高値ブレイク+建値±0.2% / 約定は「判定した足の次のティック」/手数料は0円として計算
  • 環境:Windows 11 / Python 3.12 / pandas 3.0 / pyarrow 25
  • 測定日:2026年9月21日
  • 注意:戦略そのものに意味はありません。損切りと利確が両方置かれる形であればよく、勝てる手法を示すものではありません。掲載したのは集計結果で、取得したデータそのものは配布していません