Strasmore Research
آموزش Matt Connorتوسط Matt Connor · به‌روزرسانی شده در 2026-08-05

حداکثر افت چیست؟ عمق کاهش در برابر زمان بهبود

حداکثر افت، بزرگ‌ترین کاهش از قله تا کف است. با محاسبه عمق افت و زمان بازگشت به قله جدید، ریسک واقعی حساب و دشواری جبران زیان را بهتر بسنجید.

حداکثر افت، بزرگ‌ترین کاهش از قله تا کف در یک سری ارزش است که به‌صورت درصدی از قله جاری اندازه‌گیری می‌شود. حسابی که به 120٬000 دلار می‌رسد، سپس به 84٬000 دلار سقوط می‌کند و بعد بهبود می‌یابد، حداکثر افت 30 درصدی دارد. این رقم برای همیشه در سابقه حساب باقی می‌ماند، زیرا این شاخص بدترین دوره در تاریخ را ثبت می‌کند، نه وضعیت فعلی را. بیشتر افراد فقط عمق افت را بیان می‌کنند و در همین‌جا متوقف می‌شوند. اما همین شاخص دو عدد دیگر را نیز در خود دارد: مدت‌زمان کاهش از قله تا کف، و مدت‌زمان بسیار طولانی‌ترِ بازگشت از آن کف تا ثبت یک قله جدید.

چگونه بیشترین افت سرمایه محاسبه می‌شود؟

کل محاسبه با یک بار پیمایش سری انجام می‌شود. در هر مشاهده، بیشترین مقدار ثبت‌شده تا آن لحظه را به‌روزرسانی می‌کنید، مقدار جاری را با آن می‌سنجید و بدترین رقم مشاهده‌شده تا آن نقطه را نگه می‌دارید.

  1. مقدار اوج جاری را برابر با نخستین مقدار قرار دهید.
  2. در هر مقدار جدید، اگر مقدار از اوج بیشتر بود، اوج را افزایش دهید.
  3. افت سرمایه را در آن نقطه محاسبه کنید: مقدار جاری تقسیم بر اوج، منهای یک.
  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 را در هر نقطه حفظ می‌کند و آن را به یک مقدار بدترینِ واحد تقلیل نمی‌دهد. هرگاه سری زمانی به اوج جدیدی برسد، این خط روی صفر قرار می‌گیرد و در فاصله میان اوج‌ها پایین‌تر از صفر باقی می‌ماند؛ به همین دلیل، این فاصله را «زیر آب» می‌نامند. در ادامه، منحنی SPY را می‌بینید؛ صندوقی قابل‌معامله در بورس که شاخص S&P 500 را دنبال می‌کند و بر مبنای قیمت‌های پایانی پایان ماه، از ژانویه 2016 به بعد محاسبه شده است.

پرس‌وجومنحنی افت SPY: قیمت پایانی پایان ماه در برابر اوج متحرک، ۲۰۱۶ تا ۲۰۲۶
کد دقیق 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. زمان بازیابی: تعداد روزهای تقویمی از کف تا ثبت یک اوج جدید.

مورد سوم معمولاً طولانی‌ترین دوره است؛ اما عددی که در تیترها می‌آید، هرگز آن را نشان نمی‌دهد. نمودار زیر همه دوره‌های تکمیل‌شده افت از اوج را برای 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 نمونه کلاسیک حالت نخست است و بازارها چگونه از سقوط‌ها بازیابی می‌شوند به بخش دوم این مسیر می‌پردازد.

چرا هرچه دوره اندازه‌گیری طولانی‌تر باشد، بیشترین افت سرمایه شدیدتر می‌شود

بیشترین افت سرمایه یک مقدار حداکثری است؛ بنابراین افزودن سابقه فقط می‌تواند آن را بدون تغییر نگه دارد یا عمیق‌تر کند. اوج تجمعی در یک بازه طولانی‌تر، در هر نقطه دست‌کم به اندازه اوج در بازه کوتاه‌تر است و همین موضوع نتیجه محاسباتی را تعیین می‌کند. اندازه‌گیری عملکرد یک صندوق در پنج بازه که همگی در 31 ژوئیه 2026 پایان می‌یابند، این اثر را نشان می‌دهد.

پرس‌وجویک صندوق، پنج پنجره بازنگری: بیشترین افت 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 رخ می‌دهد. صندوق پرریسک‌تر نشده است؛ نمونه آماری طولانی‌تر شده است.

همین محاسبه، مقایسه استراتژی‌ها را نیز مخدوش می‌کند. یک آزمون پس‌نگر سه‌ساله و یک آزمون پس‌نگر 20ساله می‌توانند رفتار یکسانی را توصیف کنند، اما بیشترین افت‌های بسیار متفاوتی گزارش دهند. بنابراین این رقم بدون ذکر بازه اندازه‌گیری معنای چندانی ندارد. سوگیری آینده‌نگرانه در آزمون پس‌نگر به شیوه دیگری می‌پردازد که در آن یک آزمون پس‌نگر ظاهراً بی‌نقص، عملکرد خود را بهتر از واقعیت نشان می‌دهد.

افت بیشینه در برابر نوسان

نوسان، اندازه معمول حرکت روزانه را در هر دو جهت نشان می‌دهد. افت بیشینه، یک مسیر نزولی مشخص را اندازه‌گیری می‌کند. هر دو معیار ریسک هستند، اما به پرسش‌های متفاوتی پاسخ می‌دهند. این جدول، این دو معیار را برای هشت نام شناخته‌شده طی پنج سال منتهی به 31 ژوئیه 2026 در کنار هم قرار می‌دهد. نوسان نیز بر اساس قیمت‌های پایانی روزانه به‌صورت سالانه‌شده محاسبه شده است.

پرس‌وجوبیشترین افت در برابر نوسان سالانه‌شده: هشت سهم بزرگ، پنج سال تا ۳۱ ژوئیه ۲۰۲۶
کد دقیق 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% ثبت شده است. نوسان، میانگینی از تمام روزهای این بازه است و میانگین‌ها می‌توانند یک افت طولانی و تدریجی را کم‌اهمیت جلوه دهند. افت، بدترین مسیری است که قیمت واقعاً طی کرده است. یک دارایی کم‌نوسان که طی دو سال به‌تدریج کاهش می‌یابد، ممکن است افت عمیقی داشته باشد، اما نوسان آن در سطحی معمولی باقی بماند.

ناهنجاری نوسان پایین بررسی می‌کند که دارایی‌های آرام در افق‌های بلندمدت چگونه رفتار می‌کنند و تعیین اندازه موقعیت بر اساس معیار Kelly نشان می‌دهد تحمل افت چگونه به اندازه موقعیت تبدیل می‌شود.

آنچه این عدد نمی‌تواند نشان دهد

چهار محدودیت را باید در نظر داشت:

  1. این عدد فقط یک مسیر تحقق‌یافته را نشان می‌دهد. همین فرایند می‌توانست در مسیری دیگر، رقم بسیار بدتری ایجاد کند.
  1. به طول دوره نمونه‌گیری وابسته است. بنابراین دو افت سرمایه فقط زمانی قابل مقایسه‌اند که پنجره‌های زمانی یکسانی داشته باشند.
  1. به تناوب نمونه‌گیری وابسته است. قیمت‌های پایانی پایان ماه، کمینه‌های درون‌روزی را پنهان می‌کنند و برای همان دوره، عددی کوچک‌تر از قیمت‌های پایانی روزانه به دست می‌دهند.
  1. هیچ اطلاعاتی درباره آینده ارائه نمی‌کند. قرار داشتن در فاصله 30 درصدی از اوج، هیچ نمی‌گوید که نقطه سی‌ویکم فردا ثبت می‌شود یا نه.

همین محدودیت آخر دلیل آن است که یک سیستم خودکار به سیاست افت سرمایه نیاز دارد، نه صرفاً یک آستانه افت سرمایه. عبارت «در افت 20 درصدی متوقف شو» به یک پرسش پاسخ می‌دهد و دو پرسش را بی‌پاسخ می‌گذارد: هنگام توقف چه اتفاقی برای موقعیت‌های باز می‌افتد و چه شواهدی سیستم را دوباره فعال می‌کند. مدارشکن‌ها برای ربات‌های معاملاتی ساختار این سیاست را بررسی می‌کند. هزینه یک قاعده ثابت و دلخواه در مرحله بازیابی نمایان می‌شود؛ جایی که سیستمی که نزدیک کف متوقف شده و دیر دوباره فعال می‌شود، از صعود بازار جا می‌ماند. از دست دادن بهترین روزها این محاسبه را با اعداد نشان می‌دهد.

پیش از مقایسه دو رقم، یک نکته درباره نحوه اندازه‌گیری اهمیت دارد: افت سرمایه در سری قیمت یک صندوق، هرگاه وجه نقد وارد حساب شود یا از آن خارج شود و هرگاه سود سهام دریافت شود، با افت سرمایه در یک حساب واقعی تفاوت خواهد داشت؛ موضوعی که نحوه اندازه‌گیری بازده ماهانه به‌طور کامل توضیح می‌دهد.

پرسش‌های متداول درباره حداکثر افت سرمایه

حداکثر افت سرمایه قابل‌قبول چقدر است؟

رقم واحد و جهان‌شمولی وجود ندارد؛ فقط باید یک معیار و یک بازه زمانی برای سنجش تعیین شود. در ده سال منتهی به 31 ژوئیه 2026، بدترین افت SPY از اوج متحرک، بر مبنای قیمت‌های پایانی روزانه، به 34.2% رسید. راهبردی که در نمونه‌ای کوتاه‌تر رقم کمتری گزارش می‌کند، لزوماً کم‌ریسک‌تر نبوده است.

آیا حداکثر افت سرمایه همان نوسان‌پذیری است؟

خیر. نوسان‌پذیری، حرکت معمول روزانه را توصیف می‌کند؛ اما حداکثر افت سرمایه، بدترین مسیر از اوج تا کف را نشان می‌دهد. دارایی‌ای با نوسان‌پذیری پایین که طی دو سال به‌طور پیوسته افت می‌کند، ممکن است افت سرمایه عمیق‌تری از دارایی پرنوسانی داشته باشد که مرتباً رکوردهای جدید ثبت می‌کند.

بازیابی از حداکثر افت سرمایه چقدر طول می‌کشد؟

این مدت متغیر است و بازگشت به اوج قبلی اغلب نیمه طولانی‌تر مسیر است. برای SPY از سال 2016، عمیق‌ترین دوره کامل زیر اوج قبلی، از زمان اوج تا ثبت اوج جدید، 181 روز تقویمی طول کشید که 33 روز آن در مسیر نزولی سپری شد.

آیا حداکثر افت سرمایه، زیان‌های آینده را پیش‌بینی می‌کند؟

خیر. این شاخص یک مسیر رخ‌داده در گذشته را توصیف می‌کند و هرچه نمونه زمانی طولانی‌تر باشد، تقریباً همیشه رقم بزرگ‌تری به دست می‌آید. حداکثر افت سرمایه نشان می‌دهد یک راهبرد تاکنون چه شرایطی را پشت سر گذاشته است، اما درباره آنچه در آینده رخ می‌دهد هیچ سقفی تعیین نمی‌کند.


تمام پنل‌های بالا، SQL مربوط به خود را ذخیره می‌کنند. یکی از آن‌ها را باز کنید، نماد یا بازه زمانی را تغییر دهید و همان محاسبات افت سرمایه را در پایانه Strasmore اجرا کنید.

#risk#drawdown#backtesting#performance metrics#python