Strasmore Research
सीखें Matt Connorलेखक: Matt Connor · अपडेट किया गया: 2026-08-05

Maximum Drawdown क्या है और इसकी गणना कैसे करें

Maximum drawdown किसी निवेश की सबसे बड़ी गिरावट को दर्शाता है। यह लेख बताता है कि कैसे शिखर से निचले स्तर तक की गिरावट और नए उच्च स्तर तक पहुँचने में लगने वाला समय महत्वपूर्ण है।

33

अधिकतम गिरावट (Maximum Drawdown) की परिभाषा

Maximum drawdown किसी मूल्य श्रृंखला में शिखर से निचले स्तर तक की सबसे बड़ी गिरावट है, जिसे चल रहे शिखर के प्रतिशत के रूप में मापा जाता है। यदि कोई खाता बढ़कर एक लाख बीस हजार डॉलर तक पहुँचता है, फिर गिरकर चौरासी हजार डॉलर पर आ जाता है, और उसके बाद रिकवर करता है, तो उसका maximum drawdown तीस प्रतिशत होगा। यह आंकड़ा हमेशा के लिए वही रहता है, क्योंकि यह सांख्यिकी आज की स्थिति के बजाय इतिहास के सबसे खराब दौर को दर्ज करती है। अधिकांश लोग केवल गिरावट की गहराई बताते हैं और वहीं रुक जाते हैं। इसी सांख्यिकी के भीतर दो और आंकड़े निहित होते हैं: शिखर से निचले स्तर तक पहुँचने में लगा समय, और उस निचले स्तर से वापस नए शिखर तक पहुँचने में लगा कहीं अधिक लंबा समय।

Maximum drawdown की गणना कैसे की जाती है?

पूरी गणना डेटा श्रृंखला पर एक बार में की जाती है। प्रत्येक अवलोकन (observation) पर आप रनिंग मैक्सिमम को अपडेट करते हैं, उसके मुकाबले वर्तमान मूल्य को मापते हैं, और अब तक देखी गई सबसे खराब स्थिति को दर्ज करते हैं।

  1. रनिंग पीक को पहले मान पर सेट करें।
  2. प्रत्येक नए मान पर, यदि मान अधिक है तो पीक को बढ़ाएं।
  3. उस बिंदु पर drawdown की गणना करें: मान को पीक से विभाजित करें, और उसमें से एक घटाएं।
  4. सबसे नकारात्मक रीडिंग को सुरक्षित रखें। यही maximum drawdown है।

इसमें न तो रिटर्न सीरीज, न ही volatility का अनुमान, और न ही वितरण की कोई धारणा शामिल होती है। यह लूप 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% का आंकड़ा बना रहता है। Maximum drawdown किसी नमूने में सबसे खराब क्षण का स्थायी रिकॉर्ड है, और यह इस बारे में कुछ नहीं बताता कि श्रृंखला आज कहां स्थित है। उसी लूप में दो और वेरिएबल समय को कैप्चर कर सकते हैं: वह इंडेक्स जहां पीक सेट किया गया था, और वह इंडेक्स जहां सबसे खराब रीडिंग दर्ज हुई थी।

ड्रडाउन कर्व कैसा दिखता है

एक ड्रडाउन कर्व हर बिंदु पर चरण तीन का अनुसरण करता है, बजाय इसके कि इसे केवल एक सबसे खराब मूल्य तक सीमित कर दिया जाए। जब भी डेटा श्रृंखला एक नया उच्च स्तर बनाती है, तो यह रेखा शून्य पर रहती है और बीच की अवधि में शून्य से नीचे लटकी रहती है, इसीलिए इस अंतर को "अंडरवाटर" (पानी के नीचे) कहा जाता है। यहाँ जनवरी 2016 से महीने के अंत के क्लोजिंग आंकड़ों के आधार पर SPY का वह कर्व दिया गया है, जो S&P 500 को ट्रैक करने वाला एक एक्सचेंज ट्रेडेड फंड है।

क्वेरी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) से उबरने में कितना समय लगता है?

एक ड्रडाउन के भीतर तीन अलग-अलग संख्याएं होती हैं, और प्रदर्शन तालिका (performance table) को पढ़ते समय उन्हें एक मान लेना सबसे आम गलती है:

  1. गहराई (Depth): मूल्य अपने उच्चतम स्तर से कितने प्रतिशत नीचे गिरा।
  2. निचले स्तर तक का समय (Time to the low): उच्चतम स्तर से निचले स्तर तक पहुंचने में लगे कैलेंडर दिन।
  3. रिकवरी का समय (Recovery time): उस निचले स्तर से वापस नए उच्चतम स्तर तक पहुंचने में लगे कैलेंडर दिन।

तीसरा बिंदु आमतौर पर सबसे लंबा होता है, और यह वह आंकड़ा है जिसे हेडलाइन कभी नहीं दिखाती। नीचे दिया गया पैनल 2016 के बाद से SPY के लिए दैनिक क्लोजिंग के आधार पर हर पूर्ण 'अंडरवाटर' (underwater) अवधि का पुनर्निर्माण करता है। एक अवधि उस दिन शुरू होती है जब एक नया उच्चतम स्तर (peak) बनता है और उस दिन समाप्त होती है जब फंड पहली बार उससे ऊपर बंद होता है।

क्वेरी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 की गिरावट पहले आकार का सटीक उदाहरण है, और बाजार गिरावट से कैसे उबरते हैं यात्रा के दूसरे चरण का अनुसरण करता है।

मैक्सिमम ड्राडाउन मापने की अवधि बढ़ने पर क्यों खराब होता जाता है

मैक्सिमम ड्राडाउन एक अधिकतम मान है, इसलिए इतिहास जोड़ने से यह या तो स्थिर रह सकता है या और गहरा हो सकता है। लंबी अवधि में रनिंग पीक (running peak) हर बिंदु पर छोटी अवधि के पीक के बराबर या उससे अधिक होता है, जो गणितीय रूप से इसे निर्धारित करता है। एक ही फंड को पांच अलग-अलग अवधियों में मापने पर, जो सभी 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 में आता है। फंड अधिक जोखिम भरा नहीं हुआ है। केवल नमूने (sample) की अवधि बढ़ गई है।

यही गणित रणनीतियों की तुलना को भी विकृत करता है। तीन साल का बैकटेस्ट और बीस साल का बैकटेस्ट एक समान व्यवहार का वर्णन कर सकते हैं, फिर भी वे बहुत अलग ड्राडाउन रिपोर्ट कर सकते हैं। इसलिए, बिना समय-सीमा के इस आंकड़े का कोई विशेष अर्थ नहीं है। बैकटेस्टिंग में लुक-अहेड बायस एक और तरीका बताता है कि कैसे एक साफ-सुथरा दिखने वाला बैकटेस्ट खुद को बेहतर दिखाता है।

Maximum drawdown बनाम volatility

Volatility दैनिक उतार-चढ़ाव के सामान्य आकार को मापती है। Maximum drawdown गिरावट के एक विशिष्ट रास्ते को मापता है। दोनों जोखिम के आंकड़े हैं, और ये अलग-अलग सवालों के जवाब देते हैं। यह पैनल 31 जुलाई, 2026 तक के पांच वर्षों के लिए आठ प्रसिद्ध नामों के लिए इन्हें एक साथ रखता है, जिसमें volatility की गणना दैनिक क्लोजिंग कीमतों के आधार पर वार्षिक रूप में की गई है।

क्वेरीअधिकतम ड्राडाउन बनाम वार्षिक अस्थिरता: आठ लार्ज कैप, 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% दर्ज की गई है, जबकि इसकी वार्षिक volatility 22.6% है। सबसे कम गिरावट वाले छोर पर, KO में 20.9% की गिरावट आई और इसकी volatility 16.7% रही। Volatility इस अवधि के हर दिन का औसत है, और औसत लंबी और धीमी गिरावट को नजरअंदाज कर देते हैं। Drawdown वह सबसे खराब रास्ता है जिसे कीमत ने वास्तव में तय किया है। एक शांत होल्डिंग जो दो साल तक धीरे-धीरे नीचे गिरती है, वह सामान्य volatility रीडिंग के साथ भी एक गहरा drawdown दिखा सकती है।

कम volatility की विसंगति इस बात पर गौर करती है कि शांत नाम लंबी अवधि में कैसा व्यवहार करते हैं, और Kelly criterion पोजीशन साइजिंग यह दिखाती है कि drawdown सहनशीलता कैसे पोजीशन साइज में बदल जाती है।

संख्याएं जो नहीं बता सकतीं

चार सीमाएं ध्यान में रखना आवश्यक है:

  1. यह केवल एक वास्तविक परिणाम है। वही प्रक्रिया अलग परिस्थितियों में काफी खराब आंकड़े भी दे सकती थी।
  2. यह नमूने की अवधि पर निर्भर करता है, इसलिए दो ड्रॉडाउन की तुलना केवल समान समय-सीमाओं पर ही की जा सकती है।
  3. यह सैंपलिंग की आवृत्ति पर निर्भर करता है। महीने के अंत की क्लोजिंग इंट्राडे के निचले स्तरों को छिपा लेती है और समान अवधि के दैनिक क्लोजिंग की तुलना में छोटी संख्या दिखाती है।
  4. इसमें भविष्य के लिए कोई जानकारी नहीं होती। किसी शिखर से तीस प्रतिशत नीचे होने का मतलब यह नहीं है कि इकतीसवां प्रतिशत कल ही आ जाएगा।

यही अंतिम सीमा कारण है कि एक स्वचालित सिस्टम को ड्रॉडाउन थ्रेशोल्ड के बजाय एक ड्रॉडाउन नीति की आवश्यकता होती है। "बीस प्रतिशत पर रुकें" एक प्रश्न का उत्तर देता है, लेकिन दो अनुत्तरित छोड़ देता है: रुकने पर ओपन पोजीशन का क्या होगा, और कौन सा प्रमाण सिस्टम को फिर से शुरू करेगा। ट्रेडिंग बॉट्स के लिए सर्किट ब्रेकर्स उस नीति के स्वरूप पर विस्तार से चर्चा करता है। एक मनमाना नियम लागू करने की लागत रिकवरी चरण में सामने आती है, जहां निचले स्तर के पास रुकने और देर से पुनरारंभ होने वाला सिस्टम तेजी के दौर से बाहर हो जाता है। सबसे अच्छे दिनों को चूकना उस गणित को आंकड़ों में स्पष्ट करता है।

दो आंकड़ों की तुलना करने से पहले एक मापन विवरण महत्वपूर्ण है: किसी फंड की मूल्य श्रृंखला पर ड्रॉडाउन और वास्तविक खाते पर ड्रॉडाउन तब अलग होते हैं जब नकदी अंदर या बाहर जाती है और जब डिविडेंड प्राप्त होते हैं, जिसे मासिक रिटर्न को कैसे मापा जाता है में विस्तार से समझाया गया है।

Maximum drawdown से संबंधित अक्सर पूछे जाने वाले प्रश्न

एक अच्छा maximum drawdown क्या है?

इसका कोई सार्वभौमिक आंकड़ा नहीं है, केवल एक बेंचमार्क और मापने की अवधि होती है। 31 जुलाई, 2026 तक के दस वर्षों में, SPY की दैनिक क्लोजिंग के आधार पर उच्चतम स्तर से सबसे बड़ी गिरावट 34.2% मापी गई थी। यदि कोई रणनीति कम अवधि के नमूने पर छोटा आंकड़ा दिखाती है, तो इसका मतलब यह नहीं है कि वह अधिक सुरक्षित है।

क्या maximum drawdown और volatility एक ही हैं?

नहीं। Volatility सामान्य दैनिक उतार-चढ़ाव को दर्शाती है; जबकि maximum drawdown किसी शिखर से निचले स्तर तक के सबसे खराब दौर को दर्शाता है। कम volatility वाली होल्डिंग, जो दो वर्षों तक लगातार गिरती है, उसमें अधिक उतार-चढ़ाव वाली होल्डिंग की तुलना में गहरा drawdown हो सकता है, भले ही वह बार-बार नए उच्च स्तर बना रही हो।

Maximum drawdown से उबरने में कितना समय लगता है?

यह अलग-अलग होता है, और वापस ऊपर चढ़ने का चरण अक्सर अधिक लंबा होता है। 2016 से SPY के लिए, पिछले उच्च स्तर से नीचे रहने वाला सबसे गहरा दौर शिखर से नए उच्च स्तर तक 181 कैलेंडर दिनों का था, जिसमें से 33 दिन गिरावट में बीते थे।

क्या maximum drawdown भविष्य के नुकसान की भविष्यवाणी करता है?

नहीं। यह केवल उस रास्ते का वर्णन करता है जो पहले ही घटित हो चुका है, और एक लंबा नमूना लगभग हमेशा एक बड़ा आंकड़ा ही प्रस्तुत करता है। यह केवल यह रिकॉर्ड करता है कि कोई रणनीति अब तक किन परिस्थितियों से बची है, और भविष्य में होने वाले नुकसान की कोई सीमा तय नहीं करता है।


ऊपर दिए गए प्रत्येक पैनल के पीछे SQL डेटा स्टोर है। किसी एक को खोलें, ticker या समय-सीमा बदलें, और Strasmore टर्मिनल पर वही drawdown गणना चलाएं।

#risk#drawdown#backtesting#performance metrics#python