「分足の終値で約定したことにすると成績が良く出る」——バックテストの入門書によくある注意です。日本株の1分足で測ったら、順張りでは逆に悪く出ました。逆張りでは通説どおり良く出ます。向きが戦略の型で決まっていました。
- 順張り(移動平均クロス):37銘柄中28銘柄で「悪く」出た
- 逆張り(急落を買う):37銘柄中25銘柄で「良く」出た
- 1取引あたり 順張り −35.9円 / 逆張り +33.7円(100株)
- 厚い銘柄では、どちらもほぼ消えます(逆張りで −1.0円)
- つまり「終値約定は甘い」は無条件には成り立ちません
何を比べたか
同じ銘柄・同じ期間・同じ戦略で、約定のつけ方だけを変えます。
# 約定のつけ方を切り替えるだけ。戦略もデータも同じ
Config(fill_model="bar_close") # 合図が出た足の終値でそのまま約定
Config(fill_model="tick") # 次のティックの値段で約定bar_close:合図が出た足の終値で、遅れなく約定できたことにするtick:合図のあと、実際に次に付いた値段で約定する
使った戦略は2つです。どちらも中身に意味はありません。「合図が出る場面」が逆になるように選んだだけです。
# 順張り:移動平均のクロス(5/20)
f = c.iloc[-5:].mean()
s = c.iloc[-20:].mean()
if (f > s) != prev_up: # クロスした足で仕掛ける
ctx.buy() if f > s else ctx.sell()
# 逆張り:1本で0.15%以上下げたら買い、5本で手仕舞い
if bar["C"] / prev_close - 1.0 <= -0.0015:
ctx.buy()★ 順張りでは、終値約定のほうが「悪く」出た
まず移動平均クロスで測りました。通説どおりなら、終値約定のほうが良く出るはずです。
| 結果 | |
|---|---|
| 対象 | 37銘柄 / 14営業日 / 2,209取引 |
| 終値約定のほうが良く出た銘柄 | 9 / 37 |
| 終値約定のほうが悪く出た銘柄 | 28 / 37 |
| 1取引あたりの差(100株) | 中央 −35.9円 |
逆でした。最初は実装を疑いましたが、何度回しても同じでした。
理由を考える
終値約定は「スリッページがゼロ」という意味ではありません。「合図が出た瞬間の値段で買える」という意味です。問題は、その瞬間の値段がどこにあるかです。
順張りの合図は、上がった直後に出ます。移動平均がクロスするのは、価格が一方向に動いたあとです。つまりその足の終値は、その場の高値圏にあります。
一方、ティック約定では次に付いた値段で買います。1分足のスケールでは、行き過ぎたあとは少し戻ることが多い。だから遅れて買ったほうが、むしろ安く買えていたのです。
仮説が立ったら、向きが反対になる場面で確かめます。
もしこの説明が正しいなら、逆張りでは逆の結果になるはずです。合図が「下がった直後」に出るので、その足の終値はその場の安値圏。遅れて買うと、跳ね返ったところを買わされることになります。
★ 逆張りでは、通説どおり「良く」出た
同じ37銘柄・同じ期間で、急落を買う戦略に差し替えました。
| 順張り(移動平均クロス) | 逆張り(急落を買う) | |
|---|---|---|
| 取引数 | 2,209 | 3,367 |
| 終値約定のほうが良く出た銘柄 | 9 / 37 | 25 / 37 |
| 1取引あたりの差の中央値(100株) | −35.9円 | +33.7円 |
| 1株に直すと | −0.36円 | +0.34円 |
向きがきれいに反転しました。しかも大きさはほぼ同じ、1株あたり0.35円前後です。これは呼値1〜2つぶん、つまり買値と売値の差の半分に相当します。
厚い銘柄では消える
売買代金で3つに分けると、もう少しはっきりします。
| 銘柄の厚さ | 順張り | 逆張り |
|---|---|---|
| 薄い | −50.00円 | +90.16円 |
| 中 | −55.62円 | +28.94円 |
| 厚い | −17.65円 | −1.04円 |
厚い銘柄では、逆張りでも差がほぼゼロ(−1.04円)になります。薄い銘柄ほど買値と売値の差が広く、「その瞬間の値段」と「次に付く値段」が離れるからです。
これで説明が揃います。
終値約定と実約定の差は、買値と売値の差(とその跳ね返り)をどちら側で拾うかです。順張りは不利な側、逆張りは有利な側を拾います。差が広い銘柄ほど大きく、狭い銘柄では消えます。
では「終値約定は甘い」は嘘なのか
嘘ではありませんが、無条件ではありません。成り立つのは逆張り型で、かつ薄い銘柄のときです。順張り型では、むしろ実力より辛く出ます。
ここで怖いのは「甘く出る」ことより、どちら向きにずれているか分からないまま数字を信じることです。辛く出ているのを見て「この戦略はダメだ」と捨てているかもしれません。
- 自分の戦略が順張りか逆張りか、はっきりさせる
- 約定のつけ方を2通りで回して、差を見る。差が小さければ、どちらでもいい
- 差が大きいなら、薄い銘柄を疑う。厚い銘柄では消えます
- どちらで出した数字か、結果と一緒に書く
この記事の限界
- 戦略は2つだけです。順張り・逆張りの代表として選びましたが、2つで型を代表させています
- 14営業日・37銘柄です。期間が短く、相場の局面も1つだけです
- 指値は試していません。成行だけの話です
- 手数料は両方で同じなので、差には影響しません
それでも、向きが戦略の型で反転することと、厚い銘柄では消えることは、偶然で出る形ではないと思っています。
まとめ
「分足の終値で約定したことにすると甘く出る」——この注意書きは、半分だけ正しいものでした。
甘くなるのは逆張り型。順張り型では辛くなります。そして厚い銘柄ではどちらも消えます。大きさは1株あたり0.35円前後、買値と売値の差の半分ぶんでした。
通説をそのまま当てはめず、自分の戦略・自分の銘柄で、両方回して差を見る。回すだけなら設定を1行変えるだけです。
この記事の出どころ
- データ:J-Quants API V2 の bulk ティックから組んだ1分足。Light プラン+分足・ティックアドオン
- 期間:2026-09-01 〜 2026-09-18 の14営業日
- 対象:保管庫のファイルの大きさで厚いものから薄いものまで40銘柄を選び、両方の戦略が回せた37銘柄。順張り2,209取引・逆張り3,367取引
- 戦略:順張り=1分足の移動平均5/20クロス(成行・ドテン)/逆張り=1本で0.15%以上下げたら買い5本で手仕舞い(成行)。どちらも中身に意味は無く、合図が出る場面が逆になるように選んだだけ
- 約定:
bar_close(合図の足の終値)とtick(次に付いた値段)。手数料は両方同じ設定なので差には影響しない - 調整:株式分割・併合は日足の調整係数で補正済み
- 環境:Windows 11 / Python 3.12 / pandas 3.0 / numpy 2.5
- 測定日:2026年9月21日
- 注意:掲載したのは集計結果です。取得したデータそのものは配布していません。特定の売買を勧めるものでもありません