Methodology / 計算ロジック全公開

ダウ理論ナビ
メソドロジー

判定式・数式・アルゴリズムを全公開しています。個人運営のツールでブラックボックスにしないこと — それが透明性を担保する最大の方法だと考えています。

過去に有効だった条件が未来も機能する保証はありません。だからこそ、使う側が検証できる状態でロジックを開示しています。

Section 01

使用データと期間

すべての判定はJQuants API(JPX総研提供)の公式データに基づきます。主観的な相場観や予想は一切含まれません。

データ種別期間用途
日次OHLC(全銘柄・調整済)最大20年(2006-04〜)全判定の基盤
TOPIX・セクター指数20年相対強弱・マクロ環境
配当金データ20年権利取り前後の統計
信用残(銘柄別)20年需給シグナル(開発中)
売買内訳(Premium)20年個人/機関フロー(開発中)
空売り比率20年需給指標(開発中)

※ 20年分にはリーマンショック(2008)・コロナショック(2020)の2つの大暴落期が含まれています。bestBuyの統計検証は、この2つの危機を含む長期データを前提としています。

※ 上場廃止銘柄も含めて保持しています(生存者バイアス対策)。表示上は現存銘柄のみですが、backtestには全履歴を使用します。


Section 02

ダウ理論 4原則の判定式

ダウ理論は19世紀末にチャールズ・ダウが提唱したトレンド理論です。ダウ理論ナビでは、そのうち機械的に判定可能な4原則を個別銘柄で自動チェックしています。

Swing Point の検出

すべての判定のベースは「スイング高値(SH)」「スイング安値(SL)」の検出です。

Swing Window
SH(t) = high[t]  iff  high[t] ≥ max(high[t-5..t-1])  AND  high[t] ≥ max(high[t+1..t+5])
SL(t) = low[t]   iff   low[t] ≤ min(low[t-5..t-1])   AND   low[t] ≤ min(low[t+1..t+5])

左右5営業日を基準に、「直近11営業日で最大/最小」となった点をスイング点として登録します。

第1原則:トレンドは明確に方向性を持つ

Uptrend 定義
直近のSH系列が単調増加 AND 直近のSL系列が単調増加
⇔ SH[-1] > SH[-2] AND SL[-1] > SL[-2]

第2原則:主要トレンドは3段階(蓄積・参加・分配)

機械化不能な概念のため、MA25とMA75のパーフェクトオーダーで近似:

Perfect Order
close > MA25 > MA75 (上昇参加フェーズ)
close < MA25 < MA75 (分配/下降フェーズ)

第3原則:出来高はトレンドを裏付ける

Volume Confirmation
vol_ratio_long = vol[t] / avg(vol[t-20..t-1])
Confirmed ⇔ 上昇日の vol_ratio ≥ 1.0 AND 下降日の vol_ratio < 1.0

第4原則:トレンドは明確な転換シグナルまで継続

Reversal Trigger
Uptrend終了 ⇔ 終値が直近「押し安値」(pushback_low)を下回る
Downtrend終了 ⇔ 終値が直近「戻り高値」を上回る
押し安値とは
直近の高値更新の起点となった安値。これを終値ベースで割り込むことが、ダウ理論で定義される上昇トレンド終了の客観的シグナルです。

第5原則(出来高確認)

現在は保留中。出来高確認の閾値設定が過剰適合しやすいため、慎重に検証中です。


Section 03

7段階ステータスの決定ロジック

上記の判定結果を組み合わせて、各銘柄を7つのステータスのいずれかに割り当てます。

ステータス条件
チャンスUptrend + Fib 38.2〜61.8% 圏内 + MA25近辺
上昇中Uptrend 継続 + Fib圏外(高値圏)
要注目Uptrend だが 押し安値 との距離 < 3%
トレンド崩壊終値 < 押し安値
新トレンド候補Downtrend後、戻り高値をブレイク
様子見上記いずれにも該当しない中立状態
レンジ相場での限界
ダウ理論はトレンドのある相場で機能します。レンジ相場・急騰急落・相場崩壊局面では、判定信頼性が大幅に低下します。

Section 04

フィボナッチ水準の計算

直近のスイング安値(L)と高値(H)から、押し目の目安となる水準を算出します。

Fibonacci Retracement
Fib(0%) = H
Fib(23.6%) = H - (H - L) × 0.236
Fib(38.2%) = H - (H - L) × 0.382
Fib(50.0%) = H - (H - L) × 0.500
Fib(61.8%) = H - (H - L) × 0.618
Fib(78.6%) = H - (H - L) × 0.786
Fib(100%) = L

「チャンス」ステータス判定では、Fib 38.2〜61.8% 圏内への接近を1つの条件としています。

フィボナッチは絶対ではない
38.2%・50%・61.8% で必ず反発するわけではありません。61.8% を割り込んで更に下落し、トレンド崩壊に至るケースも頻繁に起きます。あくまで「目安水準」としてご利用ください。

Section 05

エリオット波動の判定

エリオット波動は、相場が「上昇5波 + 下降3波」の計8波で進むとする波動理論です。カウントに主観が入りやすいため、ダウ理論ナビでは簡易判定+信頼度スコアで運用しています。

分析スタイル:波の「次数(degree)」と時間軸の対応

エリオット波動はフラクタル構造(波の中に波)を持ちます。ダウ理論ナビでは、個別株の中期スイングトレードを対象として、以下の次数を採用しています:

時間軸採用する波の次数典型的な波の期間想定読者
日足Minor degree1〜3ヶ月中期スイングトレーダー(主戦場)
週足Intermediate degree数ヶ月〜1年中長期投資家
月足Primary degree1〜3年長期投資家・マクロ視点

この3階層を同時に表示することで、「日足で第3波進行中 × 週足で第3波 × 月足で第1波」のように、小さな波が大きな波の中で今どの位置にいるかを把握できます。

使用データ期間について(重要)

エリオット波動は「上場来の全履歴」を使うほど精度が上がるわけではありません。むしろ逆効果になる場合があります:

  • IPO直後の異常値:初値急騰・ロックアップ解除等の非理論的動きが波動構造を歪めます
  • 事業構造の変化:20年前と今では会社そのものが別物になっている場合、古い波動は無関係
  • Primary波の転換点:大きな転換を跨ぐと古い波と新しい波が繋がらず、カウントが破綻
  • 株式分割の遡及調整ノイズ:何度も分割された銘柄は古いデータほど誤差が累積

以上の理由から、中期スイング(Minor degree)の判定では直近3〜5年のデータを使用するのが業界標準です。ダウ理論ナビも、エリオット波動のリアルタイム判定には以下の期間を使用しています:

Elliott Wave — 使用データ期間
日足(Minor): 直近 約2-3年の日足から検出された直近5スイング点
週足(Intermediate): 直近 約5年の週足から検出された直近5スイング点
月足(Primary): 直近 約10-20年の月足から検出された直近5スイング点

カウントのアルゴリズム

# スイング点検出(時間軸ごとに window を調整)
swings_daily   = detect_swings(daily_ohlc,   window=5)
swings_weekly  = detect_swings(weekly_ohlc,  window=3)
swings_monthly = detect_swings(monthly_ohlc, window=2)

# 直近5スイング点から波の位置を同定
for timeframe in [daily, weekly, monthly]:
    recent = swings[-5:]
    pattern = classify_pattern(recent)
    # pattern: 第1波進行中 / 第3波進行中 / 第5波完了 / ...
    rule_fails = check_elliott_rules(recent)
    # ルール違反数が少ないほど信頼度高

20年データで「できること」と「できないこと」

できない: 20年あっても日足の Minor 波判定精度は直近3-5年の時と同じ(古い波は「現在の波」の識別に寄与しない)

できる:

  • 月足 Primary degree のカウント(過去のサイクル全景が見える)
  • TOPIX・日経平均の Cycle degree 分析(マクロ相場サイクル)
  • 「過去のエリオットカウントが当たったか」の歴史検証(backtest)
  • 業種・セクター指数の長期波動
カウントは推定
同じチャートを見てもアナリストによってカウントが異なることがあります。ダウ理論ナビのカウントも一つの解釈であり、唯一解ではありません。機械的に計算した「現時点で最も妥当なカウント」としてご利用ください。

Section 06

bestBuy 発見アルゴリズム

ダウ理論ナビの核となる独自アルゴリズムです。銘柄ごとに、過去データから最も勝率の高い買い条件を発見します。

候補条件のセット

以下のテクニカル条件から、2〜4条件の組み合わせを列挙します:

条件カテゴリ具体例
RSIrsi_low20(RSI<20), rsi_low25, rsi_high70
ボリンジャーバンドbb_low2(-2σ割れ), bb_high2
MA25乖離率ma25_below5(-5%以下), ma25_above5
出来高vol2x(平均比2倍), vol3x
当日変化率drop3pct(-3%超), gain5pct

全組み合わせで過去検証

for conditions in enumerate_combinations(candidates, k=2..4):
    signals = find_days_matching_all(conditions, history)
    if len(signals) < MIN_SAMPLES:  # デフォルト 5
        continue
    # 各点灯日から翌日〜30日後までの勝ち率を計算
    for pd in [1, 3, 5, 7, 10, 15, 20, 30]:
        wins = [ 1 if ret(d, pd) > 0 else 0 for d in signals ]
        win_rate = sum(wins) / len(wins)
        avg_return = mean([ret(d, pd) for d in signals])

    # wrLower = Wilson信頼下限(後述)
    score = win_rate × wrLower × log(1 + samples)
    record(conditions, pd, score)

best = argmax(score) across all (conditions, pd) pairs

bestBuy の選出基準

以下を満たす条件セットのうち、score が最大のものを選出します:

bestBuy Selection
win_rate ≥ 60% (候補フィルタ)
AND samples ≥ 5 (最小サンプル数)
AND Wilson下限 ≥ 40% (過剰適合フィルタ)
AND pd ≥ 1 (最低1日先まで)

さらに、reliable(信頼度mid以上)判定には追加の要件を課します:

Reliability
reliability = "high"  iff win_rate ≥ 90% AND Wilson下限 ≥ 75% AND samples ≥ 20
reliability = "mid"  iff win_rate ≥ 85% AND Wilson下限 ≥ 60% AND samples ≥ 10
reliability = "low"  iff 上記未満

Section 07

Wilson 信頼下限と信頼度バッジ

「勝率90%!」と単独で表示するのは統計的に不誠実です。たとえば10回中9勝は90%ですが、この数値の信頼性は極めて低い。Wilson score intervalを使って、95%信頼区間の下限を併記しています。

Wilson スコア下限の数式

Wilson Score Lower Bound (95% CI)
p = wins / n (観測勝率)
z = 1.96 (95%信頼区間の標準正規分布値)

Wilson_lower = (p + z²/(2n) − z√((p(1−p) + z²/(4n))/n)) / (1 + z²/n)

具体例での挙動

観測観測勝率Wilson下限意味
10回中9勝90.0%59.6%サンプル少、過信禁物
50回中45勝90.0%78.6%そこそこ信頼できる
100回中90勝90.0%82.4%概ね信頼できる
200回中180勝90.0%85.2%高い信頼性

サンプル数が増えるほどWilson下限は真の勝率に近づきます。ダウ理論ナビでは、Wilson下限が70%以上の条件を「高信頼」と位置付けています。

なぜこの指標を使うか
単純な観測勝率は、過去の偶然に引きずられやすく、将来の期待値を過大評価します。Wilson下限は「最も悲観的に見積もっても」どこまでの勝率は言えるかを示し、過剰適合を防ぐ役割を果たします。

Section 08

連続点灯と進捗計算

bestBuy 条件が成立した日を「点灯日」と呼びます。翌営業日以降も条件が連続して成立している銘柄を連続点灯銘柄として追跡しています。

streak_days の計算

streak_days = 1
start_price = close[signal_day]
for d in [signal_day + 1, ..., today]:
    if best_buy_conditions_hold(d):
        streak_days += 1
    else:
        streak_days = 0  # 一度でも外れたらリセット
        break

進捗率(progress)

Progress
gain_pct = (close[today] − start_price) / start_price × 100
progress = min(100, gain_pct / bestBuy.avg_return × 100)

過去平均リターン(avg_return)に対して、今回の連続点灯で既にどこまで到達したかを0〜100のパーセンテージで表示します。progress が 100 を超えた場合は「過去平均超過」として注記されます。

最適エントリー日

ダウ理論ナビでは「初点灯の翌営業日買い」を最適タイミングとしています。連続点灯銘柄は、初点灯から日数が経過しているためエントリー好機ではなく、既に保有している人向けの進捗確認として扱います。

なぜ翌営業日なのか
点灯日の終値で条件が成立することが確認できるのは、その日の引け後のみ。ザラ場中の成立確定は不可能です。したがって、条件確定後に行動可能な最速タイミングは翌営業日の寄付になります。

根拠を持ってトレードを始めるために