コンテンツにスキップ

相場構造(Market Structure)

相場構造は、価格の高値・安値の連続(swing)からトレンドとレンジを構造的に定義し、トレンド継続(BOS)と転換(CHoCH)の判定、上位足と下位足の整合(HTF-LTF alignment)の手順を体系化する枠組みです。起源は Dow 理論(1900 年代前後)の higher high / higher low 定義で、現代のプライスアクション(Al Brooks、Michael Huddleston ほか)が BOS(Break of Structure)と CHoCH(Change of Character)として細分化しました。トレンドは swing 高値と安値がどちらも同方向に更新される状態、レンジは swing の更新方向が交互になる状態です。上位足の構造で方向を決め、下位足の構造でタイミングを取るのが基本になります。

エントリー方向の決定、損切り位置の設計、トレンドの終わり(CHoCH)の早期検出、複数時間足での整合確認に使います。ローソク足パターンチャートパターンSMC 概念の土台となる考え方です。

用語

スイング(Swing)の定義

スイングハイ(swing high)

  • 対象足の高値が、左右 N 本の高値すべてより高い
  • 記号: SH。H_t > H_{t-i} かつ H_t > H_{t+j}i, j = 1..N

スイングロー(swing low)

  • 対象足の安値が、左右 N 本の安値すべてより低い
  • 記号: SL。L_t < L_{t-i} かつ L_t < L_{t+j}i, j = 1..N

N の選び方

N呼称用途
2〜3短期スイング(Al Brooks の 3-bar swing)5〜15分足のエントリー判定
5中期スイング(Bill Williams / fractal の標準)15分〜1H での構造把握
10長期スイング4H〜日足の主要 swing
20〜50主要 swing週足の主要な高値・安値

N を大きくすると遅いが主要 swing のみ検出、小さくすると早いがノイズが増えます。時間足を上げると N を下げても実質的に主要 swing になります。

HH / HL / LH / LL

Dow 理論由来の 4 状態です。

記号意味判定
HH(higher high)直近スイングハイが前のスイングハイより高いSH_t > SH_{t-1}
HL(higher low)直近スイングローが前のスイングローより高いSL_t > SL_{t-1}
LH(lower high)直近スイングハイが前のスイングハイより低いSH_t < SH_{t-1}
LL(lower low)直近スイングローが前のスイングローより低いSL_t < SL_{t-1}

相場構造の模式図。左は上昇のHH/HL、右はBOS(継続)とCHoCH(転換)。

模式図(理想化した形状)。swingの更新方向でトレンドと転換を読む。

トレンドとレンジの定義

上昇トレンド(uptrend)

  • HH と HL が交互に更新される
  • swing 構造: ... HL → HH → HL → HH → ...
  • 崩れの初回サイン: HH が更新できず LH になる、または HL が LL になる

下降トレンド(downtrend)

  • LH と LL が交互に更新される
  • swing 構造: ... LH → LL → LH → LL → ...
  • 崩れの初回サイン: LL が更新できず HL になる、または LH が HH になる

レンジ(range / consolidation)

  • swing 高値がほぼ同水準(HH でも LH でもない、equal high)
  • swing 安値がほぼ同水準(equal low)
  • HH と LL、または LH と HL が交互に出て方向が定まらない

BOS(Break of Structure)

定義

  • 既存トレンド方向への直近スイング(HH または LL)の更新
  • 上昇トレンド中の BOS = 直近 HH を新たな HH で上抜け
  • 下降トレンド中の BOS = 直近 LL を新たな LL で下抜け
  • 既存トレンドの継続確認となる

判定

  • 終値ベースが原則。髭抜けだけでは BOS としない流派が多い
  • 抜けた瞬間の実体の大きさ(impulse)も評価に入れる。小さな実体での抜けは弱い

CHoCH(Change of Character)

定義

  • 既存トレンドと逆方向への直近スイング(HL または LH)の反対方向抜け
  • 上昇トレンド中の CHoCH = 直近 HL を下抜け(新たな LL 形成)
  • 下降トレンド中の CHoCH = 直近 LH を上抜け(新たな HH 形成)
  • トレンド転換の初回シグナルとなる

判定

  • BOS と同じく終値ベース
  • CHoCH は初動であり、その後の swing が完全な逆方向構造(HH-HL → LL-LH)に整うまではレンジ入りとも解釈できる
  • CHoCH の後、次の swing が失敗(元方向に BOS)すればレンジ、成功(逆方向 BOS)すれば新トレンドとなる

BOS と CHoCH の関係

上昇トレンドから下降トレンドへの転換は次の順で観測されます。

  1. 上昇トレンド継続中: HH の BOS が連続
  2. HH の更新失敗 → LH 形成
  3. HL を下抜け → CHoCH(下方向)
  4. LH を上抜けようとして失敗 → 新たな LH
  5. LL 形成 → 下方向の BOS
  6. 下降トレンド確定

CHoCH は早いがダマシがあり、BOS は遅いが確度が高いというトレードオフです。CHoCH は転換候補の初動、BOS は転換確定の遅行指標にあたります。

HTF-LTF アライメント

時間足の階層

呼称時間足主な役割
HTF(Higher Time Frame)週足 / 日足 / 4H環境認識、大局トレンド、主要な支持抵抗の把握
MTF(Middle Time Frame)1Hエントリー方向の絞り込み、swing の主要な turning point
LTF(Lower Time Frame)15分 / 5分エントリータイミング、精密な損切り位置

上位から下位へ整合させます(top-down analysis)。

アライメントの型

強い整合(all-aligned uptrend)

  • 週足: 上昇トレンド
  • 日足: 上昇トレンド
  • 4H: 上昇トレンド
  • 1H: 上昇トレンド、または押し目形成中
  • 15分: 押し目からの反発初動

→ 買い方向のみ、押し目待ち。逆張りしない。

混在(mixed)

  • 日足: 上昇トレンド(直近 CHoCH は未発生)
  • 4H: 下降トレンド(レンジ内)
  • 1H: 下降トレンド

→ 日足の押し目か、日足の CHoCH の初動か、下位足では区別が困難。ポジションを持たない、または小 Lot で 4H の BOS 待ち。

転換候補(top-down CHoCH)

  • 日足: 上昇トレンド継続だが、直近 HH の更新に失敗(LH 出現)
  • 4H: CHoCH 発生(直近 HL を下抜け)
  • 1H: 下降トレンド初動

→ 4H の CHoCH が確定した瞬間に、日足の反転候補。1H での戻り売りが機能する条件。

上位足の主要 swing の在庫を管理する

  • 日足の直近スイングハイ・スイングローを常に更新
  • 週足の直近月間高値・安値を月初にメモ
  • 4H の直近セッション高値・安値をロンドン・NY オープン前に確認

上位足の swing 水準は、下位足での支持抵抗として機能する頻度が高くなります。

実運用の型

エントリーの決定手順

  1. 週足・日足で方向を決める

    • 上昇トレンド(HH-HL 構造)なら買い方向のみ
    • 下降トレンド(LH-LL 構造)なら売り方向のみ
    • レンジならエントリーせず、または上位足の BOS / CHoCH 待ち
  2. 4H・1H で押し目 / 戻りの水準を特定

    • 上位トレンドの方向で、上昇トレンドなら直近スイングローまでの押し目を待つ
    • フィボナッチ 38.2%〜61.8%、直近 HL、水平線と重ねる
  3. 15分・5分でエントリートリガー

    • 押し目でのローソク足反転パターン(ハンマー、包み足)+ CHoCH
    • 損切り: 直近スイングローの少し下

損切り位置の設計

  • 常に、その位置を割ったら構造が崩れる水準の外側に置く
  • 上昇トレンドの押し目買い → 直近 HL の下(割れたら CHoCH)
  • 下降トレンドの戻り売り → 直近 LH の上(抜けたら CHoCH)
  • 髭の外側、または ATR 分の余裕を持たせる

CHoCH を出口シグナルに使う

  • ポジション保有中の下位足で CHoCH が出たら、部分利確または全 clear の候補
  • 15分・1H の CHoCH は、上位足の押し目形成の初動にも上位足トレンド転換の初動にもなる。上位足の構造で判断する

落とし穴

  • N を勝手に変えない: swing 判定の N を後付けで変えると、既存の HH / HL 判定が変わる。N は事前に固定する
  • 時間足を混ぜて判定しない: 15分の HH と日足の HH は別物。判定に使う時間足を明示的に固定し、混ぜて多分反転と読まない
  • BOS の髭抜けを採用しない: 髭のみで抜けた場合、終値では戻る例が多い。終値ベースで判定する
  • CHoCH の後を確定転換と即断しない: CHoCH は初動。その後の swing 失敗(元方向への再 BOS)でレンジ入りする可能性が高い。ダマシを許容する損切り幅を設ける
  • 上位足を無視した下位足の CHoCH に飛びつかない: 15分の CHoCH は 1H では単なる swing、日足ではノイズ。上位足のトレンドに反する下位足の CHoCH は勝率が低い
  • swing 高値・安値の主観的な引き直しをしない: この高値はカウントしないなどの後付けを許すと、構造判定が恣意的になる。algorithmic に判定する
  • 等高値 / 等安値(equal high/low)の扱いを決めておく: 完全に同値の高値・安値は HH でも LH でもない中間状態。事前に ±X pip 以内は equal 扱いと定義する
  • SMC 用語(BOS / CHoCH)は流派で微妙に定義が違う: 特に CHoCH と MSS(Market Structure Shift)を同一視する流派、分離する流派がある。本ページは既存トレンドの反対方向の直近 counter-swing を初めて抜けた瞬間を CHoCH とする定義に統一する

Python 実装スケッチ

Swing 検出、HH/HL/LH/LL のラベル付け、BOS / CHoCH の判定を最小構成で示します。

import pandas as pd
import numpy as np
from scipy.signal import argrelextrema
def detect_swings(df: pd.DataFrame, n: int = 5) -> pd.DataFrame:
highs = argrelextrema(df["high"].values, np.greater, order=n)[0]
lows = argrelextrema(df["low"].values, np.less, order=n)[0]
swing_high = pd.Series(np.nan, index=df.index)
swing_low = pd.Series(np.nan, index=df.index)
swing_high.iloc[highs] = df["high"].iloc[highs]
swing_low.iloc[lows] = df["low"].iloc[lows]
return pd.DataFrame({"swing_high": swing_high, "swing_low": swing_low})
def label_structure(swings: pd.DataFrame) -> pd.DataFrame:
highs = swings["swing_high"].dropna()
lows = swings["swing_low"].dropna()
high_labels = pd.Series("HH", index=highs.index)
high_labels[highs < highs.shift(1)] = "LH"
low_labels = pd.Series("HL", index=lows.index)
low_labels[lows < lows.shift(1)] = "LL"
return pd.DataFrame({"high_label": high_labels, "low_label": low_labels})
def detect_bos_choch(df: pd.DataFrame, labels: pd.DataFrame) -> pd.DataFrame:
events = []
last_hh = None
last_hl = None
last_lh = None
last_ll = None
trend = None
for ts, row in labels.iterrows():
if pd.notna(row.get("high_label")):
level = row.name
if row["high_label"] == "HH":
if trend == "down":
events.append((ts, "CHoCH_UP", level))
elif trend == "up":
events.append((ts, "BOS_UP", level))
trend = "up"
last_hh = level
elif row["high_label"] == "LH":
last_lh = level
if pd.notna(row.get("low_label")):
level = row.name
if row["low_label"] == "LL":
if trend == "up":
events.append((ts, "CHoCH_DOWN", level))
elif trend == "down":
events.append((ts, "BOS_DOWN", level))
trend = "down"
last_ll = level
elif row["low_label"] == "HL":
last_hl = level
return pd.DataFrame(events, columns=["timestamp", "event", "level"])
  • detect_swingsscipy.signal.argrelextrema で局所極値のインデックスを取り、swing 高安の Series を返す
  • label_structure は連続する swing の比較で HH/HL/LH/LL を付ける
  • detect_bos_choch は状態機械で trend を追跡し、トレンド方向と一致する更新を BOS、反対方向の初回抜けを CHoCH と分類する
  • 実運用ではさらに終値ベースでの抜け(単なる swing 更新ではなくクローズ確定)を条件に加える。上記は swing 検出時点でのラベル付けまで
  • 検出結果を上位足・下位足で並べ、HTF-LTF alignment を判定する後段関数は別途組む

参考

  • Charles H. Dow, Wall Street Journal editorials (1899-1902) — Dow 理論の原型
  • Robert Rhea, The Dow Theory, Barron’s, 1932
  • Al Brooks, Reading Price Charts Bar by Bar, Wiley, 2009
  • Al Brooks, Trading Price Action Trends / Reversals / Ranges 3 巻シリーズ, Wiley, 2012
  • Michael J. Huddleston (ICT), The Inner Circle Trader 教材(公開レクチャー) — CHoCH / MSS 概念の細分化
  • John J. Murphy, Technical Analysis of the Financial Markets, ch. 4 (Basic Concepts of Dow Theory)
  • Bill Williams, Trading Chaos, John Wiley & Sons, 1995 — Fractal (5-bar swing) の原型