Strasmore Research
学習 Matt Connor著者: Matt Connor ・更新: 2026-08-08

最大ドローダウンとは?深さと回復期間

最大ドローダウンの意味と計算方法を解説します。ピークから谷までの下落率に加え、過去最高値を更新するまでの回復期間も説明します。

最大ドローダウンとは、価値の時系列におけるピークから谷までの最大下落幅を、直近ピークに対する割合で示したものです。12万ドルまで増えた口座残高が8万4,000ドルまで下落し、その後回復した場合、最大ドローダウンは30%です。この数値は、現在の状態ではなく、過去に記録した最悪の下落局面を示す統計であるため、その後も変わりません。

多くの人は下落率だけを示して終わります。しかし、この統計にはさらに二つの数値が含まれています。ピークから安値までの期間と、その安値から過去最高値を更新するまでに要した、はるかに長い期間です。

最大ドローダウンはどのように計算しますか?

計算は、系列を一度走査するだけです。各観測値で累積ピークを更新し、現在値をピークと比較して、これまでで最も悪い値を記録します。

  1. 累積ピークを最初の値に設定します。
  2. 新しい値ごとに、その値が高ければピークを更新します。
  3. その時点のドローダウンを計算します。現在値をピークで割り、1を引きます。
  4. 最も小さい値を記録します。それが最大ドローダウンです。

リターン系列も、ボラティリティ推計も、分布の仮定も必要ありません。Python標準ライブラリを使い、単純な数値リストに対してループを実行します。新しいUbuntu環境では、まずインタープリターをインストールします。

apt-get update && apt-get install -y python3

このループをmaxdd.pyとして保存します。以下の価格は、手計算で確認できるように小さくした、架空の十個の系列です。

prices = [100.0, 104.0, 98.0, 92.0, 95.0, 88.0, 90.0, 101.0, 99.0, 106.0]

peak = prices[0]
max_dd = 0.0

for price in prices:
    if price > peak:
        peak = price
    drawdown = price / peak - 1.0
    if drawdown < max_dd:
        max_dd = drawdown

print(f"maximum drawdown: {max_dd * 100:.1f}%")

python3 maxdd.pyを実行すると、maximum drawdown: -15.4%と表示されます。手計算でも確認できます。安値の前のピークは104、安値は88です。88を104で割ると0.846になります。その後、系列は過去最高値の106で終わりますが、15.4%という記録は残ります。最大ドローダウンは、サンプル期間における最悪の時点を記録したものです。現在、系列がどの水準にあるかは示しません。同じループに変数を二つ追加すれば、ピークを付けたインデックスと、最悪値を付けたインデックスも記録できます。

ドローダウン曲線の見方

ドローダウン曲線は、ステップ3を一つの最悪値に集約せず、各時点で記録します。系列が過去最高値を更新すると線はゼロに戻り、それ以外の期間はゼロを下回ります。このため、その差は「水面下」と呼ばれます。以下は、S&P 500に連動するETFであるSPYについて、2016年1月以降の月末終値から作成した曲線です。

クエリSPYの水中曲線:月末終値と直近ピークの比較、2016年~2026年
各数値の背後にある正確なSQL
WITH monthly AS (
    SELECT toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS month_start,
           argMax(toFloat64(close), window_start) AS close_px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2016-01-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY month_start
),
runs AS (
    SELECT month_start,
           close_px,
           max(close_px) OVER (ORDER BY month_start
                               ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_peak
    FROM monthly
)
SELECT formatDateTime(month_start, '%Y-%m') AS month,
       round(100 * (close_px / running_peak - 1), 2) AS drawdown_pct
FROM runs
ORDER BY month_start
Run this yourself

127回の月末データを見ると、線は長期間ゼロ付近にとどまり、いくつかの深い谷に落ちています。記録上の最終月は、直近の最高値に対して-1.27%となっています。この形状には、理解に役立つ二つの特徴があります。回復は急反発ではなく、緩やかな上昇になります。また、新たな最高値を更新するたびに曲線はゼロへ戻り、それまでの推移が視覚上リセットされます。

ドローダウンから回復するまでの期間はどのくらいですか?

一つのドローダウンには、異なる三つの数値が含まれています。これらを一つの数値として扱うことが、パフォーマンス表で最もよくある読み違いです。

  1. 下落幅:ピークを何%下回ったか。
  2. 安値までの期間:ピークから底値までの暦日数。
  3. 回復期間:底値から新高値を更新するまでの暦日数。

通常、最も長くなるのは三つ目ですが、見出しの数値だけでは分かりません。下のパネルでは、日次終値を使い、2016年以降のSPYについて、完了したすべての水面下期間を再構成しています。水面下期間はピークを付けた日に始まり、ファンドが初めてその水準を上回って引けた日に終わります。

クエリ2016年以降に完了したSPYのドローダウン:下落幅、下落日数、回復日数
各数値の背後にある正確なSQL
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
           argMax(toFloat64(close), window_start) AS close_px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2016-01-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY session_date
),
runs AS (
    SELECT session_date,
           close_px,
           max(close_px) OVER (ORDER BY session_date
                               ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_peak
    FROM daily
),
episodes AS (
    SELECT running_peak AS peak_px,
           min(session_date) AS peak_date,
           argMin(session_date, close_px) AS trough_date,
           min(close_px) AS trough_px
    FROM runs
    GROUP BY running_peak
),
sequenced AS (
    SELECT peak_px,
           peak_date,
           trough_date,
           trough_px,
           leadInFrame(peak_date, 1) OVER (ORDER BY peak_date
                                           ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS recovery_date
    FROM episodes
)
SELECT formatDateTime(peak_date, '%b %Y') AS episode_label,
       round(100 * (1 - trough_px / peak_px), 1) AS fall_from_peak_pct,
       dateDiff('day', peak_date, trough_date) AS days_to_trough,
       dateDiff('day', trough_date, recovery_date) AS days_to_new_high,
       dateDiff('day', peak_date, recovery_date) AS days_underwater
FROM sequenced
WHERE recovery_date > trough_date
  AND round(100 * (1 - trough_px / peak_px), 1) >= 5
ORDER BY fall_from_peak_pct DESC
LIMIT 8
Run this yourself

一覧で最も深い完了済みの水面下期間はFeb 2020に始まり、直前のピークを34.2%下回りました。下落に33暦日を費やし、回復には148日かかりました。水面下にあった期間は合計で181日です。次の項目はJan 2022に始まり、下落幅は25.4%と浅かったものの、旧高値を746日間下回り続けました。

下落幅と期間は、完全に別のものです。急落後すぐに往復するケースも、浅い下落が何年も続くケースも、一つの割合に圧縮されます。2020年3月の暴落は前者の典型例であり、市場が暴落から回復する仕組みではその後半に当たる過程を扱います。

最大ドローダウンは測定期間が長いほど悪化する

最大ドローダウンは最大値です。そのため、過去のデータを追加すると、同じ水準にとどまるか、より深くなります。長い期間では、各時点の累積ピークが短い期間の累積ピーク以上になります。これが計算上の理由です。2026年7月31日を終点とする同一ファンドの五つの期間を測定すると、この影響が分かります。

クエリ同一ファンド、五つのルックバック期間:2026年7月31日までのサンプル期間別SPY最大ドローダウン
各数値の背後にある正確なSQL
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
           argMax(toFloat64(close), window_start) AS close_px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2016-07-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY session_date
),
scoped AS (
    SELECT arrayJoin([1, 2, 3, 5, 10]) AS lookback_years,
           session_date,
           close_px
    FROM daily
),
windowed AS (
    SELECT lookback_years, session_date, close_px
    FROM scoped
    WHERE session_date >= subtractYears(toDate('2026-07-31'), lookback_years)
),
runs AS (
    SELECT lookback_years,
           session_date,
           close_px,
           max(close_px) OVER (PARTITION BY lookback_years ORDER BY session_date
                               ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_peak
    FROM windowed
)
SELECT concat(toString(lookback_years), if(lookback_years = 1, ' year', ' years')) AS lookback,
       round(100 * max(1 - close_px / running_peak), 1) AS max_drawdown_pct,
       formatDateTime(argMax(session_date, 1 - close_px / running_peak), '%b %Y') AS worst_point
FROM runs
GROUP BY lookback_years
ORDER BY lookback_years
Run this yourself

直近1 year期間では、最大下落率は9.1%でした。同じ系列を10 yearsまで延長すると、数値は34.2%となり、最大下落はMar 2020に発生します。ファンドのリスクが高まったわけではありません。対象期間が長くなっただけです。

同じ計算上の性質により、戦略比較も歪みます。三年のバックテストと二十年のバックテストは同じ動きを示していても、報告されるドローダウンは大きく異なることがあります。そのため、測定期間を併記しなければ、この数値の意味は限定的です。バックテストにおける先読みバイアスでは、見栄えのよいバックテストが自らを実態以上に良く見せる別の方法を説明しています。

最大ドローダウンとボラティリティの違い

ボラティリティは、日々の値動きの標準的な大きさを、上昇・下落の両方向について測る指標です。最大ドローダウンは、特定の下落局面を測定します。どちらもリスク指標ですが、答える問いは異なります。このパネルでは、2026年7月31日までの五年間について、代表的な八銘柄を比較しています。ボラティリティは日次終値から年率換算しています。

クエリ最大ドローダウンと年率ボラティリティの比較:大型株八銘柄、2026年7月31日までの五年間
各数値の背後にある正確なSQL
WITH daily AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
           argMax(toFloat64(close), window_start) AS close_px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'AAPL', 'MSFT', 'KO', 'JNJ', 'CVX', 'VZ', 'PG')
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2021-08-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, session_date
),
runs AS (
    SELECT ticker,
           session_date,
           close_px,
           max(close_px) OVER (PARTITION BY ticker ORDER BY session_date
                               ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_peak,
           lagInFrame(close_px, 1) OVER (PARTITION BY ticker ORDER BY session_date
                                         ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close
    FROM daily
)
SELECT ticker,
       round(100 * max(1 - close_px / running_peak), 1) AS max_drawdown_pct,
       round(100 * sqrt(252) * stddevSampIf(close_px / prev_close - 1, prev_close > 0), 1) AS annualized_volatility_pct
FROM runs
GROUP BY ticker
HAVING countIf(prev_close > 0) > 20
ORDER BY max_drawdown_pct DESC
Run this yourself

二つの列を併せて確認してください。VZはグループ内で最大の45.4%下落となり、年率ボラティリティは22.6%でした。下落が最も小さかったKOは、20.9%下落し、ボラティリティは16.7%でした。ボラティリティは対象期間の全取引日における平均値です。そのため、長期にわたる緩やかな下落は平均値に反映されにくくなります。ドローダウンは、実際に価格がたどった単一の最悪経路です。値動きが落ち着いた銘柄でも、二年間にわたって下落し続ければ、ボラティリティが目立たない一方で、深いドローダウンを記録することがあります。

低ボラティリティ・アノマリーは、値動きの穏やかな銘柄が長期的にどのように推移するかを分析します。ケリー基準によるポジションサイジングでは、許容できるドローダウンをポジションサイズに反映する方法を示します。

この数値だけでは分からないこと

押さえておくべき限界は四つあります。

  1. これは実現した一つの経路にすぎません。同じプロセスでも、別の経路でははるかに悪い数値になり得ます。
  2. サンプル期間に依存します。そのため、二つのドローダウンを比較するには、対象期間をそろえる必要があります。
  3. サンプリング頻度に依存します。同じ期間でも、月末終値は日中の安値を捉えないため、日次終値より小さい数値になります。
  4. 将来を示す情報は含みません。ピークから30%下にあることだけでは、31番目の観測点が明日現れるかどうかは分かりません。

最後の限界があるため、自動売買システムにはドローダウンの閾値ではなく、ドローダウンに対する運用方針が必要です。「20%で停止する」というルールは、一つの問いには答えますが、二つの問いを残します。停止時に保有ポジションをどうするのか。そして、システムを再稼働させる根拠は何かです。自動売買ボットのサーキットブレーカーでは、この方針の設計を扱っています。任意に設定した一律ルールのコストは、回復局面で表面化します。システムが安値付近で停止し、再稼働が遅れれば、上昇局面を逃すためです。最良の日を逃すことでは、その計算を数値で示しています。

二つの数値を比較する前に、重要な測定上の違いがあります。ファンドの価格系列に基づくドローダウンと、実際の口座のドローダウンは、資金の入出金がある場合や配当金が入金される場合には一致しません。この点は月次リターンの測定方法で詳しく説明しています。

最大ドローダウンに関するFAQ

適正な最大ドローダウンとは

普遍的な基準値はありません。比較対象となるベンチマークと、測定期間を定める必要があります。2026年7月31日までの十年間では、SPYの直近高値からの最大下落率は、日次終値ベースで34.2%でした。より短い期間で小さい数値を示す戦略が、必ずしも安全だったとは限りません。

最大ドローダウンはボラティリティと同じですか

いいえ。ボラティリティは通常の日次変動を示します。最大ドローダウンは、ピークからボトムまでの経路における最大の下落を示します。値動きが小さい銘柄でも、二年間にわたり下落が続けば、値動きが大きくても高値を更新し続ける銘柄より深いドローダウンになることがあります。

最大ドローダウンからの回復にはどのくらいかかりますか

ケースによって異なります。回復までの上昇局面のほうが長くなることも少なくありません。2016年以降のSPYでは、直前の高値を下回った期間のうち、ピークから新高値までの最長の完了期間は181暦日でした。このうち33日が下落局面でした。

最大ドローダウンは将来の損失を予測しますか

いいえ。最大ドローダウンは、すでに発生した一つの値動きの経路を示すものです。測定期間が長くなるほど、数値はほぼ常に大きくなります。これは、これまでに戦略が耐えてきた下落を記録するものであり、将来の下落幅に上限を設けるものではありません。


上記の各パネルには、基となるSQLが保存されています。いずれかを開き、tickerまたは期間を変更して、Strasmore terminalで同じドローダウン計算を実行できます。

#risk#drawdown#backtesting#performance metrics#python