← 返回文章列表
May 25, 2026
5 分鐘閱讀

我們的內部演算法揭秘:HRP + 多空 + 基於Hull-White的CVaR

我們的內部演算法揭秘:HRP + 多空 + 基於Hull-White的CVaR
#投資組合最佳化
#HRP
#分層風險平價
#CVaR
#Hull-White
#EWMA
#多空
#風險管理
#Rust
#量化金融
📊
Part 3 of 5 · Collection
Portfolio Construction & Risk

在我們的概述文章《12種投資組合最佳化演算法比較》中,我們並排比較了十幾種配置方法。其中十一種是教科書經典演算法。第十二種,Pipeline,是我們自己的演算法——在那篇文章中它只佔了一個要點。本文將深入探討:它內部是什麼,每個公式的來源,以及如何將規範轉化為Rust程式碼。

Pipeline並沒有發明一種新的計算權重的方法。它採用了最穩健的已知方法——分層風險平價(HRP)——並將其封裝在實際交易賬戶所需、而普通HRP所缺乏的兩個層中:方向(來自策略訊號的多空)和硬性風險預算(根據當前波動率狀態調整的CVaR)。這形成了四個階段。

四個階段

prices  I  log returns  II  HRP weights  III  long/short  IV  CVaR budget\text{prices} \;\xrightarrow{\text{I}}\; \text{log returns} \;\xrightarrow{\text{II}}\; \text{HRP weights} \;\xrightarrow{\text{III}}\; \text{long/short} \;\xrightarrow{\text{IV}}\; \text{CVaR budget}
  • I — 每種資產的對數收益率。
  • II — HRP的基礎權重。
  • III — 來自代理訊號的多空拆分,風險份額由置信度設定。
  • IV — 帶有Hull-White波動率的CVaR修正;多餘的風險轉為現金。

讓我們按順序逐一介紹。

階段I. 對數收益率

一切都始於從價格到對數收益率的轉換:

ri,t=ln ⁣(Si,tSi,t1)r_{i,t} = \ln\!\left(\frac{S_{i,t}}{S_{i,t-1}}\right)

其中ii是資產,tt是時間步長。對數收益率隨時間累加,並且比簡單的百分比變化更對稱——這是任何協方差計算的標準輸入。

階段II. HRP作為基礎

HRP由Marcos López de Prado於2016年提出,它避開了均值-方差最佳化(Mean-Variance Optimization)的核心弊病——對病態協方差矩陣求逆。它根本不求逆。相反,它處理的是相關性的結構

協方差和相關性

從收益率中,我們構建協方差矩陣Σ\Sigma並將其標準化為相關矩陣CC

Σi,j=Cov(ri,rj),Ci,j=ρi,j=Cov(ri,rj)σiσj\Sigma_{i,j} = \mathrm{Cov}(r_i, r_j), \qquad C_{i,j} = \rho_{i,j} = \frac{\mathrm{Cov}(r_i, r_j)}{\sigma_i \sigma_j}

距離矩陣

我們將相關性轉化為距離度量,使得強相關的資產“緊密相連”:

di,j=1ρi,j2d_{i,j} = \sqrt{\frac{1 - \rho_{i,j}}{2}}

ρi,j\rho_{i,j}越接近1,則di,jd_{i,j}越接近0——資產共享一個聚類的可能性越大。

樹狀圖和葉序

從距離矩陣中,我們通過平均連結法構建聚類層次結構,並讀取葉序 π=(π1,,πN)\pi = (\pi_1, \ldots, \pi_N)——一個資產的排列,其中相似的資產相鄰。

可選步驟:最佳聚類數量可以通過輪廓係數 si=biaimax(bi,ai)s_i = \dfrac{b_i - a_i}{\max(b_i, a_i)}來選擇,其中aia_i是聚類內的平均距離,bib_i是到最近鄰聚類的平均距離。基本過程不需要它——遞迴二分法已經尊重了層次結構。

準對角化

我們通過π\pi置換Σ\Sigma的行和列,將大值聚集在對角線上:

Σi,jq=Σπi,πj\Sigma^{q}_{i,j} = \Sigma_{\pi_i, \pi_j}

遞迴二分法

然後遞迴自上而下執行。在每一步中,一個聚類被分成兩半LLRR,資本在兩半之間分配,與它們的方差成反比

wL=1/σL21σL2+1σR2,wR=1wLw_L = \frac{1/\sigma_L^2}{\dfrac{1}{\sigma_L^2} + \dfrac{1}{\sigma_R^2}}, \qquad w_R = 1 - w_L

一個聚類的方差在其協方差子塊上計算為σC2=1m2i,jCΣi,jq\sigma_C^2 = \tfrac{1}{m^2}\sum_{i,j \in C}\Sigma^{q}_{i,j}。下降持續進行,直到每個節點只包含一個資產。權重是隻做多、非負的,總和為1.0。

在我們的實現中,這是函數hrp_from_cov(cov) -> Vec<f64>:相關性 → 距離 → 平均連結 → 葉序 → 準對角化 → 遞迴二分法。Pipeline將其作為基礎呼叫——它也是無訊號情況下的公共optimize()函數。

階段III. 多空疊加

普通的HRP是一個“只買入”的投資組合。但策略通常不僅說明多少,還說明方向。階段III從代理獲取每資產訊號(Long/Short),並構建兩個子投資組合。

  1. 資產根據訊號分為多頭和空頭籃子。
  2. 每個籃子內部,權重用相同的HRP(在這些資產的協方差子塊上)計算,每個籃子總和為1。
  3. 如果代理還發出置信度 pip_i,則兩側之間的風險份額由總置信度設定:

ξL=iLpi,ξS=iSpi,λL=ξLξL+ξS,λS=ξSξL+ξS\xi_L = \sum_{i \in L} p_i, \quad \xi_S = \sum_{i \in S} p_i, \qquad \lambda_L = \frac{\xi_L}{\xi_L + \xi_S}, \quad \lambda_S = \frac{\xi_S}{\xi_L + \xi_S}

如果沒有置信度,份額將回落到每個籃子中的資產數量。最終的帶符號權重對於多頭是wi=λLwiHRPw_i = \lambda_L \cdot w_i^{\text{HRP}},對於空頭是wi=λSwiHRPw_i = -\lambda_S \cdot w_i^{\text{HRP}},之後整個總敞口被標準化為1。

關於程式碼的誠實說明。 原始規範包含修正因子αL=λL/σL\alpha_L = \sqrt{\lambda_L}/\sigma_L, αS=λS/σS\alpha_S = \sqrt{\lambda_S}/\sigma_S——但它也用“我們是否需要這一步?”標記了它們。實現中沒有應用它們:兩邊直接通過風險份額λ\lambda組合,這使得總敞口恰好為1,並且沒有產生隱藏槓桿。這是對規範的有意簡化,而不是疏忽。

階段IV. 帶有Hull-White調整的CVaR

HRP在結構上平衡風險,但對以貨幣計的絕對風險水平一無所知。最後階段對尾部風險設定了硬性上限——並使其對市場狀態的變化敏感。

投資組合收益和EWMA波動率

首先,我們將權重合併為投資組合收益,並用EWMA估計條件波動率:

rp,t=i=1nwiri,t,σp,t2=λσp,t12+(1λ)rp,t12r_{p,t} = \sum_{i=1}^{n} w_i\, r_{i,t}, \qquad \sigma_{p,t}^2 = \lambda\, \sigma_{p,t-1}^2 + (1 - \lambda)\, r_{p,t-1}^2

其中λ=0.94\lambda = 0.94(經典的RiskMetrics值)。EWMA給出的是“今天的”波動率,而不是所有歷史的平均值。

Hull-White重標度

關鍵思想:過去的收益不能照單全收——它們發生在不同的波動率下。Hull-White方法將每個過去的收益重標度到當前水平:

r~p,s=σp,t+1σp,srp,s,s=tN+1,,t\widetilde{r}_{p,s} = \frac{\sigma_{p,t+1}}{\sigma_{p,s}}\, r_{p,s}, \qquad s = t - N + 1, \ldots, t

平靜的月份被“拉伸”,動盪的月份被“壓縮”,分佈被帶入當前狀態。

VaR和CVaR

在重標度分佈上,我們取損失分位數和尾部的平均損失:

VaRαHW=q1α(r~p)VaR_\alpha^{HW} = -q_{1-\alpha}(\widetilde{r}_p)

CVaRαHW=E ⁣[r~pr~pq1α(r~p)]CVaR_\alpha^{HW} = -\mathbb{E}\!\left[\widetilde{r}_p \mid \widetilde{r}_p \le q_{1-\alpha}(\widetilde{r}_p)\right]

CVaR(又稱預期短缺)回答的不是“一個典型的糟糕日子有多糟糕”,而是“在最糟糕的α\alpha百分比中平均有多糟糕”——因此它看到了尾部的厚度,而不僅僅是它的邊緣。

風險預算和現金

如果CVaR超過可接受的閾值,每個風險頭寸都會按單一因子縮小,釋放的資本轉為現金:

winew=γwi,γ=CVaRmaxCVaRαHW,wcash=1i=1nwineww_i^{new} = \gamma\, w_i, \quad \gamma = \frac{CVaR_{\max}}{CVaR_\alpha^{HW}}, \qquad w_{cash} = 1 - \sum_{i=1}^{n} |w_i^{new}|

因此,當尾部風險增加時,投資組合會自行去風險,當風險平靜下來時,它會重新進入市場。

從規範到程式碼

整個演算法存在於一個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個每日觀測值,合成價格,資產數量NN從10到10,000。

先說一句複雜度,因為它決定了整體形態。教科書版本的平均連結在每次合併時都會重新掃描整個距離矩陣以尋找最近的一對——這是O(N3)O(N^3),在數千種資產時會成為瓶頸。本基準測試改用**O(N2)O(N^2)最近鄰鏈演算法(Müllner 2011)——也就是SciPy的linkage(method='average')背後所採用的同一種演算法。有了它,聚類不再是主導階段:在N=2000N = 2000時,它在約0.5秒的全過程中只佔約15毫秒。如今成本由協方差矩陣,O(N2T)O(N^2 \cdot T)**主導——這是任何HRP式方法都無法迴避的唯一階段。

執行結果表明(完整的分語言表格和一條命令即可復現的指令碼見專案倉庫):

  • 在實際投資組合中,它是免費的。 一個加密貨幣籃子有幾十種資產,很少超過一百種。當N100N \le 100時,即使在Node中,完整的HRP過程也只需個位數毫秒,在Rust/C中只需微秒。在每個tick上重新計算權重不是問題。
  • Rust與C的效能差距約為1.0–1.3倍——處於同一數量級,兩者都是編譯的,一旦NN達到數千級便實際上不分伯仲。C在原始算術上稍快,但Rust提供了相同的可預測性,沒有垃圾回收器,也沒有未定義行為。
  • 它可擴充到數千種資產。O(N2)O(N^2)連結下,編譯型語言中完整過程在N=2000N = 2000時約為0.5秒,在N=5000N = 5000時為幾秒;即使是解釋執行的Node也能在兩秒內跑完N=2000N = 2000。如今決定上限的是協方差階段,而不是聚類。

實用的結論是:在我們的投資組合規模下,選擇Rust並非為了“超越C”(C在這裡稍快)——而是為了研究和生產使用一個確定性的程式碼庫,沒有GC暫停,並擁有多年的效能提升空間。完整的七語言基準測試,連同結果和復現指令碼,在專案倉庫中是開源的。

Pipeline在十二種演算法中的位置

在我們對一個單一(刻意設計)籃子的比較中,Pipeline的行為類似於HRP——因為通過只做多optimize()入口點,它就是帶有CVaR疊加的HRP。它的方向性機制只有在你向它輸入策略訊號時才會啟用。這正是重點:Pipeline不是“又一個用於回測權重的最佳化器”,而是策略訊號與真實訂單之間的執行層——它接收你的買/賣指令,在每側內部通過HRP分配資本,通過置信度平衡兩側,並將尾部風險限制在設定的預算內。

要了解完整背景——其他十一種方法是什麼以及它們有何不同——請參閱概述文章《12種投資組合最佳化演算法比較》。你可以在portfolio-optimizer.marketmaker.cc上即時嘗試所有這些功能。

參考文獻

  1. López de Prado, M. (2016). Building Diversified Portfolios that Outperform Out of Sample. The Journal of Portfolio Management.
  2. López de Prado, M. (2018). Advances in Financial Machine Learning. Wiley.
  3. Hull, J., & White, A. (1998). Incorporating Volatility Updating into the Historical Simulation Method for Value at Risk. Journal of Risk.
  4. Rockafellar, R. T., & Uryasev, S. (2000). Optimization of Conditional Value-at-Risk. Journal of Risk.
  5. RiskMetrics Group (1996). RiskMetrics — Technical Document. J.P. Morgan.
  6. 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

Eugen Soloviov
Eugen Soloviov

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.

Marina Zhuravleva
Marina Zhuravleva

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.

Kirill Kiselev
Kirill Kiselev

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.

Newsletter

緊跟市場步伐

訂閱我們的時事通訊,獲取獨家 AI 交易見解、市場分析和平台更新。

我們尊重您的隱私。您可以隨時退訂。