ダウ理論ナビ
メソドロジー
判定式・数式・アルゴリズムを全公開しています。個人運営のツールでブラックボックスにしないこと — それが透明性を担保する最大の方法だと考えています。
過去に有効だった条件が未来も機能する保証はありません。だからこそ、使う側が検証できる状態でロジックを開示しています。
使用データと期間
すべての判定はJQuants API(JPX総研提供)の公式データに基づきます。主観的な相場観や予想は一切含まれません。
| データ種別 | 期間 | 用途 |
|---|---|---|
| 日次OHLC(全銘柄・調整済) | 最大20年(2006-04〜) | 全判定の基盤 |
| TOPIX・セクター指数 | 20年 | 相対強弱・マクロ環境 |
| 配当金データ | 20年 | 権利取り前後の統計 |
| 信用残(銘柄別) | 20年 | 需給シグナル(開発中) |
| 売買内訳(Premium) | 20年 | 個人/機関フロー(開発中) |
| 空売り比率 | 20年 | 需給指標(開発中) |
※ 20年分にはリーマンショック(2008)・コロナショック(2020)の2つの大暴落期が含まれています。bestBuyの統計検証は、この2つの危機を含む長期データを前提としています。
※ 上場廃止銘柄も含めて保持しています(生存者バイアス対策)。表示上は現存銘柄のみですが、backtestには全履歴を使用します。
ダウ理論 4原則の判定式
ダウ理論は19世紀末にチャールズ・ダウが提唱したトレンド理論です。ダウ理論ナビでは、そのうち機械的に判定可能な4原則を個別銘柄で自動チェックしています。
Swing Point の検出
すべての判定のベースは「スイング高値(SH)」「スイング安値(SL)」の検出です。
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原則:トレンドは明確に方向性を持つ
⇔ SH[-1] > SH[-2] AND SL[-1] > SL[-2]
第2原則:主要トレンドは3段階(蓄積・参加・分配)
機械化不能な概念のため、MA25とMA75のパーフェクトオーダーで近似:
close < MA25 < MA75 (分配/下降フェーズ)
第3原則:出来高はトレンドを裏付ける
Confirmed ⇔ 上昇日の vol_ratio ≥ 1.0 AND 下降日の vol_ratio < 1.0
第4原則:トレンドは明確な転換シグナルまで継続
Downtrend終了 ⇔ 終値が直近「戻り高値」を上回る
第5原則(出来高確認)
現在は保留中。出来高確認の閾値設定が過剰適合しやすいため、慎重に検証中です。
7段階ステータスの決定ロジック
上記の判定結果を組み合わせて、各銘柄を7つのステータスのいずれかに割り当てます。
| ステータス | 条件 |
|---|---|
| チャンス | Uptrend + Fib 38.2〜61.8% 圏内 + MA25近辺 |
| 上昇中 | Uptrend 継続 + Fib圏外(高値圏) |
| 要注目 | Uptrend だが 押し安値 との距離 < 3% |
| トレンド崩壊 | 終値 < 押し安値 |
| 新トレンド候補 | Downtrend後、戻り高値をブレイク |
| 様子見 | 上記いずれにも該当しない中立状態 |
フィボナッチ水準の計算
直近のスイング安値(L)と高値(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つの条件としています。
エリオット波動の判定
エリオット波動は、相場が「上昇5波 + 下降3波」の計8波で進むとする波動理論です。カウントに主観が入りやすいため、ダウ理論ナビでは簡易判定+信頼度スコアで運用しています。
分析スタイル:波の「次数(degree)」と時間軸の対応
エリオット波動はフラクタル構造(波の中に波)を持ちます。ダウ理論ナビでは、個別株の中期スイングトレードを対象として、以下の次数を採用しています:
| 時間軸 | 採用する波の次数 | 典型的な波の期間 | 想定読者 |
|---|---|---|---|
| 日足 | Minor degree | 1〜3ヶ月 | 中期スイングトレーダー(主戦場) |
| 週足 | Intermediate degree | 数ヶ月〜1年 | 中長期投資家 |
| 月足 | Primary degree | 1〜3年 | 長期投資家・マクロ視点 |
この3階層を同時に表示することで、「日足で第3波進行中 × 週足で第3波 × 月足で第1波」のように、小さな波が大きな波の中で今どの位置にいるかを把握できます。
使用データ期間について(重要)
エリオット波動は「上場来の全履歴」を使うほど精度が上がるわけではありません。むしろ逆効果になる場合があります:
- IPO直後の異常値:初値急騰・ロックアップ解除等の非理論的動きが波動構造を歪めます
- 事業構造の変化:20年前と今では会社そのものが別物になっている場合、古い波動は無関係
- Primary波の転換点:大きな転換を跨ぐと古い波と新しい波が繋がらず、カウントが破綻
- 株式分割の遡及調整ノイズ:何度も分割された銘柄は古いデータほど誤差が累積
以上の理由から、中期スイング(Minor degree)の判定では直近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)
- 業種・セクター指数の長期波動
bestBuy 発見アルゴリズム
ダウ理論ナビの核となる独自アルゴリズムです。銘柄ごとに、過去データから最も勝率の高い買い条件を発見します。
候補条件のセット
以下のテクニカル条件から、2〜4条件の組み合わせを列挙します:
| 条件カテゴリ | 具体例 |
|---|---|
| RSI | rsi_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 が最大のものを選出します:
AND samples ≥ 5 (最小サンプル数)
AND Wilson下限 ≥ 40% (過剰適合フィルタ)
AND pd ≥ 1 (最低1日先まで)
さらに、reliable(信頼度mid以上)判定には追加の要件を課します:
reliability = "mid" iff win_rate ≥ 85% AND Wilson下限 ≥ 60% AND samples ≥ 10
reliability = "low" iff 上記未満
Wilson 信頼下限と信頼度バッジ
「勝率90%!」と単独で表示するのは統計的に不誠実です。たとえば10回中9勝は90%ですが、この数値の信頼性は極めて低い。Wilson score intervalを使って、95%信頼区間の下限を併記しています。
Wilson スコア下限の数式
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%以上の条件を「高信頼」と位置付けています。
連続点灯と進捗計算
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 = min(100, gain_pct / bestBuy.avg_return × 100)
過去平均リターン(avg_return)に対して、今回の連続点灯で既にどこまで到達したかを0〜100のパーセンテージで表示します。progress が 100 を超えた場合は「過去平均超過」として注記されます。
最適エントリー日
ダウ理論ナビでは「初点灯の翌営業日買い」を最適タイミングとしています。連続点灯銘柄は、初点灯から日数が経過しているためエントリー好機ではなく、既に保有している人向けの進捗確認として扱います。