Kendi Algoritmamızın İçinde: HRP + Long/Short + CVaR ve Hull-White
«12 Portföy Optimizasyon Algoritması, Karşılaştırmalı» başlıklı genel bakış yazımızda bir düzine tahsis yöntemini yan yana koşturduk. Bunların on biri ders kitabı klasikleri. On ikincisi, Pipeline, bize ait — ve o yazıda tam olarak tek bir madde hakkı bulabildi. Bu makale ise derinlemesine inceleme: içinde ne var, her formül nereden geliyor ve spesifikasyon Rust'a nasıl dönüşüyor.
Pipeline, ağırlık hesaplamak için yeni bir yöntem icat etmiyor. Bilinen en sağlam tarifi — Hiyerarşik Risk Paritesi (HRP) — alıyor ve gerçek bir canlı işlem hesabının ihtiyaç duyduğu ama saf HRP'nin sunmadığı iki katmanla sarıyor: yön (strateji sinyallerinden gelen long/short) ve sabit bir risk bütçesi (mevcut volatilite rejimine göre ayarlanmış CVaR). Bu dört aşama oluşturuyor.
Dört aşama
- I — her varlığın log getirileri.
- II — HRP'den temel ağırlıklar.
- III — ajan sinyallerinden gelen long/short bölünmesi; risk payları güven düzeyine göre belirlenir.
- IV — Hull-White volatilite düzeltmesiyle CVaR kontrolü; fazla risk nakde aktarılır.
Sırayla inceleyelim.
Aşama I. Log getiriler
Her şey fiyatlardan log getirilere geçişle başlar:
burada varlık, ise zaman adımıdır. Log getiriler zaman içinde birikir ve düz yüzde değişimlerine kıyasla daha simetrik bir dağılım sergiler — herhangi bir kovaryans hesabının standart girdisidir.
Aşama II. Temel olarak HRP
HRP, 2016 yılında Marcos López de Prado tarafından önerilmiş ve Ortalama-Varyans Optimizasyonu'nun temel hastalığını — kötü koşullu bir kovaryans matrisini ters çevirmeyi — tamamen bertaraf etmiştir. Matrisi hiç ters çevirmez. Bunun yerine korelasyonların yapısıyla çalışır.
Kovaryans ve korelasyon
Getirilerden kovaryans matrisi 'yı inşa eder ve onu korelasyon matrisi 'ye normalize ederiz:
Uzaklık matrisi
Korelasyonu, güçlü şekilde ilişkili varlıkların birbirine "yakın" konumlandığı bir uzaklık metriğine dönüştürürüz:
1'e ne kadar yakınsa, 0'a o kadar yakındır — ve bu varlıkların aynı kümeyi paylaşma olasılığı o kadar yüksektir.
Dendrogram ve yaprak sırası
Uzaklık matrisinden ortalama bağlantı yöntemiyle bir küme hiyerarşisi oluşturur ve yaprak sırasını okuruz — benzer varlıkların birbirine bitişik konumlandığı bir permütasyon.
İsteğe bağlı adım: optimal küme sayısı silhouette katsayısıyla seçilebilir; burada küme içi ortalama uzaklık, ise en yakın komşu kümeye ortalama uzaklıktır. Temel geçiş buna ihtiyaç duymaz — özyinelemeli ikiye bölme hiyerarşiye zaten saygı gösterir.
Yarı-köşegenleştirme
'nın satır ve sütunlarını 'ye göre permüte ederek büyük değerleri köşegen boyunca toplarız:
Özyinelemeli ikiye bölme
Ardından özyineleme yukarıdan aşağıya çalışır. Her adımda bir küme ve olmak üzere ikiye bölünür ve sermaye iki yarı arasında varyanslarıyla ters orantılı şekilde dağıtılır:
Bir kümenin varyansı, kovaryans alt bloğu üzerinde olarak hesaplanır. İniş, her düğüm tek bir varlık içerene kadar sürer. Ağırlıklar yalnızca long, negatif değer almaz ve toplamları 1.0'dır.
Uygulamamamızda bu, hrp_from_cov(cov) -> Vec<f64> fonksiyonudur: korelasyon → uzaklık → ortalama bağlantı → yaprak sırası → yarı-köşegenleştirme → özyinelemeli ikiye bölme. Pipeline bunu temel olarak kullanır — ve aynı zamanda sinyalsiz durum için genel optimize() fonksiyonudur.
Aşama III. Long/short katmanı
Saf HRP, "yalnızca alım" yapan bir portföydür. Ancak bir strateji çoğunlukla yalnızca ne kadar değil, hangi yönde olduğunu da söyler. Aşama III, ajandan varlık bazında sinyaller (Long/Short) alır ve iki alt portföy oluşturur.
- Varlıklar sinyale göre long ve short sepetlerine ayrılır.
- Her sepet içinde ağırlıklar, aynı HRP ile (o varlıkların kovaryans alt bloğu üzerinde) hesaplanır ve her sepet için toplamı 1 olacak şekilde normalize edilir.
- Ajan ayrıca bir güven düzeyi yayımlıyorsa, taraflar arasındaki risk payları toplam güven düzeyine göre belirlenir:
Güven düzeyi yoksa paylar, her sepetteki varlık sayısına geri döner. Nihai işaretli ağırlık; longlar için , shortlar için olur; ardından toplam brüt maruz kalma 1'e normalize edilir.
Kod hakkında dürüst bir not. Orijinal spesifikasyon , düzeltme faktörlerini taşır — ancak bunları "bu adıma gerçekten gerek var mı?" notiyla işaretler. Uygulama bu faktörleri uygulamaz: iki taraf doğrudan risk paylarıyla birleştirilir; bu sayede brüt maruz kalma tam olarak 1'de kalır ve gizli kaldıraç oluşmaz. Bu, spesifikasyonun kasıtlı bir basitleştirmesidir, bir gözden kaçırma değildir.
Aşama IV. Hull-White düzeltmesiyle CVaR
HRP riski yapısal olarak dengeler, ancak para cinsinden riskin mutlak düzeyi hakkında hiçbir şey bilmez. Son aşama, kuyruk riskine sert bir üst sınır koyar — ve bunu piyasa rejimindeki değişikliklere duyarlı hale getirir.
Portföy getirisi ve EWMA volatilitesi
Önce ağırlıkları bir portföy getirisine indirgeyip koşullu volatiliteyi EWMA ile tahmin ederiz:
(klasik RiskMetrics değeri) ile. EWMA, tüm tarih boyunca ortalaması alınan bir değer yerine "bugünün" volatilitesini verir.
Hull-White yeniden ölçeklendirme
Temel fikir: geçmiş getiriler olduğu gibi alınamaz — bunlar farklı bir volatilite altında gerçekleşti. Hull-White yöntemi, geçmişteki her getiriyi mevcut düzeye yeniden ölçekler:
Sakin bir ay "genişletilir", türbülanslı bir ay "sıkıştırılır" ve dağılım mevcut rejime taşınır.
VaR ve CVaR
Yeniden ölçeklendirilmiş dağılım üzerinde kayıp kantilini ve kuyruktaki ortalama kaybı alırız:
CVaR (Beklenen Açık olarak da bilinir), "tipik kötü bir gün ne kadar kötü" sorusunu değil, "en kötü yüzde genelinde ortalamada ne kadar kötü" sorusunu yanıtlar — böylece yalnızca kuyruğun ucunu değil, kalınlığını da görür.
Risk bütçesi ve nakit
CVaR kabul edilebilir eşiği aşarsa, her riskli pozisyon tek bir faktörle küçültülür ve serbest kalan sermaye nakde taşınır:
Böylece portföy, kuyruk riski arttığında riskini azaltır ve piyasa sakinleştiğinde yeniden girer.
Spesifikasyondan koda
Tüm algoritma tek bir Rust crate'inde, portfolio-pipeline'da yaşar ve çalışma alanının tekdüze sözleşmesine uyar:
pub fn optimize(prices: &[Vec<f64>]) -> Vec<f64>
Bu, yalnızca long projeksiyondur (sinyalsiz I, II, IV aşamaları) — diğer on bir algoritmayla aynı prices -> weights arayüzü; Pipeline, herhangi birinin doğrudan yerine geçebilir. Her aşamayla birlikte tam sürüm ayrı bir fonksiyondur:
pub fn run(
prices: &[Vec<f64>],
signals: Option<&[Side]>, // her varlık için Long / Short
confidence: Option<&[f64]>, // ajan güveni → risk payları λ
cfg: &PipelineConfig, // CVaR / Hull-White parametreleri
) -> PipelineResult // işaretli ağırlıklar + nakit + cvar + σ
Katman varsayılanları: kuyruk cvar_alpha = 0.05, bütçe cvar_max = 0.05, EWMA ewma_lambda = 0.94, Hull-White penceresi hw_window = 0 (tüm geçmiş). Uygulamanın harici bağımlılığı yoktur ve kasıtlı olarak savunmacı tasarlanmıştır: kısa geçmişlerde (4'ten az fiyat noktası) eşit ağırlıklar döndürür ve CVaR katmanı yalnızca ≥8 getiri gözleminde devreye girer — aksi takdirde bir kuyruk tahmin etmek için yeterli veri yoktur.
Neden Rust: araştırma ile üretimde tek bir deterministik kod tabanı; "araştırmada Python, üretimde başka bir şey" kaymasının önüne geçilir ve karşılaştırma arka ucu aracılığıyla tek bir istekte on iki algoritmanın tamamını çalıştıracak kadar hızlı.
Süre açısından maliyeti
"Yeterince hızlı" ne demek? HRP çekirdeğini (log getiriler → kovaryans → ortalama bağlantı → yarı-köşegenleştirme → özyinelemeli ağırlıklar) bağımsız bir karşılaştırma ölçütüne çektik ve tamamen aynı matematiği yedi dilde — C, C++, Rust, Zig, Python, Node.js ve Bun — özdeş koşullar altında çalıştırdık: Apple Silicon, tek iş parçacığı, varlık başına 365 günlük gözlem, sentetik fiyatlar, 10'dan 10.000'e kadar varlık sayısı .
Karmaşıklık hakkında birkaç söz; çünkü bu genel şekli belirliyor. Ortalama bağlantının ders kitabı versiyonu, her birleştirmede en yakın çifti bulmak için tam uzaklık matrisini yeniden tarar — bu 'tür ve birkaç bin varlıkta darboğaz haline gelir. Karşılaştırma ölçütü bunun yerine en yakın komşu zinciri algoritmasını (Müllner 2011) kullanır — SciPy'nin linkage(method='average') fonksiyonunun arkasındaki algoritmanın aynısı. Bu sayede kümeleme artık baskın aşama değildir: 'de yaklaşık 0,5 s'lik bir geçişin ~15 ms'si buna gider. Maliyet artık kovaryans matrisi, tarafından domine edilmektedir — hiçbir HRP tarzı yöntemin kaçınamayacağı tek aşama.
Çalıştırmaların gösterdiği sonuçlar (dil bazında tam tablolar ve tek komutla tekrar etme betiği proje deposunda yer alıyor):
- Gerçekçi portföylerde bedava. Bir kripto sepeti onlarca, nadiren yüzden fazla varlık içerir. 'de tam bir HRP geçişi, Node'da bile tek haneli milisaniyeler, Rust/C'de ise mikrosaniyeler düzeyindedir. Her tik'te ağırlıkları yeniden hesaplamak sorun değildir.
- Rust, C'nin ~1,0–1,3× içinde — aynı büyüklük sırası, ikisi de derlenmiş ve binlere ulaştığında pratikte eşit. C, ham aritmetikte biraz daha hızlı ancak Rust, çöp toplayıcı ve tanımsız davranış olmaksızın aynı öngörülebilirliği sunar.
- Binlerce varlığa ölçeklenir. bağlantıyla derlenmiş dillerde 'de tam geçiş ~0,5 s, 'de birkaç saniyedir; yorumlanan Node bile 'i iki saniyenin altında tamamlar. Artık tavanı belirleyen kümeleme değil, kovaryans aşamasıdır.
Pratik çıkarım: portföy boyutlarımızda Rust tercihinin sebebi "C'yi geçmek" değil (C burada biraz daha hızlı) — araştırma ve üretim için tek bir deterministik kod tabanı; GC duraklamaları yok, yıllarca performans başlık alanı. Sonuçlar ve tekrar etme betiğiyle birlikte yedi dilli tam karşılaştırma ölçütü proje deposunda açık kaynak olarak yayınlanmaktadır.
Pipeline'ın on iki algoritma arasındaki yeri
Tek (kasıtlı olarak kurgulanmış) bir sepet üzerindeki karşılaştırmamızda Pipeline, HRP gibi davrandı — çünkü yalnızca long optimize() giriş noktasından bakıldığında HRP + CVaR katmanıdır. Yönsel mekanizması yalnızca strateji sinyalleri beslendiğinde devreye girer. İşin özü bu: Pipeline, "geri test ağırlıkları için bir optimizatör daha" değil, strateji sinyalleri ile gerçek emirler arasındaki yürütme katmanıdır — al/sat çağrılarınızı alır, her tarafta HRP ile sermayeyi düzenler, tarafları güven düzeyine göre dengeler ve kuyruk riskini belirlenen bütçeye kırpar.
Diğer on bir yöntemin neler olduğu ve nasıl farklılaştığı hakkındaki tam bağlam için genel bakışa bakın: «12 Portföy Optimizasyon Algoritması, Karşılaştırmalı». Ve tamamını canlı olarak şurada deneyebilirsiniz: portfolio-optimizer.marketmaker.cc.
Kaynakça
- 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
Atıf
@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/tr/blog/post/portfolio-pipeline-hrp-cvar},
description = {Pipeline'ın derinlemesine incelemesi — sinyal güdümlü long/short katmanı ve Hull-White CVaR risk bütçesi düzeltmesiyle Hiyerarşik Risk Paritesi üzerine inşa edilmiş bileşik bir portföy tahsis algoritması; tam spesifikasyon ve Rust uygulaması.}
}
Yazarlar
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.