Wakati uzito sawa unashinda uboreshaji wa kwingineko
Uzito sawa hufanya vizuri zaidi kuliko uboreshaji wa ukubwa wa nafasi wakati sampuli ya data ni fupi. Uigaji wa Python unaonyesha mabadiliko haya yanavyotokea na kupotea.
23.9
Uzito sawa dhidi ya uboreshaji wa kwingineko
Uzito sawa (equal weight) hufanya vizuri zaidi kuliko uboreshaji wa ukubwa wa nafasi (optimized position sizing) wakati sampuli ya data ni fupi mno kiasi cha kushindwa kubaini mapato yanayotarajiwa. Sampuli fupi ni hali ya kawaida badala ya kuwa ubaguzi. Kifaa cha kuboresha (optimizer) ni hesabu sahihi inayotumika kwenye data ya pembejeo ambayo hakuna anayeipima kwa usahihi. Kwingineko ya 1/N, au uzito sawa, haikadirii chochote. Hii ndiyo sababu inastahimili pale makadirio yanapokuwa mabaya.
Je, uzito sawa (equal weight) unashinda kweli uboreshaji (optimization)?
Chini ya sharti moja mahususi, ndiyo. Hebu tuchambue istilahi hizi moja baada ya nyingine. Uzito sawa, unaoandikwa kama 1/N, hugawa mtaji kwa usawa katika nafasi N na hauhitaji utabiri wa aina yoyote. Uboreshaji wa wastani wa tofauti (mean variance optimization) hutafuta uzito wenye mapato bora yanayotarajiwa kwa kila kitengo cha tofauti inayokadiriwa (estimated variance). Vigezo vya Kelly (Kelly criterion) hutafuta uzito unaoongeza ukuaji wa faida ya mkusanyiko wa muda mrefu; katika mali zisizohusiana, jibu lake hupungua na kuwa uzito unaolingana na mapato ya ziada yanayotarajiwa ya kila mali yakigawanywa kwa tofauti yake. Mwongozo wetu wa ukubwa wa nafasi kulingana na vigezo vya Kelly unaelezea fomula hiyo kwa kina.
Waboreshaji wote wawili wanahitaji pembejeo moja: mapato yanayotarajiwa kwa kila mali. Hiyo ndiyo idadi ambayo sampuli huikadiria vibaya zaidi. Volatility hutokana na kipindi kifupi kwa usahihi unaokubalika. Wastani haufanyi hivyo, na pengo kati ya viwili hivyo ni kubwa vya kutosha kuonekana katika historia yoyote ya bei. Jopo hapa chini linachukua majina sita yanayoshikiliwa sana, linapima kila mwaka wa kalenda kuanzia 2015 hadi 2024 peke yake, na kuripoti umbali uliopo kati ya makadirio ya juu zaidi na ya chini zaidi ya kila mwaka. Hufanya hivyo mara mbili kwa kila jina: mara moja kwa wastani wa mapato ya kila siku yaliyopimwa kwa mwaka, na mara moja kwa volatility iliyopimwa kwa mwaka.
SQL halisi nyuma ya kila namba
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 DESCKwa NVDA, makadirio ya wastani ya kila mwaka yanatofautiana kwa 184.7 percentage points katika miaka hiyo kumi, dhidi ya 28.6 points za masafa katika makadirio ya volatility kwa jina hilohilo katika miaka hiyo hiyo. Jina thabiti zaidi katika jopo hili, KO, bado lilibadilisha makadirio yake ya wastani ya kila mwaka kwa 23.9 points. Mpango wowote unaopeleka wastani wa mapato ya mwaka jana kwa mboreshaji kama mapato yanayotarajiwa ya mwaka huu unaupa namba yenye mabadiliko makubwa kiasi hicho.
Unahitaji sampuli ya muda gani ili kukadiria mapato yanayotarajiwa?
Standard error ya wastani wa mapato yaliyokadiriwa ni volatility ya mali husika ikigawanywa kwa mzizi wa mraba wa urefu wa sampuli katika miaka. Katika miaka, si katika idadi ya vipimo; kuchukua sampuli ya miezi hiyo hiyo kumi na miwili kwa saa badala ya kila siku hakusaidii chochote. Weka mali yenye volatility ya asilimia ishirini katika fomula hiyo na mwaka mmoja wa historia utatoa standard error ya pointi ishirini za asilimia kwa mwaka. Miaka minne huipunguza hadi kumi. Kuishusha hadi pointi moja, usahihi ambao ungeutaka kabla ya kupanga mali mbili ambazo wastani wake halisi unatofautiana kwa pointi mbili, kunahitaji karne nne za data.
Volatility ni jambo tofauti. Usahihi wake huimarika kulingana na idadi ya vipimo badala ya muda wa kalenda, kwa hivyo miezi michache ya data ya kila siku tayari huiweka ndani ya pointi chache. Jopo hapa chini linagawanya mapato ya kila siku ya mfuko mmoja wa fahirisi wa miaka ishirini katika vizuizi visivyopishana vya urefu maalum, linahesabu makadirio yote mawili ndani ya kila kizuizi, na kuripoti jinsi makadirio hayo yanavyotawanyika kutoka kizuizi kimoja hadi kingine.
SQL halisi nyuma ya kila namba
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 ASCKatika vizuizi vya 21 sessions, makadirio ya wastani yanatawanyika katika 53.7 pointi za asilimia, dhidi ya 10.9 pointi kwa makadirio ya volatility yaliyopimwa kwenye vizuizi vinavyofanana. Panua kizuizi hadi 504 sessions na mtawanyiko wa wastani unapungua hadi 10.6 pointi. Unapungua kulingana na mzizi wa mraba: kila kupunguza kosa kwa nusu kunagharimu mara nne ya data.
Uigaji uliowekwa (seeded simulation) unaoweza kuufanya mwenyewe
Hakuna hata moja ya hayo inayothibitisha kuwa hitilafu ya makadirio ni kubwa kiasi cha kuipa ushindi 1/N. Hii ndiyo inayothibitisha. Mapishi haya yanahitaji usakinishaji wa Python pekee na si kingine: hakuna faili za data, hakuna vipakuliwa, wala vifurushi vya wahusika wengine. Inachora mapato yake yenyewe kutoka kwa vigezo unavyochagua, hivyo jibu sahihi linajulikana na mgao wote wawili unaweza kupimwa dhidi yake.
- Ingiza moduli mbili,
import randomnaimport statistics, pamoja nafrom math import log. Weka mbegu (seed) kwenye mstari unaofuata kwa kutumiarandom.seed(20260816). - Bainisha mali tano zenye mapato halisi yanayotarajiwa ya kila mwaka ya asilimia 5, 6, 7, 8 na 9, kila moja ikiwa na tete (volatility) halisi ya kila mwaka ya asilimia 20, bila uwiano. Badilisha hadi hatua ya kila siku kwa kutumia
mu_d = mu_a / 252nasd_d = sd_a / (252 ** 0.5). - Chagua urefu wa sampuli T kutoka kwenye mfululizo wa
[60, 125, 250, 500, 1000, 2500, 5000]. - Chora mapato ya kila siku ya T kwa kila mali kwa kutumia
random.gauss(mu_d, sd_d). Mchoro huo ndio historia nzima ambayo meneja anapata kuiona. - Kadiria wastani wa kila mali kwa kutumia
statistics.meanna tete yake kwa kutumiastatistics.stdev. Makadirio hayo mawili ndiyo yote ambayo optimizer anayajua. - Jenga kwingineko ya uzito sawa (equal weight portfolio) kwa kugawa 0.2 kwa kila moja ya mali hizo tano. Haitumii makadirio yoyote.
- Jenga kwingineko iliyoboreshwa (optimized portfolio) kwa kuweka kila uzito ghafi kuwa
mu_hat / (sd_hat ** 2), kisha gawanya kila uzito kwa jumla ya uzito ghafi kamili, jambo ambalo linaweka kwingineko zote mbili kwenye mfiduo sawa wa jumla (gross exposure). - Chora njia mpya ya nje ya sampuli ya mapato 2520 ya kila siku kwa kila mali kutoka kwa vigezo halisi. Hakuna mgao wowote uliouona.
- Pima zote mbili kwenye njia hiyo kwa wastani wa
log(1 + r), ambapo r ni jumla ya uzito wa mapato ya mali tano kwa siku hiyo. - Rudia hatua ya 4 hadi 9 kwa majaribio 2000 huru katika kila T, na urekodi sehemu ya majaribio ambayo uzito sawa unazidi uzito ulioboreshwa.
Soma mfululizo huo kutoka T fupi hadi T ndefu. Upande wa muda mfupi, uzito sawa unashinda idadi kubwa ya majaribio. Sehemu hiyo inashuka kwa kasi kadiri T inavyokua, na upande wa muda mrefu uzito ulioboreshwa unashinda mingi kati yao. Mahali fulani katikati, zote mbili zinavuka. Sehemu ya makutano inabadilika kulingana na mbegu na kulingana na tofauti (spread) kati ya wastani halisi. Mwelekeo haubadiliki: data zaidi inapendelea optimizer, data kidogo inapendelea 1/N. Ili kurudia, badilisha namba nzima iliyo ndani ya random.seed(20260816) na uendeshe mfululizo huo tena.
Kwa nini optimizer huongeza makadirio mabaya ya wastani (mean estimate)
Angalia mahali ambapo makadirio huingia kwenye uzito (weight). Wastani uliokadiriwa (estimated mean) uko kwenye namba ya juu (numerator), na variance iliyokadiriwa iko kwenye namba ya chini (denominator). Ukiongeza maradufu makadirio ya wastani, uzito huongezeka maradufu. Ukipunguza robo ya makadirio ya variance, uzito huongezeka kwa theluthi moja. Katika sampuli ya bahati, makosa yote mawili huelekea upande mmoja: mfululizo wa matokeo mazuri huinua wastani uliopimwa na mara nyingi hupunguza variance iliyopimwa katika kipindi hicho hicho. Optimizer huisoma mali hiyo kama bora zaidi katika kundi na kuipangia uzito ipasavyo. Nje ya sampuli, inakuwa mwanachama wa kawaida wa kundi tena. Equal weight haikuwahi kuona sampuli hiyo ya bahati.
Uigaji (simulation) ni toleo laini la tatizo hili. Mali tano zisizohusiana huacha diagonal covariance matrix isiyo na cha kupindua. Kwingineko halisi (real portfolios) zina uhusiano, na sampuli ya covariance matrix iliyojengwa kutoka kwa uchunguzi mchache zaidi ya mali inakaribia kuwa singular. Kuipindua (inverting) huzidisha makosa madogo ya pembejeo na kuwa uzito mkubwa sana, ndivyo optimizer inavyofikia nafasi yenye thamani ya mara kadhaa ya mtaji katika jina moja dhidi ya short inayofidia katika mbadala wake wa karibu. Ujumbe wetu kuhusu hatari ya mkusanyiko katika kwingineko unashughulikia kile ambacho aina hiyo ya uzito hufanya kwa drawdown.
Pembejeo haibaki tuli pia. Jopo hapa chini linafuatilia wastani wa mapato ya kila siku ya mwaka mmoja, yaliyofanywa ya kila mwaka na kupimwa kila mwezi, kwa mfuko mpana wa fahirisi (broad index fund) pamoja na jina kubwa la bidhaa za matumizi (consumer staples).
SQL halisi nyuma ya kila namba
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 ASCKila nukta kwenye mistari hiyo miwili ni namba ambayo optimizer yoyote ingeikubali kama mapato yanayotarajiwa (expected return) katika tarehe hiyo. Usomaji wa kwanza wa kila mwezi kwa SPY ni 17.7% na wa mwisho ni 25.8%, huku kukiwa na 96 usomaji katikati. KO huanza kipindi hicho hicho kwa -0.4%. Mfumo wa uzito unaotumia mfululizo huu mwezi kwa mwezi hurithi kila mtikisiko uliomo.
Je, mbinu ya half Kelly na shrinkage hutatua tatizo hili?
Hupunguza makali yake. Katika utendaji, kuna mbinu nne zinazojitokeza, na kila moja hupunguza sehemu ya faida ya kinadharia ili kupunguza unyeti wa makadirio.
- Half Kelly hupunguza kila uzito kwa nusu. Mstari wa ukuaji wa Kelly huwa tambarare karibu na kilele chake na mwinuko chini yake, hivyo dau la nusu hutoa sehemu ndogo ya kiwango cha ukuaji wa kinadharia huku likipunguza kwa kiasi kikubwa madhara ya makadirio ya faida yaliyotiwa chumvi. Volatility targeting hutumia silika hiyo hiyo kwa denominator, ikipanga ukubwa wa nafasi kulingana na kigezo kimoja ambacho sampuli fupi inaweza kutoa.
- Shrinkage huvuta kila wastani uliokadiriwa kuelekea wastani wa jumla wa makadirio hayo, kwa kiasi kinachoongezeka kadiri sampuli inavyopungua. Ukiifikisha kikomo, kila asset hubeba mapato yanayotarajiwa sawa; kwa volatilities sawa, optimizer kisha hutoa uzito sawa wenyewe. Uzito sawa ndio kwingineko iliyopunguzwa kikamilifu (fully shrunk portfolio).
- Vikwazo, kama vile kutokuruhusu shorting na kuweka ukomo kwa kila nafasi, huzuia makadirio moja ya bahati yasipandishe uzito wa asset moja kupita kiasi. Hii ni hatua ya kudhibiti uharibifu badala ya kuboresha makadirio yenyewe.
- Kuacha kabisa mapato yanayotarajiwa huacha mbinu ya minimum variance na risk parity, ambazo hutumia covariance pekee. Hicho ndicho kigezo ambacho sampuli inaweza kutoa kwa usahihi.
Hakuna hata moja kati ya mbinu hizi nne inayotengeneza taarifa ambayo haimo kwenye sampuli. Zinachobadilisha ni kiasi gani cha kwingineko kinachotegemea taarifa ambazo huenda huna.
Wakati uboreshaji unapolipa gharama zake
Mvukano huu hutokea pande zote mbili. Pindi T inapokuwa kubwa ikilinganishwa na spread kati ya wastani halisi, mgao ulioboreshwa huchukua nafasi ya mbele na kubaki hapo, na kadiri spread hiyo inavyokuwa pana, ndivyo inavyotokea mapema zaidi. Uboreshaji pia ni nyenzo sahihi wakati wowote data inapotolewa kama pembejeo: covariance na hedge ratios hukadiria vizuri zaidi kuliko expected returns.
Equal weight ina gharama zake. Inapuuza taarifa ulizonazo kikamilifu, na katika ulimwengu mdogo wa uwekezaji, inajikita kwa uzito mkubwa kama ambavyo optimizer yoyote ingefanya. Ichukulie kama msingi ambao uzito wowote wa mgawanyo unaopendekezwa lazima uushinde kwa kutumia data ambayo uzito huo haujawahi kuiona. Kurekebisha uzito na kuupima kwenye sampuli ileile ni look-ahead bias in backtesting iliyojivika kofia nyingine, na jambo hili humfanya optimizer aonekane bora kuliko uhalisia kila wakati. Kwa ajili ya kupata wigo wa kweli kuzunguka faida iliyopimwa badala ya makadirio ya sehemu moja, bootstrapped confidence intervals ndiyo nyenzo ya kawaida.
Maswali Yanayoulizwa Mara kwa Mara
Je, uzito sawa (equal weight) unashinda kweli uboreshaji wa mean variance?
Katika sampuli fupi, mara nyingi hufanya hivyo. Optimizer inahitaji makadirio ya mapato yanayotarajiwa ya kila asset, na makadirio hayo hubeba hitilafu ya kawaida (standard error) ya takribani volatility ya asset ikigawanywa na mzizi wa mraba wa urefu wa sampuli kwa miaka. Wakati hitilafu hiyo inabaki kubwa kuliko tofauti halisi kati ya assets, optimizer inachambua kelele (noise). Uzito sawa hauna makadirio ya kukosea.
Unahitaji machunguzo mangapi ili kukadiria mapato yanayotarajiwa?
Zaidi ya kile ambacho karibu kila mtu anacho. Kwa asset yenye volatility ya asilimia ishirini, mwaka mmoja wa data ya kila siku huacha hitilafu ya kawaida karibu na asilimia ishirini kwa mwaka, na kupunguza hitilafu hiyo kwa nusu kunahitaji muda wa kalenda mara nne zaidi. Kuongeza machunguzo ya ndani ya siku (intraday) ndani ya mwaka uleule hakusaidii. Volatility, kwa upande mwingine, inaweza kutumika kutoka kwa data ya miezi michache.
Je, nusu ya Kelly ni dau dogo tu?
Ni dau dogo kwa masharti nafuu. Mstari wa ukuaji wa Kelly ni tambarare karibu na kilele chake, kwa hivyo kupunguza dau kwa nusu kunapunguza sehemu ndogo ya kiwango cha ukuaji wa kinadharia huku ikipunguza takribani nusu ya volatility ya njia na kupunguza gharama ya makali (edge) yaliyotiwa chumvi.
Portfolio ya 1/N ni nini?
Ni portfolio inayoweka sehemu sawa ya mtaji katika kila nafasi kati ya N na kusawazisha upya (rebalance) kulingana na ratiba. Haihitaji utabiri wa mapato wala makadirio ya covariance, jambo ambalo huifanya kuwa benchmark ya kawaida kwa kila mpango wa uzito unaohitaji vitu hivyo.
Jinsi paneli zinavyojengwa
Paneli zote tatu husoma bei za kufunga za kila siku na kukokotoa mapato rahisi ya kufunga kwa kufunga, huku safu mlalo zinazorudiwa zikijumlishwa kuwa bei moja ya kufunga kwa kila ticker kwa kila tarehe. Wastani hufanywa kuwa wa kila mwaka kwa kuzidisha wastani wa mapato ya kila siku kwa vipindi 252; volatilities hufanywa kuwa za kila mwaka kwa kuzidisha mkengeuko wa kawaida (standard deviation) wa kila siku kwa mzizi wa mraba wa 252. Paneli ya kila mwaka huweka mwaka wa kalenda pale tu ambapo angalau vipindi 200 vipo. Paneli ya block hutumia blocks zisizoingiliana na kutupa block ya mwisho ya sehemu katika kila urefu, na safu wima ya idadi ya window inaonyesha ni blocks ngapi kila urefu ulizalisha. Hakuna dividends zinazojumuishwa popote, kwa hivyo haya ni mapato ya bei na kiwango cha wastani wowote kimepunguzwa kwa walipaji wa dividend. Tofauti ya makadirio ndiyo lengo la paneli, si kiwango.
Kila paneli hapa inabeba SQL kamili chini ya chati, na simulation inabeba seed yake. Ili kufanya ukaguzi uleule wa uthabiti wa makadirio katika orodha yako ya majina, iombe kwa Kiingereza rahisi kwenye terminal ya Strasmore.