ダウ理論:高値と安値の切り上げでトレンドを判定する
- 5%反転で山・谷を決めると、確定するのは山(谷)から平均7.4日後。そのとき終値はすでに約6%離れている
- 「確定した山も谷も切り上げ」の間だけ持つと、取引28回・年率−1.1%・PF0.88。反転幅を4%にすると−3.9%、6%にすると+2.9%と大きくぶれた
- 上昇トレンドと判定された日の20日後リターンは平均+0.14%で、すべての日(+0.75%)を下回った
ダウ理論は「山と谷の並び」でトレンドを見る
ダウ理論は、株価の動きをいくつかの原則で説明する考え方です。その中でもっともよく使われるのが、トレンドの定義です。山(戻り高値)と谷(押し安値)がともに前回より高ければ上昇トレンド、ともに低ければ下降トレンドとみます。片方だけが切り上がっている状態は、どちらとも言えません。
機械的に検証するには、山と谷の決め方を固定する必要があります。ここでは#010 フィボナッチと同じ「ジグザグ法」を使いました。終値が直近の安値から5%以上上がったら、その安値を「谷」として確定し、直近の高値から5%以上下がったら、その高値を「山」として確定します。5%未満の上下動は無視します。
谷の確定:終値 ≧ 形成中の安値 ×(1 + 5%)
上昇トレンド:直近の確定した山 > 1つ前の山 かつ 直近の確定した谷 > 1つ前の谷
確定には平均7.4日かかる
2007年4月以降、5%のジグザグで確定した山は100個、谷も100個でした。山(谷)の日から確定するまでの遅れは平均7.4日、中央値6日、最も長いケースでは35日です。確定した日の終値は、山から平均−5.98%(最大で−11.41%)、谷から平均+6.07%(最大+14.15%)離れていました。
反転幅を小さくすると遅れは縮みますが、山と谷の数が増えます。4%なら確定まで平均5.5日で山132個、6%なら平均10.6日で山73個です。
「高値と安値が切り上がったら上昇トレンド」と後から線を引くのは簡単です。しかし、その日の時点で使える情報だけで判定すると、上昇トレンドが成立するのは、多くの場合新しい高値から5%下がった日か、新しい安値から5%上がった日です。チャートの見た目より、判定はずっと遅れます。
実際の日経平均で見てみる
チャートより少し前の2024年は、4月16日(38,471円)に上昇トレンドが成立して保有を始めました。7月11日の山42,224円は7月19日に確定し、前の山より高いので保有を継続。そのまま8月5日の急落を迎えます。8月5日の谷31,458円が確定したのは翌8月6日で、売ったのはその日の終値34,675円でした。この1回で−10.07%です。
2025年も似た形です。2024年10月2日(37,809円)に買い、12月27日の山40,281円は2025年2月25日に確定。山も谷も切り上がったままだったため、4月7日(31,136円)の急落まで持ち続け、売りは4月8日(33,012円)、損益は−12.89%でした。下落の途中では「直近の谷」がまだ古いままなので、判定が変わらないのです。
次の買いは2025年12月4日(51,028円)。2026年8月5日(66,300円)に売るまでの+29.73%が、19年間で最大の勝ちになりました。2026年10月2日の終値は68,309円で高値圏ですが、確定した直近の山69,220円は1つ前の山72,366円より低く、谷は63,484円と切り上がっています。判定は「どちらでもない」で、現金です。
検証:山も谷も切り上がっている間だけ保有
ルール:確定した直近の山が1つ前の山より高く、かつ確定した直近の谷が1つ前の谷より高い日に保有し、それ以外は現金。山・谷は終値の5%ジグザグで、確定した日の終値で判定します。比較として、直近の確定山を終値で上抜けたら買い、直近の確定谷を割ったら売る「ブレイク版」、主ルールに「確定谷を割ったら即売り」を加えた版も試しました。条件は共通の検証ルールのとおりです。
| 戦略 | 最終資産 | 年率 | 最大下落率 | 取引 | 勝率 | PF | 保有率 |
|---|---|---|---|---|---|---|---|
| 買い持ち | 3.93倍 | 7.3% | −61.4% | — | — | — | 100% |
| 山谷切り上げで保有(5%) | 0.80倍 | −1.1% | −44.6% | 28 | 25% | 0.88 | 37% |
| 山谷切り上げで保有(4%) | 0.46倍 | −3.9% | −65.6% | 38 | 29% | 0.52 | 33% |
| 山谷切り上げで保有(6%) | 1.75倍 | 2.9% | −43.4% | 22 | 27% | 2.00 | 40% |
| 主ルール+確定谷割れで売り(5%) | 0.76倍 | −1.4% | −43.0% | 26 | 23% | 0.81 | 34% |
| ブレイク版(5%) | 1.64倍 | 2.6% | −50.1% | 26 | 31% | 1.66 | 68% |
| 200日線の上で保有 | 2.17倍 | 4.1% | −34.5% | 81 | 15% | 1.35 | 62% |
主ルールは平均62.4日持つ、ゆったりした売買です。それでも勝率は25%、1回あたりの平均は−0.41%。勝ちトレードの合計+86.99%に対し、負けの合計は−98.43%でした。上位3回(2026年8月まで・2018年3月まで・2009年11月までの保有)だけで+63.87%を稼いでおり、それ以外はほとんどが小さな負けの積み重ねです。
遅れが「高く買って安く売る」を生む
買った日の終値は、直前の谷から平均+8.23%(中央値+5.74%)上でした。売った日の終値は、直前の山から平均−8.31%(中央値−6.68%)下です。1回の上昇の両端から、それぞれ約8%ずつ取り逃がしている計算です。上昇の最初と最後を削ると、中身がほとんど残らないことが、勝率25%という数字に表れています。
期間全体では、上昇トレンドの日が36.7%、下降トレンドが26.2%、どちらでもない日が37.1%でした。最も成績が良いのは「どちらでもない日」で、20日後の平均は+1.49%。山と谷のどちらかが切り下がったまま、もう一方が切り上がり始めた「転換の途中」に、上昇の多くが含まれていたと考えられます。逆に、両方そろって上昇トレンドと判定されたときには、上げはかなり進んでいました。
急落のときは、守れた局面と守れなかった局面
リーマン・ショックを含む2008年1月〜2009年3月は、買い持ち−44.80%に対して主ルールは−17.55%(保有率18%)。コロナ・ショックの2020年2〜4月は、保有ゼロで損失を避けました。一方、2024年7〜9月は買い持ち−4.32%に対し主ルールは−12.59%、2025年3〜5月は買い持ち+0.47%に対し−12.72%と、急落の底で売って戻りを取り逃がしています。ブレイク版は2025年2月28日に先に売っていたため、2025年3〜5月は損益ゼロでした。
読み解き
- ダウ理論の判定は、確定の遅れで中身を失う。先読みなしでは、上昇トレンドの成立は山から5%下がった日になりやすい。買いは谷から平均+8.23%、売りは山から平均−8.31%で、上下動の両端が削られる。
- 反転幅を少し変えるだけで結果が逆転する。4%で年率−3.9%、5%で−1.1%、6%で+2.9%。参考に試した3%は+1.85%、8%は−1.33%と、符号が行ったり来たりした。どの幅にも安定した優位性は見えない。
- 「ブレイク版」の方がまだまし。直近の確定山を上抜けたら買い、確定谷を割ったら売る方法は、年率2.6%・PF1.66。ただし取引26回では少なく、200日線の上で持つ方法(年率4.1%)や#018 ADX(年率3.1%)にも及ばない。
成績のまとめ(山谷切り上げで保有・5%)
19年で取引28回と少なく、PFは0.88で赤字、反転幅を4%にすると年率−3.9%まで悪化した。最大下落率−44.6%は買い持ちより小さく、後半(2016年10月〜)は年率1.9%とプラスに転じたが、年率−1.1%では買い持ち7.3%と比べるまでもない。山と谷の「切り上げ」は、確定を待つ限り遅すぎるトレンド判定だった。
自分で試す(TradingView)
//@version=6
indicator("ダウ理論(終値ジグザグ)", overlay = true)
th = input.float(5.0, "反転幅(%)", minval = 1) / 100
var int trend = 0 // 1=上昇中の足を追跡、-1=下降中の足を追跡
var float ext = na // 形成中の山(谷)の候補
var float hi = na
var float lo = na
var float h1 = na // 直近の確定した山
var float h0 = na // 1つ前の山
var float l1 = na // 直近の確定した谷
var float l0 = na // 1つ前の谷
if na(hi)
hi := close
lo := close
if trend == 0
hi := math.max(hi, close)
lo := math.min(lo, close)
if close <= hi * (1 - th)
h1 := hi
trend := -1
ext := close
else if close >= lo * (1 + th)
l1 := lo
trend := 1
ext := close
else if trend == 1
if close > ext
ext := close
else if close <= ext * (1 - th) // 5%下がった日に山が確定
h0 := h1
h1 := ext
trend := -1
ext := close
else
if close < ext
ext := close
else if close >= ext * (1 + th) // 5%上がった日に谷が確定
l0 := l1
l1 := ext
trend := 1
ext := close
up = h1 > h0 and l1 > l0
dn = h1 < h0 and l1 < l0
bgcolor(up ? color.new(color.green, 85) : dn ? color.new(color.red, 88) : na, title = "トレンド判定")
plot(h1, "直近の確定山", color.orange, style = plot.style_stepline)
plot(l1, "直近の確定谷", color.blue, style = plot.style_stepline)

