「さっき出た買いサインが、チャートを開き直したら消えていた」。この現象をすべて“不正なリペイント”と呼ぶと、原因を見誤ります。形成中の足で価格が動いたのか、上位足がまだ確定していなかったのか、転換点が後から確定したのか、それとも本当に未来の値を過去へ入れたのかで、危険度と対処法は違います。
リペイントは、リアルタイム中に見えた計算・表示と、後で履歴として再計算した結果が異なる現象の総称です。未確定足はまだ高値・安値・終値が変わる現在のローソク足、未来データ(ルックアヘッド)は、その時点では知り得なかった値を過去の判断へ使う検証上の欠陥です。前二者は用途を理解すれば使える場合がありますが、未来参照で作った成績は売買時点に再現できません。
サインを評価するときは、「いつ計算したか」「その時点で確定していた値は何か」「アラートと注文はいつ出たか」を1本の時系列で記録します。足の確定を待てば安定性は上がる一方、必ず1本分遅れます。速さと確定性を同時に最大化することはできません。未来参照、過去への描画、合成価格での約定は、見栄えのよい履歴を作るため採用しません。
リペイントとは?「消えるサイン」だけではありません
TradingViewのPine Script公式文書は、リペイントを「履歴計算とリアルタイム計算・描画が異なる動作」と定義しています。現在足では終値・高値・安値が更新され、履歴足には最終OHLCしか残らないため、一般的なRSIやMACDでも現在足の値は確定まで揺れます。公式文書も、すべてのリペイントが無価値・不正というわけではないと説明しています(TradingView「Repainting」)。
| 種類 | 何が起きるか | 実務判断 |
|---|---|---|
| 現在足の更新 | 価格変動で条件が成立・不成立を繰り返す | 確定前サインと明示すれば用途あり |
| 上位足の未確定値 | 日足などの途中値が下位足上で変わる | 現在値か直前確定値かを選ぶ |
| 後から確定する転換点 | ピボットやZigZagの直近点が移動する | 検出時刻と描画時刻を分ける |
| 過去への描画 | 数本後に分かった点を発生位置へ戻して表示 | 当時見えたように誤認しやすい |
| 未来参照 | 後で確定する値を過去へ先取り | 検証不成立。修正必須 |
| データ改訂 | 取引所・業者の履歴修正で値が変わる | データ版と取得日時を保存 |
したがって「この指標はリペイントしますか」だけでは判定できません。必要なのは、現在足で動くのか、確定を待つ設定があるか、過去へマーカーを戻すか、再読込後に結果が変わるか、上位足をどう取得しているかという具体的な質問です。

未確定足でサインが点滅する仕組み
5分足の3分時点で株価が移動平均線を上抜けば、クロス条件は一度成立します。しかし残り2分で値が下がれば、終値ではクロスしていません。リアルタイム画面では「成立→消滅」を観察できますが、翌日に履歴を見ると最後の状態しか残らないため、サインが最初から存在しなかったように見えます。
TradingView公式文書によれば、履歴足には途中の値動きの記録ではなくOHLCがあり、リアルタイム足では高値・安値・終値が確定まで変化します。barstate.isconfirmedは履歴足とリアルタイム足の最終更新で真になるため、足の終了まで条件を保留する用途に使えます。ただし、request.security()の呼び出し内部では同じ使い方ができない点に注意が必要です(TradingView「Bar states」)。
| 判定方式 | 利点 | 弱点 | 向く用途 |
|---|---|---|---|
| ティックごと | 変化を早く把握 | 点滅し、履歴で再現しにくい | 監視、裁量判断の補助 |
| 足確定時 | 履歴と整合しやすい | 確定まで待つ | アラート、終値ベース売買 |
| 前の確定足 | 最も単純で再現しやすい | 1本分遅れる | 自動化、厳密な検証 |
| 足の始値 | 形成中も値が変わらない | 終値条件とは別物 | 寄り付き基準のルール |
確定を待つことは、勝率を上げる魔法ではありません。早い上抜けを取れる機会が減る一方、途中で消えるサインも減ります。確定前と確定後は別戦略として、期待値、損失幅、注文可能時刻を別々に検証します。
アラートは「一度だけ」より「いつ一度か」を確認する
アラート設定に「1回」と書かれていても、足の最初の成立で1回なのか、足の確定時に1回なのかで意味が変わります。TradingViewのalert()には、リアルタイム足の最初の呼び出しで発火するalert.freq_once_per_barと、足の終了時だけ発火するalert.freq_once_per_bar_closeがあります。アラートはリアルタイム足だけで動き、作成時のスクリプト・入力値・銘柄・時間足がサーバーへ保存されるため、後から設定を変えても既存アラートへ自動反映されません(TradingView「Alerts」)。
検証ではチャート上の矢印だけでなく、発火日時、足の開始・終了、条件値、通知頻度、再作成日時を保存します。リアルタイムで受けた通知と、翌日にチャートへ残ったマーカーを突き合わせると、「通知は出たのに履歴では消えた」という差を定量化できます。
- 確定前通知:速さを取る代わりに、取り消しが起こる前提で使います。
- 確定時通知:シグナルの再現性を重視し、次の実行可能価格で注文します。
- 既存アラート:コードや入力値を変更したら、削除・再作成の要否を確認します。
- 注文連携:同じ通知の重複、通信遅延、再送時の二重注文を防ぐ識別子を持たせます。
上位足を下位足へ表示するときの落とし穴
5分足に日足の高値や移動平均を表示する場面では、「今日の日足の途中値」と「昨日までに確定した日足値」を区別します。今日の高値は取引中に更新されます。リアルタイムでは自然な動作ですが、スクリプトを再起動すると、その途中値は履歴に残らず、最終の日足値へ置き換わります。
Pine Scriptのrequest.security()で上位足を取得する場合、公式文書が示す再現性重視の方法は、式を1本以上過去へずらし、barmerge.lookahead_onを組み合わせて直前の確定値を使うことです。逆に、ずらさずlookahead_onを使うと、履歴上で上位足の最終値が確定前の下位足へ表示され、未来漏洩になります(TradingView「Other timeframes and data」)。

| 取得方法 | 履歴での見え方 | リアルタイム | 判定 |
|---|---|---|---|
| 現在の上位足値 | 確定値として残る | 終了まで変動 | 用途を明示すれば利用可 |
| 直前上位足[1]+lookahead_on | 期間冒頭から直前確定値 | 履歴と同じ | 再現性重視 |
| 現在値+lookahead_on | 最終値が期間冒頭から見える | 未来は取得不能 | 未来漏洩 |
| 下位足を単一値で代表 | 最初または最後の1本のみ | 並びが未確定 | 用途と関数を要確認 |
「日足RSIが30を超えたら5分足で買う」という条件なら、取引中の日足RSIを使うのか、前日確定のRSIを使うのかを仕様書へ明記します。前者は日中に条件が消える可能性があり、後者は翌日まで待つ代わりに検証しやすくなります。どちらが正解ではなく、同じ名前で混ぜないことが重要です。
ZigZagとピボットは「転換点が分かる時刻」を見る
ZigZagは小さな値動きを省き、一定の反転幅を満たした転換点を結ぶ表示です。直近の山を付けた瞬間に山と確定するのではなく、その後に必要な下落が起きて初めて確認できます。それまで高値が更新されれば、直近の線の終点も移動します。過去の完成図だけを見ると、天井と底をその場で示したように見えるのが落とし穴です。
ピボットも同じです。たとえば左右5本の高値を比べる転換点なら、右側5本ができるまで判定できません。公式のリペイント文書は、5本後に確定したピボットを5本前へ戻して描く例を挙げ、履歴上で当時見えたと誤認しやすいと注意しています。分析用に発生位置へ描く場合でも、売買ロジックでは「5本後に検出した」と扱います(TradingView「Plotting in the past」)。後から安値の場所が分かったことと、その日に買いを判断できたことは違います。過去の自分に未来の情報を渡した検証にはしたくありません。

説明用の架空例です。100円から110円へ上昇後、反転条件を5%とします。110円から104.5円以下へ下がる前に112円へ更新したら、山候補は112円へ移ります。その後106.4円以下で初めて5%反転が成立します。山の位置は112円の足でも、売買判断に使えるのは反転を確認した後です。
| 記録 | 例 | 役割 |
|---|---|---|
| 候補価格 | 110円→112円へ更新 | 直近の極値 |
| 反転条件 | 高値から5%下落 | 確定ルール |
| 発生位置 | 112円を付けた足 | チャート上の山 |
| 検出時刻 | 106.4円以下を確認した足 | 注文可能性の起点 |
| 注文価格 | 次の実行可能な気配・寄り | バックテスト約定 |
平均足・練行足・カギ足などの合成価格を約定に使わない
平均足、練行足、カギ足、ポイント・アンド・フィギュアは、値動きを読みやすく変換するチャートです。変換後の始値・終値や箱の価格が、そのまま市場で取引できたとは限りません。TradingViewの公式文書は、平均足のOHLCを実際の市場価格ではない合成値と説明し、注文は市場価格で約定するため、平均足価格を使うバックテストや自動売買には不向きとしています(TradingView「Non-standard charts data」)。
合成足でトレンド状態を判断することと、合成価格で利益を計算することは別です。シグナルは合成足から作っても、約定は同時刻の通常OHLC、板、ティックなど実際に利用できる価格系列へ戻します。平均足の計算と用途は平均足の記事、時間に依存しないチャートの考え方はポイント・アンド・フィギュアの記事で説明しています。
| チャート | 価格の性質 | 主な用途 | 約定検証 |
|---|---|---|---|
| 通常ローソク足 | 市場のOHLC | 時間ごとの価格確認 | 注文規則に合わせて使用 |
| 平均足 | 平均化した合成OHLC | 方向の視認 | 通常価格へ戻す |
| 練行足 | 一定変動で作る箱 | ノイズ除去 | 箱価格で約定させない |
| カギ足 | 転換幅で線を更新 | 方向転換の把握 | 検出時刻の市場価格を使う |
| P&F | 時間を均等に持たない合成列 | 価格変動の整理 | 通常価格と時刻を対応させる |
再現テストはスクリーンショットではなくイベントログで行う
画面を見比べるだけでは、どの更新で変わったか追えません。最低限、銘柄、時間足、タイムゾーン、足の開始・終了、計算時刻、入力値、条件値、サイン状態、アラート、注文、約定、コード版を1行ずつ保存します。データ提供元と調整株価の設定も残します。
- リアルタイム記録:足の途中と確定時に、条件値とサインを記録します。
- 再起動テスト:同じコード・設定でチャートを再読込し、履歴と差を取ります。
- リプレイ:見える未来を隠し、1本ずつ進めてサインが出た時刻を記録します。
- 上位足点検:現在値、直前確定値、取得関数、lookahead設定を一覧にします。
- 注文点検:検出時刻より前の価格で約定していないか確認します。
- 合成足点検:シグナル価格と市場の約定価格を分離します。
- 差分分類:許容する更新、仕様上の遅れ、未来漏洩、データ改訂に分けます。
バックテストの基本的な時間順、費用、注文の置き方はテクニカル手法のバックテスト入門、評価期間を何度も見て作り替える問題は過剰最適化・ウォークフォワード検証の記事と組み合わせて確認してください。
注文・撤退・数量・見送りを確定情報へ合わせる
終値確定を条件にした日足戦略なら、その日の終値を見て同じ終値で買うことはできません。原則は翌営業日の寄りや指値など、判定後に実行できる価格です。確定前サインを使うなら、どの更新で発注し、足の終了前に条件が消えたら注文を取り消すのか、約定済みなら保有を続けるのかを先に決めます。
数量はサインの見栄えではなく、無効化点までの損失で決めます。架空例として、口座500万円、1回の許容損失0.3%=1万5,000円、予定入口1,500円、初期ストップ1,440円、費用・ギャップ余裕20円なら、1株リスクは80円です。数量上限は15,000÷80=187株で、100株単位なら100株へ切り下げます。確定前サインで取り消し率が高いなら、同じ損失上限でもさらに縮小してフォワード検証します。
- 注文:サイン時刻より後の実行可能価格。終値判定なら次の足を使います。
- 撤退:価格ストップ、時間切れ、条件消滅、システム異常を分けます。
- 数量:許容損失÷(入口-無効化点+費用余裕)を単元へ切り下げます。
- 見送り:確定状態が不明、時刻同期ずれ、データ欠損、合成価格しか取れない場合です。
- 停止:再読込でサイン履歴が大きく変わる、通知とログが一致しない、未来漏洩を発見した場合です。
リペイントを完全にゼロへするために遅い情報だけを使う必要はありません。確定前の変化を観測する戦略も成立し得ます。ただし、その履歴は通常のローソク足だけから完全再現できないため、ティックやリアルタイムログを保存し、後から都合よく消えた通知を除外しないことが条件です。
未来データは「チャートの機能」以外からも入り込みます
未来参照はlookaheadの設定だけで起きるわけではありません。後日公表された決算値を決算期末日に置く、現在の採用銘柄だけで過去を検証する、将来の上場廃止を知ったうえで対象から外す、翌日の高値・安値で当日の売買条件を決める処理も、当時使えなかった情報を混ぜます。コードがエラーなく動いても、情報の公表時刻を再現していなければ結果は実行不能です。
企業データは対象期間ではなく、投資家が利用できた日時を基準にします。取引終了後に発表された資料は原則として次の取引可能時点から使い、訂正資料が出た場合は初版と訂正版を区別します。指数採用銘柄や業種分類も、現在の一覧を過去へ固定せず、各時点の構成を使います。取得できない場合は、利用可能なデータだけで生存者バイアスがあると明示し、強い成績を一般化しません。
特徴量の標準化にも注意します。全期間の平均・標準偏差、最大値・最小値、欠損率を先に計算してから期間を分けると、評価期間の分布が学習へ入ります。移動窓ごとに学習側だけで変換器を作り、直後の評価へ固定して適用します。銘柄選択、パラメータ選択、しきい値調整も同じです。詳しい期間分割はウォークフォワード検証の記事で扱っています。
各入力列に「観測対象日」と「利用可能になった日時」を持たせます。売買判断時刻より利用可能日時が後なら、その値は欠損として扱います。発表日が分かっても発表時刻が不明な場合は、同日中に使えたと仮定せず、次の営業日から利用する保守的な処理を選びます。
リアルタイムと履歴を同じ入力で再生する
検証環境を閉じて開き直したときだけ結果が変わるなら、入力系列か実行回数に違いがあります。リアルタイム中に保存した各更新の時刻、価格、上位足値、指標値を読み込み、同じ順序で再生します。再生結果と通知ログが一致しなければ、足途中の状態を保持する変数、タイムゾーン、セッション、データ欠損の埋め方を確認します。
一致しないからといって、後の履歴へ合うよう通知ログを消してはいけません。実運用で受け取った通知こそ、当時の情報で動いた証拠です。履歴側は最終OHLC、リアルタイム側は途中更新を含む別のデータ集合だと理解し、同条件で比較できる範囲を限定します。
採用前の15項目チェックリスト
- サインの計算時刻と足の確定時刻を区別した。
- 確定前に値が変わる入力を一覧にした。
- 足途中と足確定のアラート頻度を確認した。
- コード・入力値変更後に既存アラートを再作成した。
- 上位足は現在値か直前確定値か明記した。
lookahead_onを無オフセットで使っていない。- ピボットの発生位置と検出時刻を分けた。
- ZigZagの直近線が動く前提を記録した。
- 過去へ戻したマーカーを当時の通知として数えていない。
- 合成足の価格を約定価格に使っていない。
- リプレイと再起動後の差を確認した。
- 通知ログとチャート履歴を突き合わせた。
- 判定後に実行可能な価格で約定させた。
- 注文、撤退、数量、見送り、停止を固定した。
- 差が説明できないうちは実資金を増やしていない。
まとめ:きれいな履歴より、当時見えた情報を残す
未確定足が動くこと、上位足の途中値が変わること、ZigZagの直近点が更新されることは、それだけで不正ではありません。問題は、リアルタイムと履歴の違いを説明せず、後から確定した線や値を当時から分かったサインとして成績へ入れることです。サインが変わることを一律に責めるより、何がいつ確定したかを知る方が役立ちそうです。画面の成功例より、その順番を残して読みます。
足の途中か確定後か、上位足は現在値か直前値か、転換点はいつ検出したか、合成足か市場価格かを固定してください。アラート、注文、約定をイベントログへ残し、再起動後の履歴と比較します。未来参照や過去への描画が見つかったら、そのバックテストは修正前の成績を捨ててやり直します。投資辞典の索引から、平均足、時間足、バックテスト、過剰最適化の記事とつなげると、サインの見栄えではなく再現できる売買手順を組み立てられます。
本記事は投資手法の学習を目的とし、特定銘柄の売買を推奨するものではありません。数値例は架空で、チャートの履歴表示やバックテストは将来の利益・損失を保証しません。投資判断はご自身の責任でお願いいたします。記載の数値は、本文中に示した日付時点の決算短信・会社のIR資料などの公開情報に基づきます。最新の情報は各社の開示でご確認ください。

