我們的內部演算法揭秘:HRP + 多空 + 基於Hull-White的CVaR
在我們的概述文章《12種投資組合最佳化演算法比較》中,我們並排比較了十幾種配置方法。其中十一種是教科書經典演算法。第十二種,Pipeline,是我們自己的演算法——在那篇文章中它只佔了一個要點。本文將深入探討:它內部是什麼,每個公式的來源,以及如何將規範轉化為Rust程式碼。
Pipeline並沒有發明一種新的計算權重的方法。它採用了最穩健的已知方法——分層風險平價(HRP)——並將其封裝在實際交易賬戶所需、而普通HRP所缺乏的兩個層中:方向(來自策略訊號的多空)和硬性風險預算(根據當前波動率狀態調整的CVaR)。這形成了四個階段。
四個階段
- I — 每種資產的對數收益率。
- II — HRP的基礎權重。
- III — 來自代理訊號的多空拆分,風險份額由置信度設定。
- IV — 帶有Hull-White波動率的CVaR修正;多餘的風險轉為現金。
讓我們按順序逐一介紹。
階段I. 對數收益率
一切都始於從價格到對數收益率的轉換:
其中是資產,是時間步長。對數收益率隨時間累加,並且比簡單的百分比變化更對稱——這是任何協方差計算的標準輸入。
階段II. HRP作為基礎
HRP由Marcos López de Prado於2016年提出,它避開了均值-方差最佳化(Mean-Variance Optimization)的核心弊病——對病態協方差矩陣求逆。它根本不求逆。相反,它處理的是相關性的結構。
協方差和相關性
從收益率中,我們構建協方差矩陣並將其標準化為相關矩陣:
距離矩陣
我們將相關性轉化為距離度量,使得強相關的資產“緊密相連”:
越接近1,則越接近0——資產共享一個聚類的可能性越大。
樹狀圖和葉序
從距離矩陣中,我們通過平均連結法構建聚類層次結構,並讀取葉序 ——一個資產的排列,其中相似的資產相鄰。
可選步驟:最佳聚類數量可以通過輪廓係數 來選擇,其中是聚類內的平均距離,是到最近鄰聚類的平均距離。基本過程不需要它——遞迴二分法已經尊重了層次結構。
準對角化
我們通過置換的行和列,將大值聚集在對角線上:
遞迴二分法
然後遞迴自上而下執行。在每一步中,一個聚類被分成兩半和,資本在兩半之間分配,與它們的方差成反比:
一個聚類的方差在其協方差子塊上計算為。下降持續進行,直到每個節點只包含一個資產。權重是隻做多、非負的,總和為1.0。
在我們的實現中,這是函數hrp_from_cov(cov) -> Vec<f64>:相關性 → 距離 → 平均連結 → 葉序 → 準對角化 → 遞迴二分法。Pipeline將其作為基礎呼叫——它也是無訊號情況下的公共optimize()函數。
階段III. 多空疊加
普通的HRP是一個“只買入”的投資組合。但策略通常不僅說明多少,還說明方向。階段III從代理獲取每資產訊號(Long/Short),並構建兩個子投資組合。
- 資產根據訊號分為多頭和空頭籃子。
- 在每個籃子內部,權重用相同的HRP(在這些資產的協方差子塊上)計算,每個籃子總和為1。
- 如果代理還發出置信度 ,則兩側之間的風險份額由總置信度設定:
如果沒有置信度,份額將回落到每個籃子中的資產數量。最終的帶符號權重對於多頭是,對於空頭是,之後整個總敞口被標準化為1。
關於程式碼的誠實說明。 原始規範包含修正因子, ——但它也用“我們是否需要這一步?”標記了它們。實現中沒有應用它們:兩邊直接通過風險份額組合,這使得總敞口恰好為1,並且沒有產生隱藏槓桿。這是對規範的有意簡化,而不是疏忽。
階段IV. 帶有Hull-White調整的CVaR
HRP在結構上平衡風險,但對以貨幣計的絕對風險水平一無所知。最後階段對尾部風險設定了硬性上限——並使其對市場狀態的變化敏感。
投資組合收益和EWMA波動率
首先,我們將權重合併為投資組合收益,並用EWMA估計條件波動率:
其中(經典的RiskMetrics值)。EWMA給出的是“今天的”波動率,而不是所有歷史的平均值。
Hull-White重標度
關鍵思想:過去的收益不能照單全收——它們發生在不同的波動率下。Hull-White方法將每個過去的收益重標度到當前水平:
平靜的月份被“拉伸”,動盪的月份被“壓縮”,分佈被帶入當前狀態。
VaR和CVaR
在重標度分佈上,我們取損失分位數和尾部的平均損失:
CVaR(又稱預期短缺)回答的不是“一個典型的糟糕日子有多糟糕”,而是“在最糟糕的百分比中平均有多糟糕”——因此它看到了尾部的厚度,而不僅僅是它的邊緣。
風險預算和現金
如果CVaR超過可接受的閾值,每個風險頭寸都會按單一因子縮小,釋放的資本轉為現金:
因此,當尾部風險增加時,投資組合會自行去風險,當風險平靜下來時,它會重新進入市場。
從規範到程式碼
整個演算法存在於一個Rust crate中,portfolio-pipeline,並遵循工作區的統一契約:
pub fn optimize(prices: &[Vec<f64>]) -> Vec<f64>
這是隻做多投影(階段I、II、IV,無訊號)——與另外十一種演算法完全相同的prices -> weights介面,因此Pipeline可以替代其中任何一種。包含所有階段的完整版本是一個單獨的函數:
pub fn run(
prices: &[Vec<f64>],
signals: Option<&[Side]>, // 每资产的多/空
confidence: Option<&[f64]>, // 代理置信度 → 风险份额 λ
cfg: &PipelineConfig, // CVaR / Hull-White 参数
) -> PipelineResult // 带符号权重 + 现金 + 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核心(對數收益率 → 協方差 → 平均連結 → 準對角化 → 遞迴權重)提取到一個獨立的基準測試中,並在七種語言——C、C++、Rust、Zig、Python、Node.js 和 Bun——上運行了完全相同的數學運算,條件完全一致:Apple Silicon,單執行緒,每資產365個每日觀測值,合成價格,資產數量從10到10,000。
先說一句複雜度,因為它決定了整體形態。教科書版本的平均連結在每次合併時都會重新掃描整個距離矩陣以尋找最近的一對——這是,在數千種資產時會成為瓶頸。本基準測試改用**最近鄰鏈演算法(Müllner 2011)——也就是SciPy的linkage(method='average')背後所採用的同一種演算法。有了它,聚類不再是主導階段:在時,它在約0.5秒的全過程中只佔約15毫秒。如今成本由協方差矩陣,**主導——這是任何HRP式方法都無法迴避的唯一階段。
執行結果表明(完整的分語言表格和一條命令即可復現的指令碼見專案倉庫):
- 在實際投資組合中,它是免費的。 一個加密貨幣籃子有幾十種資產,很少超過一百種。當時,即使在Node中,完整的HRP過程也只需個位數毫秒,在Rust/C中只需微秒。在每個tick上重新計算權重不是問題。
- Rust與C的效能差距約為1.0–1.3倍——處於同一數量級,兩者都是編譯的,一旦達到數千級便實際上不分伯仲。C在原始算術上稍快,但Rust提供了相同的可預測性,沒有垃圾回收器,也沒有未定義行為。
- 它可擴充到數千種資產。 在連結下,編譯型語言中完整過程在時約為0.5秒,在時為幾秒;即使是解釋執行的Node也能在兩秒內跑完。如今決定上限的是協方差階段,而不是聚類。
實用的結論是:在我們的投資組合規模下,選擇Rust並非為了“超越C”(C在這裡稍快)——而是為了研究和生產使用一個確定性的程式碼庫,沒有GC暫停,並擁有多年的效能提升空間。完整的七語言基準測試,連同結果和復現指令碼,在專案倉庫中是開源的。
Pipeline在十二種演算法中的位置
在我們對一個單一(刻意設計)籃子的比較中,Pipeline的行為類似於HRP——因為通過只做多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/zh/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.