Strasmore Research
शिक्षण Matt Connorद्वारे Matt Connor · अपडेटेड 2026-08-05

Maximum Drawdown म्हणजे काय? खोली आणि पुनर्प्राप्ती

Maximum drawdown म्हणजे मूल्य-मालिकेतील शिखरापासून तळापर्यंतची सर्वात मोठी घसरण. ती किती खोल आहे आणि नवीन उच्चांक गाठण्यासाठी पुनर्प्राप्तीला अधिक वेळ का लागतो, ते जाणून घ्या.

Maximum drawdown म्हणजे एखाद्या मूल्य-मालिकेत नोंदवलेली शिखरापासून तळापर्यंतची सर्वात मोठी घसरण. ती त्या वेळच्या उच्चांकाच्या तुलनेत टक्केवारीत मोजली जाते. एखाद्या खात्याची रक्कम $120,000 पर्यंत वाढली, $84,000 पर्यंत घसरली आणि नंतर पुन्हा सावरली, तर त्याचा maximum drawdown 30% असतो. हा आकडा कायम 30%च राहतो, कारण हे मोजमाप आजची स्थिती नव्हे, तर संपूर्ण इतिहासातील सर्वात खराब कालखंड नोंदवते. बहुतेक जण केवळ घसरणीची खोली सांगतात आणि तिथेच थांबतात. मात्र याच मोजमापात आणखी दोन कालावधी असतात: उच्चांकापासून नीचांकी पातळीपर्यंतचा कालावधी आणि त्या नीचांकी पातळीपासून पुन्हा नवीन उच्चांक गाठेपर्यंतचा त्यापेक्षा कितीतरी मोठा कालावधी.

कमालची घसरण कशी मोजली जाते?

ही संपूर्ण गणना मालिकेवरून एकाच फेरीत केली जाते. प्रत्येक निरीक्षणावर चालू कमाल मूल्य अद्ययावत केले जाते, सध्याच्या मूल्याची त्याच्याशी तुलना केली जाते आणि आतापर्यंतची सर्वात खराब नोंद ठेवली जाते.

  1. चालू शिखर पहिले मूल्य ठेवून सुरू करा.
  2. प्रत्येक नवीन मूल्यावर ते अधिक असल्यास शिखर वाढवा.
  3. त्या बिंदूवरील घसरण मोजा: मूल्याला शिखराने भागून त्यातून एक वजा करा.
  4. सर्वांत नकारात्मक नोंद ठेवा. तीच कमाल घसरण असते.

यासाठी returns series, volatility estimate किंवा distribution assumption यापैकी कशाचीही गरज नसते. Python standard library वापरून ही फेरी संख्यांच्या साध्या यादीवर चालते. नवीन Ubuntu प्रणालीवर प्रथम interpreter install करा:

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

ही फेरी maxdd.py म्हणून जतन करा. खालील prices ही हाताने तपासता यावीत म्हणून लहान ठेवलेली, दहा बिंदूंची काल्पनिक मालिका आहे:

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% ही कमाल घसरण कायम राहते. कमाल घसरण ही नमुन्यातील सर्वांत खराब क्षणाची कायमस्वरूपी नोंद असते. मालिका आज कोणत्या पातळीवर आहे, याबद्दल ती काहीही सांगत नाही. त्याच फेरीत आणखी दोन variables ठेवल्यास वेळ निश्चित करता येतो: शिखर नोंदवलेला index आणि सर्वांत खराब नोंद झालेला index.

ड्रॉडाउन वक्र कसा दिसतो

ड्रॉडाउन वक्र प्रत्येक टप्प्यावर step 3 कायम ठेवतो; तो त्याचे एका सर्वांत वाईट मूल्यामध्ये रूपांतर करत नाही. मालिका नवा उच्चांक नोंदवते तेव्हा रेषा शून्यावर असते आणि त्या दरम्यान शून्याखाली राहते. म्हणूनच या अंतराला “underwater” म्हटले जाते. जानेवारी 2016पासून महिनाअखेरीच्या बंद भावांवर S&P 500चा मागोवा घेणाऱ्या exchange traded fund SPYसाठी हा वक्र असा दिसतो.

क्वेरी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% दर्शवतो. या रचनेतील दोन वैशिष्ट्ये महत्त्वाचा धडा देतात. पुनर्प्राप्ती तीव्र उसळीऐवजी संथ चढाईच्या स्वरूपात होते. तसेच प्रत्येक नवा उच्चांक वक्र पुन्हा शून्यावर आणतो आणि त्यापूर्वीची दृश्यात्मक छाप पुसून टाकतो.

घटीनंतर सावरण्यास किती वेळ लागतो?

एका drawdownमध्ये तीन स्वतंत्र आकडे असतात. कामगिरीच्या तक्त्याचा अर्थ लावताना त्यांना एकच समजणे ही सर्वात सामान्य चूक आहे:

  1. घटीची खोली: मूल्य त्याच्या सर्वोच्च पातळीपेक्षा किती टक्के खाली आले.
  2. किमान पातळीपर्यंतचा कालावधी: सर्वोच्च पातळीपासून तळापर्यंतचे कॅलेंडर दिवस.
  3. सावरण्याचा कालावधी: तळापासून नव्या सर्वोच्च पातळीपर्यंत पोहोचण्यासाठी लागलेले कॅलेंडर दिवस.

तिसरा कालावधी सामान्यतः सर्वाधिक मोठा असतो. मात्र ठळक मथळ्यातील आकड्यात तो कधीच दिसत नाही. खालील पॅनेलमध्ये 2016 पासून SPYमधील दररोजच्या बंद भावांवर आधारित पूर्ण झालेल्या प्रत्येक underwater कालखंडाची पुनर्रचना केली आहे. सर्वोच्च पातळी नोंदवल्या गेलेल्या दिवशी असा कालखंड सुरू होतो आणि निधी त्या पातळीपेक्षा प्रथमच वर बंद झालेल्या दिवशी संपतो.

क्वेरी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 दिवस निधी underwater राहिला. Jan 2022 मधील पुढील नोंद कमी तीव्र आहे; ती 25.4% इतकी आहे आणि निधीला आधीच्या सर्वोच्च पातळीखाली 746 दिवस ठेवते.

घटीची खोली आणि कालावधी यांचा थेट संबंध नसतो. झपाट्याने झालेली घसरण आणि त्यानंतरची जलद पुनर्बांधणी, तसेच अनेक वर्षे चालणारी सौम्य घसरण, या दोन्हींचे संक्षेपण एका टक्केवारीत होते. मार्च 2020 मधील घसरण हा पहिल्या प्रकाराचा आदर्श नमुना आहे, तर बाजार घसरणीनंतर कसे सावरतात हा त्या प्रवासातील दुसऱ्या टप्प्याचा मागोवा घेतो.

कमालची घसरण मोजण्याचा कालावधी वाढला की ती अधिक का दिसते

कमाल घसरण ही कमाल मूल्य असते. त्यामुळे इतिहासातील कालावधी वाढवल्यास ती तशीच राहू शकते किंवा अधिक खोल होऊ शकते. दीर्घ कालावधीत प्रत्येक टप्प्यावर नोंदवलेला चालू उच्चांक हा लघुकालावधीतील उच्चांकाइतका किंवा त्याहून अधिक असतो. त्यामुळे गणितानुसार परिणाम ठरतो. 31 जुलै 2026 रोजी संपणाऱ्या पाच वेगवेगळ्या कालावधींमध्ये त्याच फंडाचे मोजमाप केल्यास हा परिणाम दिसतो.

क्वेरीतोच फंड, पाच मागोवा कालावधी: 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 मध्ये येतो. फंड अधिक जोखमीचा झालेला नसतो. नमुन्याचा कालावधी फक्त वाढलेला असतो.

याच गणितामुळे धोरणांची तुलना देखील विकृत होऊ शकते. तीन वर्षांचा backtest आणि वीस वर्षांचा backtest समान वर्तनाचे वर्णन करू शकतात, तरीही त्यात नोंदवलेल्या घसरणी खूप वेगळ्या असू शकतात. त्यामुळे मोजमापाचा कालावधी नमूद केल्याशिवाय या आकड्याला फारसा अर्थ राहत नाही. backtestingमधील look-ahead bias मध्ये स्वच्छ दिसणारा backtest स्वतःच्या कामगिरीचे अतिशयोक्तिपूर्ण चित्र कसे दाखवतो, याचा आणखी एक मार्ग स्पष्ट केला आहे.

कमालची घट विरुद्ध अस्थिरता

अस्थिरता एखाद्या दिवसातील दोन्ही दिशांच्या हालचालीची नेहमीची तीव्रता मोजते. कमाल घट किंमत खाली जाण्याचा एक विशिष्ट मार्ग मोजते. दोन्ही जोखमीची मोजमापे आहेत; मात्र ती वेगवेगळ्या प्रश्नांची उत्तरे देतात. 31 जुलै 2026 पर्यंतच्या पाच वर्षांसाठी आठ परिचित कंपन्यांची ही दोन्ही मोजमापे पॅनेलमध्ये शेजारी-शेजारी दाखवली आहेत. अस्थिरता दैनिक closing pricesवरून annualized केली आहे.

क्वेरीवार्षिकीकृत अस्थिरतेच्या तुलनेतील कमाल ड्रॉडाउन: 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% इतकी झाली. त्याच्या तुलनेत annualized volatility 22.6% होती. तुलनेने कमी घट झालेल्या टोकाला, KO मध्ये 20.9% इतकी घट झाली आणि volatility 16.7% होती. अस्थिरता ही संपूर्ण कालावधीतील प्रत्येक दिवसाची सरासरी असते. त्यामुळे दीर्घकाळ चाललेली मंद घसरण सरासरीत फारशी दिसून येत नाही. Drawdown म्हणजे किंमत प्रत्यक्षात गेलेल्या मार्गातील सर्वांत वाईट टप्पा. दोन वर्षे हळूहळू घसरणाऱ्या एखाद्या स्थिर holdingमध्ये volatility फारशी असामान्य नसतानाही मोठा drawdown नोंदवला जाऊ शकतो.

कमी अस्थिरतेतील विसंगती दीर्घ कालावधीत तुलनेने शांत शेअर्सची कामगिरी कशी होते, याचा अभ्यास करते. Kelly criterionनुसार position sizing drawdown सहनशीलतेचे रूपांतर position sizeमध्ये कसे होते, हे दाखवते.

संख्या काय सांगू शकत नाही

खालील चार मर्यादा लक्षात ठेवण्यासारख्या आहेत:

  1. ही प्रत्यक्ष घडलेल्या एका मार्गावर आधारित असते. वेगळ्या क्रमाने घडलेल्या घटनांमध्ये त्याच प्रक्रियेतून यापेक्षा खूपच खराब आकडा मिळू शकतो.
  2. ती नमुन्याच्या कालावधीवर अवलंबून असते. त्यामुळे दोन drawdownsची तुलना समान कालावधीच्या विंडोवरच करावी.
  3. ती sampling frequencyवर अवलंबून असते. महिनाअखेरचे closing prices intraday lows लपवतात. त्यामुळे त्याच कालावधीतील daily closesच्या तुलनेत drawdownचा आकडा कमी दिसतो.
  4. त्यातून भविष्यासंबंधी कोणतीही माहिती मिळत नाही. एखादी मालमत्ता शिखरापेक्षा 30% खाली असणे, 31वा टप्पा उद्या येईल की नाही, हे सांगत नाही.

याच शेवटच्या मर्यादेमुळे automated systemला drawdown thresholdऐवजी drawdown policy आवश्यक असते. “20%वर halt करा” हा आदेश एकाच प्रश्नाचे उत्तर देतो. पण दोन प्रश्न अनुत्तरित ठेवतो: haltच्या वेळी open positionsचे काय होईल आणि system पुन्हा सुरू करण्यासाठी कोणता पुरावा आवश्यक असेल. Trading botsसाठी circuit breakers या policyची रचना स्पष्ट करते. मनमानी, स्थिर नियमाची किंमत recovery legमध्ये दिसून येते. system नीचांकी पातळीच्या जवळ थांबून उशिरा पुन्हा सुरू झाल्यास तो वाढीचा बराच भाग गमावतो. सर्वोत्तम दिवस चुकणे या गणिताचे आकडे देते.

दोन आकड्यांची तुलना करण्यापूर्वी measurementमधील एक बाब महत्त्वाची आहे: fundच्या price seriesवरील drawdown आणि प्रत्यक्ष accountवरील drawdown समान नसतात, जेव्हा cash accountमध्ये येते किंवा बाहेर जाते आणि जेव्हा dividends जमा होतात. मासिक returns कसे मोजले जातात याचे संपूर्ण स्पष्टीकरण देते.

कमाल घसरणीवरील वारंवार विचारले जाणारे प्रश्न

चांगली कमाल घसरण किती असते?

यासाठी कोणताही सार्वत्रिक आकडा नाही. तुलना करण्यासाठी benchmark आणि मोजमापाची कालावधी आवश्यक असते. 31 जुलै 2026 पर्यंतच्या दहा वर्षांत SPYची चालू शिखरापासूनची सर्वात मोठी घसरण दैनंदिन बंद भावांवर 34.2% इतकी होती. कमी कालावधीतील नमुन्यावर त्यापेक्षा लहान आकडा दाखवणारी strategy अधिक सुरक्षित असेलच असे नाही.

कमाल घसरण आणि volatility एकच आहेत का?

नाही. Volatility दैनंदिन हालचालीचे सामान्य परिमाण दर्शवते. कमाल घसरण शिखरापासून तळापर्यंतचा सर्वात वाईट एकच प्रवास दर्शवते. दोन वर्षे सातत्याने घसरणाऱ्या कमी-volatility असलेल्या holdingची drawdown, वारंवार चढ-उतार होत असूनही नवीन उच्चांक नोंदवणाऱ्या holdingपेक्षा अधिक खोल असू शकते.

कमाल घसरणीतून सावरण्यास किती वेळ लागतो?

हे बदलते. अनेकदा परत शिखरावर पोहोचण्याचा कालावधी अधिक मोठा असतो. 2016 पासून SPYसाठी, आधीच्या उच्चांकाखाली राहिलेला सर्वात खोल पूर्ण कालखंड शिखरापासून नवीन उच्चांकापर्यंत 181 calendar days इतका होता. त्यापैकी 33 दिवस घसरणीत गेले.

कमाल घसरण भविष्यातील तोट्यांचा अंदाज देते का?

नाही. ती आधीच घडलेल्या एका प्रवासाचे वर्णन करते. दीर्घ नमुना वापरल्यास आकडा जवळपास नेहमीच मोठा येतो. एखाद्या strategyने आतापर्यंत किती घसरण सहन केली आहे, हे ती नोंदवते; पुढे किती घसरण होऊ शकते यावर तिची कोणतीही मर्यादा नसते.


वरील प्रत्येक panelमध्ये त्यामागील SQL साठवलेले आहे. एखादा panel उघडा, ticker किंवा कालावधी बदला आणि Strasmore terminalवर त्याच drawdown arithmeticचा वापर करून query चालवा.

#risk#drawdown#backtesting#performance metrics#python