Біздің меншікті алгоритмнің ішінде: Hull-White көмегімен HRP + Long/Short + CVaR
📄 Бұл мақала зерттеу мақаласына айналды. Осы пайплайынның негізінде жатқан HRP аллокациясы белгілі ковариация жағдайында Markowitz, Ledoit-Wolf шринкеджі және 1/N-мен бақыланатын сынақта тексерілді (4 800 эксперимент). Мақаланы онлайн (интерактивті нұсқа + PDF) hrp.marketmaker.cc сайтынан оқыңыз, код пен деректер github.com/suenot/hrp-validation мекенжайында.
Біздің «12 портфельді оңтайландыру алгоритмі, салыстыру» шолуымызда біз ондаған аллокация әдістерін қатар сынадық. Оның он бірі — оқулық классикасы. Он екіншісі, Pipeline, — біздің меншігіміз, әрі ол сол мақалада тек бір ғана тармаққа ие болды. Бұл мақала — терең талдау: оның ішінде не бар, әр формула қайдан шыққан және спецификация қалай Rust кодына айналады.
Pipeline салмақты есептеудің жаңа тәсілін ойлап таппайды. Ол белгілі ең берік рецепт — Hierarchical Risk Parity (HRP) — алады да, оны нақты сауда шотына шынымен қажет, бірақ таза HRP-де жоқ екі қабатпен қаптайды: бағыт (стратегия сигналдарынан long/short) және қатаң тәуекел бюджеті (ағымдағы волатильділік режиміне сай түзетілген CVaR). Осылайша төрт кезең пайда болады.
Төрт кезең
- I — әр активтің логарифмдік кірістілігі.
- II — HRP-ден алынған негізгі салмақтар.
- III — агент сигналдарынан алынған long/short бөлінісі, тәуекел үлестері сенімділікпен белгіленеді.
- IV — Hull-White волатильділігімен CVaR түзетуі; артық тәуекел қолма-қол ақшаға ауысады.
Оларды ретімен қарастырайық.
I кезең. Логарифмдік кірістілік
Барлығы бағалардан логарифмдік кірістілікке көшуден басталады:
мұндағы — актив, — уақыт қадамы. Логарифмдік кірістіліктер уақыт бойынша қосылады және қарапайым пайыздық өзгерістерге қарағанда симметриялырақ — кез келген ковариациялық математика үшін стандартты кіріс.
II кезең. Іргетас ретінде HRP
Marcos López de Prado 2016 жылы ұсынған HRP Mean-Variance Optimization-нің басты кемшілігінен — нашар шартталған ковариация матрицасын инверсиялаудан — аулақ болады. Ол оны мүлдем инверсияламайды. Оның орнына корреляциялардың құрылымымен жұмыс істейді.
Ковариация және корреляция
Кірістіліктерден біз ковариация матрицасы құрамыз және оны корреляция матрицасы -ге қалыпқа келтіреміз:
Қашықтық матрицасы
Біз корреляцияны қашықтық метрикасына айналдырамыз, сол арқылы қатты корреляцияланған активтер "бір-біріне жақын" орналасады:
1-ге жақындаған сайын, 0-ге жақындайды — және активтердің бір кластерге кіру мүмкіндігі соғұрлым артады.
Дендрограмма мен жапырақ реті
Қашықтық матрицасынан біз average linkage арқылы кластерлер иерархиясын құрамыз және жапырақ ретін анықтаймыз — бұл ұқсас активтер бір-біріне жапсарлас орналасқан активтердің ауыстырылымы.
Қосымша қадам: кластерлердің оңтайлы санын силуэт коэффициенті арқылы таңдауға болады, мұндағы — кластер ішіндегі орташа қашықтық, ал — ең жақын көрші кластерге дейінгі орташа қашықтық. Негізгі өту оны қажет етпейді — рекурсивті бисекция иерархияны бұрыннан сақтайды.
Квази-диагоналдау
Біз -ның жолдары мен бағандарын бойынша ауыстырамыз, үлкен мәндерді диагональ бойымен жинақтаймыз:
Рекурсивті бисекция
Содан кейін рекурсия жоғарыдан төменге қарай жүреді. Әр қадамда кластер мен екі жартыға бөлінеді, ал капитал жартылар арасында олардың дисперсиясына кері пропорционал түрде бөлінеді:
Кластердің дисперсиясы оның ковариация ішкі блогында ретінде есептеледі. Түсу әр түйінде бір ғана актив қалғанша жалғасады. Салмақтар long-only, теріс емес, қосындысы 1,0-ге тең.
Біздің іске асыруда бұл — hrp_from_cov(cov) -> Vec<f64> функциясы: корреляция → қашықтық → average linkage → жапырақ реті → квази-диагоналдау → рекурсивті бисекция. Pipeline оны өзінің негізі ретінде шақырады — әрі бұл сигналсыз жағдай үшін көпшілікке ашық optimize() функциясы болып та табылады.
III кезең. Long/short үстеме қабаты
Таза HRP — "тек сатып алу" портфелі. Бірақ стратегия жиі қаншалықты ғана емес, қай бағытта екенін де айтады. III кезең агенттен әр активке арналған сигналдарды (Long/Short) алады және екі ішкі портфель құрады.
- Активтер сигнал бойынша long және short себеттеріне бөлінеді.
- Әр себет ішінде салмақтар сол HRP көмегімен (сол активтердің ковариация ішкі блогында) есептеледі, себет бойынша қосындысы 1-ге тең.
- Егер агент сенімділік мәнін де шығарса, жақтар арасындағы тәуекел үлестері жалпы сенімділікпен белгіленеді:
Сенімділік болмаған жағдайда үлестер әр себеттегі активтер санына оралады. Соңғы таңбалы салмақ longs үшін , shorts үшін , содан кейін жалпы жалпы экспозиция 1-ге қалыпқа келтіріледі.
Код туралы шыншыл ескерту. Бастапқы спецификацияда , түзету коэффициенттері бар — бірақ ол оларды "бізге бұл қадам шынымен керек пе?" деп те белгілейді. Іске асыру оларды қолданбайды: екі жақ тікелей тәуекел үлестерімен біріктіріледі, бұл жалпы экспозицияны дәл 1-де ұстайды және жасырын левередж тудырмайды. Бұл спецификацияның әдейі жасалған жеңілдетілуі, ұмыт кету емес.
IV кезең. Hull-White түзетуімен CVaR
HRP тәуекелді құрылымдық тұрғыдан теңестіреді, бірақ ақшалай мәндегі абсолютті тәуекел деңгейі туралы ешнәрсе білмейді. Соңғы кезең соңғы (tail) тәуекелге қатаң шек қояды — және оны нарық режимінің өзгеруіне сезімтал етеді.
Портфель кірістілігі және EWMA волатильділігі
Алдымен біз салмақтарды портфель кірістілігіне жинақтаймыз және шартты волатильділікті EWMA арқылы бағалаймыз:
мәнімен (классикалық RiskMetrics мәні). EWMA бүкіл тарихтан орташаланған емес, "бүгінгі" волатильділікті береді.
Hull-White қайта масштабтауы
Негізгі идея: өткен кірістіліктерді бар күйінде алуға болмайды — олар басқа волатильділік жағдайында болған. Hull-White әдісі әр өткен кірістілікті ағымдағы деңгейге қайта масштабтайды:
Тыныш ай "созылады", толқынды ай "сығылады", ал үлестірім ағымдағы режимге келтіріледі.
VaR және CVaR
Қайта масштабталған үлестірімде біз шығын квантилі мен соңдағы орташа шығынды аламыз:
CVaR (Expected Shortfall деп те аталады) "әдеттегі жаман күн қаншалықты жаман" деген сұраққа емес, "ең жаман пайызда орта есеппен қаншалықты жаман" деген сұраққа жауап береді — сондықтан ол соңы шетін ғана емес, оның қалыңдығын да көреді.
Тәуекел бюджеті және қолма-қол ақша
Егер CVaR қолайлы шектен асып кетсе, әрбір тәуекелді позиция бір коэффициентпен қысқарады, ал босаған капитал қолма-қол ақшаға өтеді:
Осылайша соңдағы тәуекел өскенде портфель өз тәуекелін азайтады, ал ол тынышталғанда нарыққа қайта оралады.
Спецификациядан кодқа дейін
Бүкіл алгоритм бір ғана Rust crate-інде, portfolio-pipeline, орналасады және жұмыс кеңістігінің біртұтас келісіміне бағынады:
pub fn optimize(prices: &[Vec<f64>]) -> Vec<f64>
Бұл — long-only проекция (сигналсыз I, II, IV кезеңдер) — қалған он бір алгоритммен бірдей prices -> weights интерфейсі, сондықтан Pipeline олардың кез келгенін тікелей алмастыра алады. Әр кезеңі бар толық нұсқа жеке функция болып табылады:
pub fn run(
prices: &[Vec<f64>],
signals: Option<&[Side]>, // Long / Short per asset
confidence: Option<&[f64]>, // agent confidence → risk shares λ
cfg: &PipelineConfig, // CVaR / Hull-White parameters
) -> PipelineResult // signed weights + cash + cvar + σ
Үстеме қабаттың әдепкі мәндері: соңы cvar_alpha = 0.05, бюджет cvar_max = 0.05, EWMA ewma_lambda = 0.94, Hull-White терезесі hw_window = 0 (бүкіл тарих). Іске асыруда сыртқы тәуелділіктер жоқ және ол әдейі сақтық танытады: қысқа тарихта (4-тен аз баға нүктесі) ол тең салмақтарды қайтарады, ал CVaR үстеме қабаты тек ≥8 кірістілік бақылауынан бастап қосылады — әйтпесе соңды бағалайтын ештеңе жоқ.
Неге Rust: бэктест пен өндіріс үшін бір ғана детерминистік кодтық база, "зерттеуде Python, өндірісте бірдеңе басқа" деген ауытқусыз, әрі он екі алгоритмнің барлығын салыстыру бэкенді арқылы бір сұраныста жүргізе алатындай жылдам.
Уақыт бойынша қанша тұрады
"Жеткілікті жылдам" деген қаншалықты жылдам? Біз HRP ядросын (логарифмдік кірістілік → ковариация → average linkage → квази-диагоналдау → рекурсивті салмақтар) дербес бенчмаркқа бөліп алдық және дәл сол математиканы бірдей жағдайларда жеті тілде — C, C++, Rust, Zig, Python, Node.js және Bun — жүргіздік: Apple Silicon, бір ағын, актив басына 365 күндік бақылау, синтетикалық бағалар, актив саны 10-нан 10 000-ға дейін.
Күрделілік туралы бір сөз, өйткені ол бүкіл пішінді анықтайды. average linkage-тің оқулықтағы нұсқасы әр біріктіру кезінде ең жақын жұпты іздеу үшін қашықтық матрицасын толығымен қайта қарайды — бұл , әрі бірнеше мың активте кедергіге айналады. Бенчмарк оның орнына nearest-neighbour-chain алгоритмін (Müllner 2011) қолданады — бұл SciPy-дың linkage(method='average') артындағы дәл сол алгоритм. Осымен кластерлеу енді басым кезең емес: кезінде ~0,5 с өтуден ~15 мс ғана. Шығын енді ковариация матрицасымен, , басым — бұл HRP тәрізді ешбір әдіс аулақ бола алмайтын жалғыз кезең.
Жүргізулер не көрсетеді (әр тіл бойынша толық кестелер мен бір командалық репродукция скрипті жоба репозиторийінде жатыр):
- Шынайы портфельдерде бұл тегін. Крипто себеті ондаған активтен тұрады, жүзден асатыны сирек. кезінде толық HRP өтуі тіпті Node-де бір таңбалы миллисекунд, ал Rust/C-де микросекунд құрайды. Әр тикте салмақтарды қайта есептеу проблема емес.
- Rust C-ден ~1,0–1,3× шамасында ғана артта қалады — бірдей ретті шама, екеуі де компиляцияланған, әрі мыңдарға жеткенде іс жүзінде теңеседі. Таза арифметикада C сәл жылдамырақ, бірақ Rust қоқыс жинаушысыз және UB-сыз дәл сондай болжамдылықты береді.
- Ол мыңдаған активке дейін масштабталады. linkage-мен толық өту компиляцияланған тілдерде кезінде ~0,5 с, ал кезінде бірнеше секунд құрайды; интерпретацияланған Node тіпті -ды екі секундтан аз уақытта өтеді. Енді шекті ковариация кезеңі белгілейді, кластерлеу емес.
Прагматикалық қорытынды: біздің портфель өлшемдерінде Rust таңдау "C-ден озу" туралы емес (мұнда C сәл жылдамырақ) — бұл зерттеу мен өндіріс үшін бір детерминистік кодтық база, GC үзілістерінсіз және көп жылдық өнімділік қоры туралы. Нәтижелер мен репродукция скрипті бар жеті тілдің толық бенчмаркі жоба репозиторийінде ашық жатыр.
Pipeline он екеудің арасында қайда орналасады
Бір ғана (әдейі дайындалған) себетке жасалған салыстыруымызда Pipeline HRP сияқты әрекет етті — өйткені long-only optimize() кіру нүктесі арқылы ол CVaR үстеме қабаты бар HRP болып табылады. Оның бағыттық механизмі тек стратегия сигналдары берілгенде ғана жанданады. Бүкіл мән осында: Pipeline "салмақтарды бэктестеуге арналған тағы бір оптимизатор" емес, ол стратегия сигналдары мен нақты бұйрықтар арасындағы орындау қабаты — ол сіздің сатып алу/сату шешімдеріңізді алады, әр жақ ішінде капиталды HRP бойынша орналастырады, жақтарды сенімділікпен теңестіреді, әрі соңдағы тәуекелді белгіленген бюджетке дейін қияды.
Толық контекст үшін — қалған он бір әдіс қандай және олар қалай ерекшеленеді — шолуды қараңыз, «12 портфельді оңтайландыру алгоритмі, салыстыру». Әрі мұның бәрін portfolio-optimizer.marketmaker.cc сайтында тікелей сынап көре аласыз.
Дереккөздер
- López de Prado, M. (2016). Building Diversified Portfolios that Outperform Out of Sample. The Journal of Portfolio Management.
- López de Prado, M. (2018). Advances in Financial Machine Learning. Wiley.
- Hull, J., & White, A. (1998). Incorporating Volatility Updating into the Historical Simulation Method for Value at Risk. Journal of Risk.
- Rockafellar, R. T., & Uryasev, S. (2000). Optimization of Conditional Value-at-Risk. Journal of Risk.
- RiskMetrics Group (1996). RiskMetrics — Technical Document. J.P. Morgan.
- Marketmaker.cc: marketmaker.cc
Дәйексөз
@article{soloviov2026pipeline,
author = {Soloviov, Eugen and Zhuravleva, Marina and Kiselev, Kirill},
title = {Inside Our House Algorithm: HRP + Long/Short + CVaR with Hull-White Adjustment},
year = {2026},
url = {https://marketmaker.cc/kk/blog/post/portfolio-pipeline-hrp-cvar},
description = {A deep dive into Pipeline, a composite portfolio allocation algorithm built on Hierarchical Risk Parity with a signal-driven long/short overlay and a Hull-White CVaR risk-budget correction, with the full specification and its Rust implementation.}
}
Authors
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.
Financial mathematics
Fifth-year student at Bauman Moscow State Technical University (Automatic Control Systems), specializing in financial mathematics. Background in calibrating stochastic-volatility (Heston) and local-volatility (Dupire) models, fair pricing of options including exotics via both Monte-Carlo and analytic formulas, hedging-error reduction, and exposure to LSV models.
Portfolio optimization
Fourth-year student at the Faculty of Mechanics and Mathematics, Novosibirsk State University (NSU); thesis on Heston-model calibration and delta-hedging within the same model. Works on portfolio optimization.