Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

Equal Weight कधी Optimizationपेक्षा सरस ठरते

नमुना-कालावधी लहान असताना equal weight, optimized position sizingपेक्षा चांगली कामगिरी करते. Seeded Python simulationमध्ये हा फरक दिसतो आणि नमुना वाढल्यावर कमी होतो.

अपेक्षित परतावा अचूकपणे ठरवण्यासाठी नमुना-कालावधी अपुरा असेल, तेव्हा optimized position sizingपेक्षा equal weight अधिक चांगली कामगिरी करते. असे छोटे नमुने अपवाद नसून सामान्य बाब आहेत. Optimizer ही तर्कसंगत गणिती पद्धत आहे; मात्र ती अशा इनपुटवर लागू केली जाते, ज्याचे मोजमाप कोणीही अचूकपणे करू शकत नाही. 1/N portfolio, म्हणजे equal weight, कोणताही अंदाज वापरत नाही. त्यामुळे अंदाज चुकीचे असतानाही ते टिकून राहते.

समान वजन खरोखरच optimizationपेक्षा चांगली कामगिरी करते का?

एका विशिष्ट परिस्थितीत, होय. हे शब्द एकेक करून समजून घेऊया. समान वजन, ज्याला 1/N असे लिहिले जाते, N positionsमध्ये भांडवल समान प्रमाणात विभागते आणि कोणत्याही प्रकारच्या अंदाजाची गरज भासत नाही. Mean variance optimizationमध्ये अंदाजित varianceच्या प्रत्येक युनिटमागे सर्वोत्तम अपेक्षित परतावा देणारे weights शोधले जातात. Kelly criterionमध्ये दीर्घकालीन compound growth कमाल करणारे weights शोधले जातात; परस्पर असंबद्ध assetsमध्ये त्याचे उत्तर प्रत्येक assetच्या अपेक्षित excess returnला त्याच्या varianceने भागल्यावर मिळणाऱ्या प्रमाणानुसार weight ठेवण्यापर्यंत मर्यादित होते. आमचे Kelly criterionनुसार position sizing मार्गदर्शक हे सूत्र सविस्तर समजावते.

दोन्ही optimizersना समान input आवश्यक असतो: प्रत्येक assetचा अपेक्षित परतावा. नमुन्यावरून अंदाज काढताना हीच मात्रा सर्वाधिक अचूकतेने मोजता येत नाही. Volatilityचा अंदाज तुलनेने लहान कालावधीच्या windowमधूनही पुरेशा अचूकतेने काढता येतो. Meanबाबत तसे होत नाही. या दोन्हींच्या अंदाजांमधील फरक कोणत्याही price historyमध्ये स्पष्ट दिसतो. खालील panelमध्ये मोठ्या प्रमाणावर धारण केली जाणारी सहा नावे घेतली आहेत. 2015 ते 2024 या कालावधीतील प्रत्येक calendar year स्वतंत्रपणे मोजला आहे आणि त्या वर्षांतील सर्वोच्च व सर्वात कमी वार्षिक अंदाजांमधील अंतर दाखवले आहे. प्रत्येक नावासाठी हे दोनदा केले आहे: एकदा annualized average daily returnसाठी आणि एकदा annualized volatilityसाठी.

क्वेरीदहा वर्षांचे वार्षिक अंदाज: अस्थिरतेपेक्षा सरासरीत अधिक बदल
प्रत्येक आकड्यामागील अचूक SQL
WITH prices AS
(
    SELECT
        ticker,
        date,
        toFloat64(max(close)) AS c
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'SPY', 'KO', 'JNJ')
      AND date >= '2015-01-01'
      AND date <  '2025-01-01'
    GROUP BY ticker, date
),
rets AS
(
    SELECT
        ticker,
        date,
        c / lagInFrame(c, 1) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
    FROM prices
),
yearly AS
(
    SELECT
        ticker,
        toYear(date)                     AS yr,
        avg(ret) * 252 * 100             AS mean_pct,
        stddevPop(ret) * sqrt(252) * 100 AS vol_pct
    FROM rets
    WHERE isFinite(ret)
    GROUP BY ticker, yr
    HAVING count() >= 200
)
SELECT
    ticker,
    round(max(mean_pct) - min(mean_pct), 1) AS mean_estimate_range_pct,
    round(max(vol_pct) - min(vol_pct), 1)   AS vol_estimate_range_pct
FROM yearly
GROUP BY ticker
ORDER BY mean_estimate_range_pct DESC
Run this yourself

NVDAसाठी त्या दहा वर्षांमध्ये वार्षिक mean estimateची range 184.7 percentage points इतकी आहे. त्याच नावाच्या त्याच वर्षांतील volatility estimateची range 28.6 points इतकी आहे. Panelमधील सर्वात स्थिर नाव KO हे देखील त्याच्या वार्षिक mean estimateमध्ये 23.9 pointsची हालचाल दाखवते. गेल्या वर्षाचा average return या वर्षाचा expected return म्हणून optimizerला देणारी कोणतीही पद्धत इतक्या मोठ्या फरकाची शक्यता असलेली संख्या वापरते.

अपेक्षित परतावा मोजण्यासाठी किती मोठा नमुना आवश्यक आहे?

अनुमानित सरासरी परताव्याची standard error ही assetच्या volatilityला वर्षांमधील sample lengthच्या वर्गमुळाने भागल्यावर मिळते. येथे मोजमाप वर्षांमध्ये आहे, observationsमध्ये नाही. त्याच बारा महिन्यांतील daily ऐवजी hourly sampling केल्याने काहीही फायदा होत नाही. 20 टक्के volatility असलेल्या assetवर हे सूत्र लागू केल्यास, एक वर्षाचा इतिहास 20 percentage points प्रति वर्षांची standard error देतो. चार वर्षांमुळे ती 10 pointsवर येते. ती एक pointपर्यंत आणण्यासाठी—दोन pointsनी वेगळे असलेल्या दोन assetsना त्यांच्या खऱ्या सरासरी परताव्यानुसार क्रमवारी लावण्यापूर्वी अपेक्षित असलेली अचूकता—चार शतकांचा data आवश्यक ठरतो.

Volatilityच्या बाबतीत चित्र वेगळे आहे. तिची अचूकता calendar spanऐवजी observationsच्या संख्येनुसार सुधारते. त्यामुळे काही महिन्यांचा daily dataदेखील volatilityचा अंदाज काही pointsच्या मर्यादेत आणतो. खालील panelमध्ये एका index fundच्या वीस वर्षांच्या daily returnsना समान कालावधीच्या, एकमेकांवर न येणाऱ्या blocksमध्ये विभागले आहे. प्रत्येक blockमध्ये दोन्ही estimates काढले आहेत आणि blockनुसार estimates किती बदलतात ते दाखवले आहे.

क्वेरीनमुना-लांबीनुसार सरासरी व अस्थिरतेच्या अंदाजांचा विखुराव
प्रत्येक आकड्यामागील अचूक SQL
WITH prices AS
(
    SELECT
        date,
        toFloat64(max(close)) AS c
    FROM global_markets.stocks_daily_aggs
    WHERE ticker = 'SPY'
      AND date >= '2005-01-01'
      AND date <  '2025-01-01'
    GROUP BY date
),
rets AS
(
    SELECT
        date,
        c / lagInFrame(c, 1) OVER (ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
    FROM prices
),
numbered AS
(
    SELECT
        ret,
        row_number() OVER (ORDER BY date ASC) AS i
    FROM rets
    WHERE isFinite(ret)
),
sweep AS
(
    SELECT
        arrayJoin([21, 63, 126, 252, 504]) AS n,
        i,
        ret
    FROM numbered
),
blocks AS
(
    SELECT
        n,
        intDiv(i - 1, n)                 AS blk,
        avg(ret) * 252 * 100             AS mean_pct,
        stddevPop(ret) * sqrt(252) * 100 AS vol_pct
    FROM sweep
    GROUP BY n, blk
    HAVING count() = n
)
SELECT
    concat(toString(n), ' sessions') AS sample_length,
    round(stddevPop(mean_pct), 1)    AS mean_estimate_spread_pct,
    round(stddevPop(vol_pct), 1)     AS vol_estimate_spread_pct,
    count()                          AS window_count
FROM blocks
GROUP BY n
ORDER BY n ASC
Run this yourself

21 sessions कालावधीच्या blocksमध्ये mean estimate 53.7 percentage pointsच्या परिघात बदलतो. त्याच blocksवर मोजलेल्या volatility estimateसाठी हा फरक 10.9 points आहे. Blockचा कालावधी 504 sessionsपर्यंत वाढवल्यास meanमधील फरक 10.6 pointsपर्यंत कमी होतो. ही घट square rootच्या प्रमाणात होते: error निम्मी करण्यासाठी dataचे प्रमाण चारपट करावे लागते.

तुम्ही स्वतः चालवू शकणारे seeded simulation

यापैकी कोणतीही गोष्ट estimation error इतकी मोठी आहे की 1/N ला विजय मिळेल, हे सिद्ध करत नाही. हा प्रयोग ते सिद्ध करतो. यासाठी Python installशिवाय अन्य काही आवश्यक नाही: data files नाहीत, downloads नाहीत आणि third-party packages नाहीत. तुम्ही निवडलेल्या parametersमधून हा प्रयोग स्वतःचे returns तयार करतो. त्यामुळे खरे उत्तर माहीत असते आणि दोन्ही allocationsची त्याच्याशी तुलना करता येते.

  1. import random आणि import statistics ही दोन modules, तसेच from math import log import करा. पुढच्या ओळीत random.seed(20260816) वापरून seed सेट करा.
  2. 5 assets निश्चित करा. त्यांचे खरे annual expected returns अनुक्रमे 5, 6, 7, 8 आणि 9 percent असावेत. प्रत्येकाची खरी annual volatility 20 percent असावी आणि त्यांच्यात परस्पर correlation नसावी. mu_d = mu_a / 252 आणि sd_d = sd_a / (252 ** 0.5) वापरून हे daily stepमध्ये रूपांतरित करा.
  3. [60, 125, 250, 500, 1000, 2500, 5000] या sweepमधून sample length T निवडा.
  4. random.gauss(mu_d, sd_d) वापरून प्रत्येक assetसाठी T daily returns तयार करा. Managerला पाहायला मिळणारा संपूर्ण इतिहास हाच असेल.
  5. statistics.mean वापरून प्रत्येक assetचा mean आणि statistics.stdev वापरून त्याची volatility estimate करा. Optimizerला उपलब्ध असलेली माहिती केवळ ही दोन estimates असतील.
  6. पाचही assetsना 0.2 weight देऊन equal weight portfolio तयार करा. यात कोणत्याही estimatesचा वापर होत नाही.
  7. प्रत्येक raw weight mu_hat / (sd_hat ** 2) इतका ठेवून optimized portfolio तयार करा. त्यानंतर प्रत्येक weightला सर्व raw weightsच्या absolute valuesच्या बेरजेने भागा. त्यामुळे दोन्ही portfoliosचे gross exposure समान राहते.
  8. खऱ्या parametersमधून प्रत्येक assetसाठी 2520 daily returnsचा fresh out-of-sample path तयार करा. कोणत्याही allocationने हा path आधी पाहिलेला नसतो.
  9. त्या pathवर दोन्ही portfoliosचे scoring करा. यासाठी log(1 + r) ची सरासरी वापरा. येथे r म्हणजे त्या दिवसातील पाच asset returnsची weighted sum.
  10. प्रत्येक Tसाठी steps 4 ते 9 स्वतंत्रपणे 2000 trialsमध्ये पुन्हा करा. Equal weightने optimized weightsपेक्षा चांगली कामगिरी केलेल्या trialsचा हिस्सा नोंदवा.

Short T पासून long Tकडे sweep वाचा. Short T असताना equal weight स्पष्ट बहुमत trialsमध्ये विजयी ठरते. T वाढत गेल्यावर हा हिस्सा सातत्याने कमी होतो. Long T असताना optimized weights बहुतेक trialsमध्ये विजयी ठरतात. मधल्या एखाद्या टप्प्यावर दोन्हींची कामगिरी समान होते आणि क्रम बदलतो. हा crossover point seed आणि true meansमधील फरकानुसार बदलतो. मात्र दिशा बदलत नाही: अधिक data optimizerला अनुकूल ठरतो, तर कमी data 1/Nला अनुकूल ठरतो. हा प्रयोग पुन्हा करण्यासाठी random.seed(20260816) मधील integer बदला आणि sweep पुन्हा चालवा.

वाईट mean estimateला optimizer कसा वाढवतो

Weightमध्ये estimates कुठे येतात ते पाहा. Estimated mean numeratorमध्ये असतो, तर estimated variance denominatorमध्ये असतो. Mean estimate दुप्पट केल्यास weight दुप्पट होतो. Variance estimateमध्ये एक-चतुर्थांश कपात केल्यास weight एक-तृतीयांशाने वाढतो. अनुकूल sampleमध्ये या दोन्ही चुका एकाच दिशेने परिणाम करतात: चांगल्या returnsची मालिका measured mean वाढवते आणि त्याच कालावधीत measured variance अनेकदा कमी करते. Optimizer त्या assetला समूहातील सर्वाधिक चांगली कामगिरी करणारा asset समजतो आणि त्यानुसार position size ठरवतो. Sampleबाहेरील कामगिरीत तो पुन्हा समूहातील सामान्य asset ठरतो. Equal weightला तो अनुकूल sample दिसलाच नाही.

Simulation ही या समस्येची सौम्य आवृत्ती आहे. परस्पर असंबंधित पाच assetsमुळे diagonal covariance matrix तयार होते आणि तिचे inverse काढण्याची अडचण नसते. प्रत्यक्ष portfolios परस्पर संबंधित असतात. Assetsच्या संख्येपेक्षा थोड्याच अधिक observationsवर आधारित sample covariance matrix singular होण्याच्या जवळ असते. तिचे inverse काढल्यावर inputमधील लहान चुका अत्यंत मोठ्या weightsमध्ये रूपांतरित होतात. त्यामुळे optimizer एखाद्या assetमध्ये उपलब्ध भांडवलाच्या अनेक पट position आणि त्याच्या जवळच्या पर्यायी assetमध्ये त्याला offset करणारी short position घेऊ शकतो. अशा weightचा drawdownवर होणारा परिणाम आमच्या portfolioमधील concentration risk या नोंदीत स्पष्ट केला आहे.

Inputही स्थिर राहत नाही. खालील panel broad index fund आणि मोठ्या consumer staples कंपनीच्या शेअरसाठी rolling one year average daily return दाखवतो. हे returns annualized असून monthly frequencyने sampled आहेत.

क्वेरीरोलिंग एक वर्षाचा सरासरी परतावा—ऑप्टिमायझरला दिली जाणारी संख्या
प्रत्येक आकड्यामागील अचूक SQL
WITH prices AS
(
    SELECT
        ticker,
        date,
        toFloat64(max(close)) AS c
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('SPY', 'KO')
      AND date >= '2015-10-01'
      AND date <  '2025-01-01'
    GROUP BY ticker, date
),
rets AS
(
    SELECT
        ticker,
        date,
        c / lagInFrame(c, 1) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
    FROM prices
),
trailing AS
(
    SELECT
        ticker,
        date,
        avg(ret) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 251 PRECEDING AND CURRENT ROW) * 252 * 100 AS trailing_mean_pct,
        row_number() OVER (PARTITION BY ticker ORDER BY date ASC) AS i
    FROM rets
    WHERE isFinite(ret)
)
SELECT
    toString(toStartOfMonth(date))                     AS month,
    round(avgIf(trailing_mean_pct, ticker = 'SPY'), 1) AS spy_trailing_mean_pct,
    round(avgIf(trailing_mean_pct, ticker = 'KO'), 1)  AS ko_trailing_mean_pct
FROM trailing
WHERE i >= 252
  AND date >= '2017-01-01'
GROUP BY month
ORDER BY month ASC
Run this yourself

या दोन रेषांवरील प्रत्येक बिंदू म्हणजे त्या तारखेला एखाद्या optimizerने expected return म्हणून स्वीकारले असते असा एक आकडा आहे. SPYसाठी पहिली monthly reading 17.7% आणि शेवटची 25.8% आहे; त्यांच्यामध्ये 96 readings आहेत. KOसाठी याच windowची सुरुवात -0.4% येथे होते. ही series month by month वापरणारी weighting scheme तिच्यातील प्रत्येक चढ-उताराचा वारसा घेते.

अर्धा Kelly आणि shrinkage हे उपाय ठरतात का?

ते परिणाम सौम्य करतात. प्रत्यक्ष वापरात चार उपाय दिसतात. यापैकी प्रत्येक उपाय सैद्धांतिक सर्वोत्तम परिणामाचा काही भाग सोडतो आणि अंदाजातील त्रुटींबाबतची संवेदनशीलता कमी करतो.

  • Half Kelly प्रत्येक weight निम्मा करतो. Kellyची growth curve तिच्या कमाल बिंदूजवळ सपाट, पण त्याखाली तीव्र असते. त्यामुळे अर्धी गुंतवणूक केल्यास सैद्धांतिक growth rateचा छोटा भाग गमावला जातो; मात्र जास्त मोजलेल्या edgeमुळे होणारे नुकसान त्यापेक्षा कितीतरी अधिक कमी होते. Volatility targeting हाच दृष्टिकोन denominatorवर लागू करते आणि अल्प नमुना प्रत्यक्षात देऊ शकणाऱ्या एकमेव inputवरून position size ठरवते.
  • Shrinkage प्रत्येक estimated meanला estimatesच्या cross-sectional averageकडे ओढते. नमुना लहान होत गेल्यास ही ओढ वाढते. ही प्रक्रिया मर्यादेपर्यंत नेल्यास प्रत्येक assetचा expected return समान होतो. Volatilities समान असतील, तर optimizer आपोआप equal weight देतो. Fully shrunk portfolio म्हणजे equal-weight portfolio.
  • Constraints म्हणजे shortingला परवानगी न देणे आणि प्रत्येक positionवर कमाल मर्यादा ठेवणे. त्यामुळे एखाद्या अनुकूल estimateमुळे एका weightला अतिशय मोठे होण्यापासून मर्यादा येते. हा अंदाज सुधारण्याचा उपाय नसून नुकसान-नियंत्रणाचा उपाय आहे.
  • Expected returns पूर्णपणे वगळल्यास minimum variance आणि risk parity उरतात. या दोन्ही पद्धती केवळ covariance वापरतात. नमुना प्रत्यक्षात पुरवू शकणारा input हाच आहे.

या चारपैकी कोणताही उपाय नमुन्यात नसलेली माहिती निर्माण करत नाही. ते फक्त तुमच्याकडे नसण्याची शक्यता असलेल्या माहितीवर portfolioचा किती भाग अवलंबून राहील, हे बदलतात.

ऑप्टिमायझेशनचा उपयोग सिद्ध होतो

हा बदल दोन्ही दिशांनी होतो. खऱ्या meanमधील spreadच्या तुलनेत T मोठे झाले की optimized allocation आघाडीवर येते आणि ती टिकवून ठेवते. हा spread जितका मोठा, तितक्या लवकर हे घडते. इनपुट डेटा पुरवत असेल, तेव्हा optimization हेच योग्य साधन ठरते. Covariance आणि hedge ratios यांचे अंदाज expected returnsपेक्षा अधिक अचूक असतात.

Equal weightची स्वतःची किंमत असते. तुमच्याकडे प्रत्यक्ष उपलब्ध असलेल्या माहितीचा तो वापर करत नाही. तसेच, छोट्या universeमध्ये तो कोणत्याही optimizerइतक्याच प्रमाणात concentration निर्माण करतो. प्रत्येक candidate weightingने ज्या डेटाचा weights ठरवताना वापर केला नाही, त्या डेटावर equal weight हा baseline म्हणून वापरा आणि त्याच्यावर मात झाली पाहिजे. त्याच sampleवर weights fit करून त्यांचे scoring करणे म्हणजे backtestingमधील look-ahead bias वेगळ्या रूपात दिसणे होय. यामुळे optimizerला प्रत्येक वेळी अवाजवी फायदा मिळतो. मोजलेल्या edgeभोवती single point estimateऐवजी विश्वासार्ह range हवी असल्यास, bootstrapped confidence intervals हे standard tool आहे.

वारंवार विचारले जाणारे प्रश्न

Equal weight खरोखर mean variance optimizationपेक्षा चांगले ठरते का?

थोडक्यात, लहान नमुन्यांमध्ये ते अनेकदा चांगले ठरते. Optimizerला प्रत्येक assetच्या अपेक्षित परताव्याचा अंदाज आवश्यक असतो. त्या अंदाजाची standard error साधारणतः assetच्या volatilityला नमुना-वर्षांच्या संख्येच्या square rootने भागल्याइतकी असते. ही error assetsमधील वास्तविक फरकांपेक्षा मोठी राहते तोपर्यंत optimizer noiseचे वर्गीकरण करत असतो. Equal weightमध्ये चुकीचा ठरू शकणारा असा अंदाजच नसतो.

अपेक्षित परताव्याचा अंदाज घेण्यासाठी किती observations आवश्यक असतात?

जवळजवळ कोणाकडे असतात त्यापेक्षा अधिक. 20 टक्के volatility असलेल्या assetसाठी एका वर्षाच्या daily dataमधून वार्षिक standard error जवळपास 20 percentage points राहते. ही error निम्मी करण्यासाठी calendar span चारपट वाढवावा लागतो. त्याच वर्षातील intraday observations वाढवल्याने मदत होत नाही. याउलट, volatilityचा अंदाज काही महिन्यांच्या dataमधूनही उपयोगी ठरतो.

Half Kelly म्हणजे फक्त छोटी bet आहे का?

ही अनुकूल अटींवरील छोटी bet आहे. Kelly growth curve तिच्या कमाल बिंदूजवळ सपाट असते. त्यामुळे stake निम्मी केल्यास theoretical growth rateमधील लहान हिस्सा सोडावा लागतो, पण pathची volatility साधारणतः निम्मी होते आणि अतिशयोक्ती केलेल्या edgeची किंमत कमी होते.

1/N portfolio म्हणजे काय?

हा असा portfolio आहे ज्यात N positionsपैकी प्रत्येकात भांडवलाचा समान हिस्सा गुंतवला जातो आणि ठरावीक वेळापत्रकानुसार rebalancing केले जाते. त्याला return forecast किंवा covariance estimateची गरज नसते. म्हणून ज्या weighting schemesना हे अंदाज आवश्यक असतात, त्यांच्यासाठी तो standard benchmark ठरतो.

Panels कसे तयार केले जातात

तिन्ही panels daily closes वाचतात आणि close-to-close simple returns मोजतात. प्रत्येक ticker आणि तारखेसाठी duplicate rows एकाच closeमध्ये एकत्र केल्या जातात. Average daily returnला 252 sessionsने गुणून means annualize केले जातात. Daily standard deviationला 252च्या square rootने गुणून volatilities annualize केल्या जातात. Yearly panelमध्ये किमान 200 sessions असलेले calendar yearच ठेवले जाते. Block panelमध्ये overlapping नसलेले blocks वापरले जातात. प्रत्येक lengthमधील अंतिम अपूर्ण block काढून टाकला जातो. त्यातील window count column प्रत्येक lengthमधून तयार झालेल्या blocksची संख्या दाखवतो. कुठेही dividends समाविष्ट केलेले नाहीत. त्यामुळे हे price returns आहेत आणि dividend देणाऱ्या assetsसाठी meanची पातळी कमी दाखवली जाते. Panelsचा उद्देश estimatesमधील spread दाखवणे हा आहे; त्यांची पातळी दाखवणे हा नाही.


येथील प्रत्येक panelमध्ये chartखाली exact SQL दिलेले आहे. Simulationमध्ये त्याचा seedदेखील दिलेला आहे. तुमच्या स्वतःच्या namesच्या यादीवर हीच estimate stability तपासणी चालवण्यासाठी Strasmore terminalवर plain Englishमध्ये विनंती करा.

#quant#position sizing#portfolio construction#estimation error#kelly