Quantitative Strategy White Paper · 技术白皮书

贝叶斯全球精选股票:贝叶斯优化驱动的多因子策略

以 50 只成熟美股为标的宇宙,32 个精选因子经前瞻 IC 评估、动态层次聚类与 Löwdin 正交化合成单一 alpha 信号,滚动调仓;风险预算由贝叶斯优化统一统筹——波动率目标、压力态降仓与回撤护栏均纳入同一概率框架。本白皮书从因子定义到下单执行逐环节给出数学定义与真实回测证据。

策略架构 v3.0 贝叶斯优化(GATE_TYPE=bayes)
+46.0%
官方回测 CAGR(含贝叶斯优化风控)
2.03
Sharpe 比率
-22.05%
最大回撤(无风控基线 -33.1%)
2.09
Calmar 比率
§1

基金思想与总体架构

Philosophy & Architecture

一句话定位:用「同一套动态多因子引擎」驱动两个等权的滚动组合(渊渟 / 岳峙),每个组合每 10 个交易日调仓一次;调仓目标 = 信号选出的 Top10 股票按反波动率定权,经波动率目标缩放到年化 35%;风险预算由贝叶斯优化统一统筹,压力态降仓与回撤护栏在调仓时按同一概率框架逐级裁剪;现金是唯一闲置资产,自动归集生息。

三个设计支柱:

处理流水线总览

一次调仓日的完整数据流:从原始 OHLCV 到最终订单。

① 数据50 只美股日线 OHLCV,多源行情依序兜底,复权质量门
→
② 因子计算32 个精选因子,逐日截面标准化
→
③ 前瞻 IC 评估10 日前瞻 Spearman IC 矩阵(t→t+10)
→
④ 层次聚类选冠军K=6 聚类,每簇取 max|ICIR| 冠军,10 日重聚
→
⑤ Löwdin 正交化6 冠军因子去共线性,solid 锚定加权合成信号
→
⑥ 组合构建Top10 + 粘性缓冲,反波动率定权、单票 20% 上限
→
⑦ 贝叶斯优化波动率目标 → 压力态降仓 → 回撤护栏
→
⑧ 执行订单生成(10u 门槛 / 交易所 minNotional)→ 下单 → 记账 → 邮件报告
无前瞻纪律(贯穿全链):所有信号与决策只用 t 日收盘及之前的信息;信号经 shift(1) 后于 t+1 生效。回测与实盘同口径,杜绝未来函数。
§2

标的宇宙与数据层

Universe & Data Layer

2.1 两层宇宙

标的宇宙分两层:

2.2 数据链与质量门

实盘日线从多个公开行情源依序兜底下载(data_utils.download_prices)。回测永远只读独立的干净长历史 data/prices_bt.csv(每日增量刷新,重叠 5 天修复复权衔接,NaN 污染 >10% 拒存)。三道质量门:

数据分层纪律:回测读 prices_bt.csv,实盘信号读独立缓存 prices_live.csv,信号因子计算读真实 5 字段 OHLCV(research_open/high/low/close/volume.csv),禁止用 close 单列代理。任何一环退化由 tests/test_ohlcv_freshness.py 拦截。
§3

因子库:32 个候选因子

Factor Library

从全量因子库出发,按经济逻辑精选出 32 个候选因子(V8_FACTOR_POOL_32),每个因子有:名称、默认基准方向 default_sign(仅作注释性先验,不作锁死)、与数学定义,分列如下:

经济主题
价值与公允锚定
value_vwap
+1 做多偏离alpha042, alpha075, alpha041, alpha013, alpha005, alpha011现价相对 VWAP 与价格中枢的偏离度。示例:alpha042 = rank(vwap−close)/rank(vwap+close)——价格低于成交均价越多,得分越高;alpha041 = √(H·L) − vwap 捕捉中枢锚定。
(同上)偏好估值合理、贴近或低于中枢的标的,属于「均值回归的价值锚」。
资金与流动性关注
volume_flow
+1 做多放量vol_ma_10, vol_ma_20, vol_ma_5, alpha047, vol_std_20, vol_std_10, vol_std_5成交量水平与波动率,识别资金主动增持的标的。示例:alpha047 = rank(1/close)·vol/adv20——低价股放量比值,抓资金关注度跃升。
(同上)「量在价先」的资金流信号。
趋势质量与中长期动量
trend_momentum
+1 做多趋势momentum_252, rolling_sharpe_120, rolling_sharpe_60, alpha066, ma_cross_20_120中长期价格趋势的持续性与风险调整后质量。示例:momentum_252 = P_t/P_{t−252} − 1(252 日收益动量);rolling_sharpe_120 为 120 日滚动夏普。
(同上)跟随强趋势,但要求「质量」而非单纯涨幅。
波动率与尾部风险惩罚
volatility_risk
−1 惩罚高波rolling_dd_252, rolling_dd_63, parkinson_vol_60, parkinson_vol_20, ret_vol_20, high_low_ratio, atr_20极端波动与回撤风险。示例:Parkinson 波动率 σ_p = √(1/(4ln2·n)·Σ ln²(H_t/L_t))(20/60 日高低价波动率,高波负惩罚);rolling_dd_252 为 252 日回撤幅度反弹信号(+1,跌深反弹)。
(同上)风险预算与防守信号:远离高波、关注深跌后的修复机会。
微观价量与短线反转
micro_reversal
±1 混合alpha054, alpha053, alpha082, alpha074, alpha095, alpha076, alpha038, alpha079短周期(日内至数日)做市商反转与情绪极值衰竭。示例:alpha054 = −(low−close)·open⁵ / ((low−high)·close⁵)(价格加权反转);alpha082/074/095/076/079 为 −1(共识过热、量价透支负信号)。
(同上)在拥挤交易与情绪极值处逆向,与趋势信号形成对冲。

图 3-1 · 32 因子近 126 交易日 10D ICIR(年化)

ICIR = mean(IC)/std(IC)·√(252/10),正值偏多、负值偏空。因子方向由 solid 锚决定:全历史 |IR|≥0.10 且滚动 126 日方向一致率≥65% 的因子按其全历史符号定向,当前窗口反向时弃用(取 0)。

§4

前瞻 IC 与 ICIR 评估

Forward IC & ICIR

因子是否「有用」,用截面信息系数(IC)衡量:在任一交易日 t,计算因子值截面与未来收益截面之间的秩相关。系统采用10 日前瞻口径(compute_10d_ic_matrix),与 10 交易日调仓周期严格对齐:

$$\mathrm{IC}_t^{(10)}(f) \;=\; \rho_s\!\Bigl(\; f_t^{\text{cross}},\; r_{t+1\to t+10}^{\text{cross}} \Bigr), \qquad r_{t+1\to t+10}=\frac{P_{t+10}}{P_{t+1}}-1$$
Spearman 秩相关:因子在 t 日的截面排序 vs 未来 10 日收益的截面排序。仅用 t 及之前数据,无前瞻。

逐日得到 IC 序列后,用「信息比率」ICIR 综合均值与稳定性,并年化到 10 日持有期(一年约 25.2 个 10 日周期):

$$\mathrm{ICIR}_f \;=\; \frac{\overline{\mathrm{IC}}_f}{\sigma(\mathrm{IC}_f)}\cdot\sqrt{\frac{252}{10}}, \qquad \text{窗口} = 126 \text{ 交易日}$$
分子是 IC 均值(收益),分母是 IC 波动(风险)。ICIR 高 = 因子不仅平均有效,而且稳定有效。

实现细节(walk_forward.py):逐日对每因子取「当日因子值 & 10 日后收益」的有效股票对(≥10 只)计算 Spearman 相关;IC 矩阵按日缓存(cache_10d_ic_v8.pkl),陈旧时自动重算,作为聚类与加权的唯一事实来源。默认符号只用于冷启动回退,正式决策一律用实测符号。

§5

动态层次聚类选因子

Hierarchical Clustering Selection

32 个因子间高度相关(尤其同主题内部)。若直接全部采用,等于重复押注同一风险。本系统的做法(ClusterWalkForwardSelector):在 IC 相关性上做全池层次聚类,K=6,每个簇只派一名「冠军」。相似因子被分到同一簇,冠军 = 簇内 |ICIR| 最大者,从而把 32 个因子压缩成 6 个「正交化的观点」。

$$\rho_{ij}=\mathrm{corr}(\mathrm{IC}_i,\mathrm{IC}_j), \qquad d_{ij}=\sqrt{\,2\,(1-|\rho_{ij}|)\,}\in[0,\sqrt{2}]$$
用 |corr| 而非 corr:同涨同跌(正相关)与镜像反向(负相关)都视为「共舞」,按共动程度聚类、符号无关。complete-linkage 凝聚层次聚类,K=6,每 10 交易日重聚类(聚类日与 A 组调仓日锚点一致)。
$$\text{champion}_c \;=\; \arg\max_{f\in \text{cluster}_c} \left| \mathrm{ICIR}_f \right|$$
簇内选拔:取 ICIR 绝对值最大者为该簇代表——它最能代表该「风险-收益观点」。
数据驱动的聚类设计:聚类完全由 IC 数据驱动(可能同一经济主题拆成两簇,也可能跨主题并簇),方向由全历史实测 IR 符号锚定、窗口反向时弃用(solid 锚);两个组合以 offset 错开调仓时点。信号层的聚类、offset 与缓存有专门回归测试兜底,任何改动都必须保持这些不变量。

图 5-1 · 最近一次重聚类的 6 个簇及其冠军

数据自 IC 缓存现算(与生产同路径:126 日窗口、|corr| 距离、complete linkage、K=6)。冠军 = 簇内 max|ICIR|。

§6

Löwdin 对称正交化

Löwdin Orthogonalization

6 个簇冠军之间仍有残余共线性。生产管线(build_v8_signal_cache.py)在每个聚类周期内,对 6 冠军因子做截面标准化后的 Löwdin 对称正交化,把「共动」成分剥离,保留各自的增量信息:

$$\mathbf{F}_z=\frac{\mathbf{F}-\mu}{\sigma}\ (\text{逐因子截面标准化}),\qquad \mathbf{S}=\frac{1}{N}\mathbf{F}_z^{\top}\mathbf{F}_z\ (\text{样本相关矩阵})$$ $$\mathbf{F}_{\mathrm{orth}}=\mathbf{F}_z\,\mathbf{S}^{-1/2},\qquad \mathbf{S}^{-1/2}\ \text{取矩阵分数幂} \mathrm{fractional\_matrix\_power}(\mathbf{S},-\tfrac12)$$
Löwdin 正交化在「保留原始方向最接近的形态」的意义下对称去相关:$\mathbf{F}_{\mathrm{orth}}^{\top}\mathbf{F}_{\mathrm{orth}}/N=\mathbf{I}$。若数值失败(矩阵病态)则回退为原 $\mathbf{F}_z$ 并继续。

数学性质:Löwdin 正交化是使 $\lVert\mathbf{F}_{\mathrm{orth}}-\mathbf{F}_z\rVert_F$ 最小的正交化方式,因此正交后每个因子仍尽量接近其原始含义,便于归因与监控;同时截面协方差完全单位化,后续加权不会重复计算共动风险。

§7

solid 锚定加权与信号合成

Solid-Anchor Weighting & Signal Blend

方向来自「全历史实测 ICIR 的符号」锚定,但只有当因子的方向在滚动窗口中持续稳定(solid)时才信任它:全历史 |ICIR|≥0.10 且滚动 126 日窗口符号与全历史符号一致率≥65% 的因子进入 solid 名单;名单内因子按锚定方向参与,当前窗口方向与锚相反时弃用(不取反);名单外因子权重为 0(仍保留在因子池参与聚类,提供分散价值)。两个经逐因子归因验证方向真实但未达门槛的因子(atr_20、momentum_252)同样按锚参与。这避免了「方向不稳的因子强行参与」和「负向因子被静默丢弃」两种极端:

$$d_f=\operatorname{sign}\big(\mathrm{IR}_f^{\mathrm{full}}\big),\qquad \mathrm{IR}_f^{\mathrm{full}}=\frac{\operatorname{mean}_{t}\big(\mathrm{IC}_{f,t}\big)} {\operatorname{std}_{t}\big(\mathrm{IC}_{f,t}\big)}\sqrt{25.2}\qquad \big(\sqrt{252/10}\big)$$
全历史 10D 前瞻 IC 的信息比率:符号即锚定方向。IC 为 10 日窗口 Spearman 相关。
$$\text{solid}(f)=\big[\,|\mathrm{IR}_f^{\mathrm{full}}|\ge 0.10\,\big]\;\wedge\; \Big[\tfrac{1}{N}\sum_{w}\mathbf{1}\big\{\operatorname{sign}(\mathrm{IR}_f^{w})=\operatorname{sign}(\mathrm{IR}_f^{\mathrm{full}})\big\}\ge 0.65\Big]$$
稳定判据:|全历史 IR|≥0.10 且 126 日滚动窗口(步长 21 日)方向一致率≥65%。atr_20、momentum_252 为经逐因子归因验证的例外参与。
$$w_f(t)=\,d_f\cdot\big|\mathrm{IR}_f^{w}(t)\big|\cdot\mathbf{1}\big\{\operatorname{sign}(\mathrm{IR}_f^{w}(t))=d_f\big\},\qquad \text{方向相反时}\ w_f=0$$ $$w_f^{*}=\frac{w_f}{\sum_{g\in S}w_g},\qquad \text{参与集为空时按冠军均权}\ \tfrac{1}{|S|}$$
solid 锚:方向=全历史符号,当前窗口一致则按「符号×|窗口 ICIR|」参与,反向则弃用(绝不取反)。参与集 S 为空时回退均权,永不静默空仓。
$$\mathrm{signal}_i(t)=\sum_{f} w_f^{*}(t)\cdot f^{\mathrm{orth}}_{i,f}(t),\qquad i\in \text{ALPHA\_TICKERS}$$
每日逐股合成一个单一 alpha 分数(sig_10d_v8_blend.pkl,50 列 × 全历史)。这就是后面 Top10 排序与粘性缓冲的输入。
§8

组合构建:Top10 与反波动率定权

Portfolio Construction

每组调仓日,把当日截面信号排序,取 Top10 为候选持仓,但通过「粘性缓冲」抑制换手:

$$\text{new holdings}=\Big[\;t\in \text{holdings}_{t-1}:\ \text{rank}(t)\le \text{buffer\_rank}\Big]\ \cup\ \text{top\_cands}\ \text{补足至}\ K=10$$
buffer_rank = 1.6×top_k = 16:旧持仓只要还排在前 16 名就保留(即使跌出前 10);新进者按信号排序补齐到 10 只。抑制因为名次微动导致的频繁买卖。

入选持仓按 20 日已实现波动率的倒数定权(低波多配、高波少配),并经过「钳位 → 归一 → 迭代 20% 上限 → 再钳位 [4%,20%] → 再归一」五步:

$$\sigma_i=\mathrm{std}_{20d}(r_i)\cdot\sqrt{252},\qquad \widetilde{\sigma}_i=\mathrm{clip}(\sigma_i,\ 0.20,\ 2.00),\qquad w_i^{\text{raw}}=\frac{1/\widetilde{\sigma}_i}{\sum_j 1/\widetilde{\sigma}_j}$$ $$\text{迭代}\ (\le 10\ \text{轮}):\ \text{若 } w_i>0.20\ \text{则 } w_i\leftarrow 0.20,\ \text{余量按未超限权重比例重分}$$ $$w_i^{\text{final}}=\frac{\mathrm{clip}(w_i,\ 0.04,\ 0.20)}{\sum_j \mathrm{clip}(w_j,\ 0.04,\ 0.20)}$$
效果:单票权重被钳在 4%–20% 之间,合计恒等于 1(满仓股票),杜绝单一标的过度集中。

图 8-1 · 最新调仓截面目标持仓(渊渟 / 岳峙,2026-10-14 截面)

渊渟 Top10:AAPL 17.7 / GS 17.7 / CRM 12.3 / TSM 11.7 / ASML 10.8 / AMAT 7.1 / CRWD 7.3 / AMD 6.3 / LITE 4.8 / MSTR 4.3。岳峙同池但 DELL 5.9 替代 LITE 4.8(信号排名不同)。

§9

滚动调仓日历

Rolling Calendar

两组各 50% 资金,共用同一张信号表,但调仓时点错开:

渊渟50%10 交易日,offset=0周期第 0 日调仓;聚类日 = (k−START_IDX)%10==0,与信号缓存重聚类锚点一致
岳峙50%10 交易日,offset=5调仓时点错开:在周期第 5 日调仓,读当日截面(同一张信号表,新截面)
$$\text{渊渟调仓日}:\ (i-\text{START\_IDX})\bmod 10=0,\qquad \text{岳峙调仓日}:\ (i-\text{START\_IDX}-5)\bmod 10=0,\ i\ge \text{START\_IDX}+5$$
START_IDX=252:前 252 个交易日为信号预热期(凑足 IC 窗口与因子计算),之后进入滚动调仓。实盘侧「末行恒为调仓截面」:最新收盘日(T-1)一定是调仓点,保证每日运行能读到新鲜目标。

信号表由 scripts/build_v8_signal_cache.py 构建并缓存(sig_10d_v8_blend.pkl),每日运行检测陈旧自动重建(内部再检测 OHLCV 落后自动补拉);重建后仍覆盖不到最新行情日时 fail-loud 阻断调仓——绝不用陈旧截面下单(signal_fns 内 RuntimeError)。

§10

波动率目标

Volatility Targeting

信号给出的满仓权重先按目标年化波动率缩放:用「提议组合」在 20 日与 60 日两个窗口的历史收益波动率,取两者更大者(保守估计),把总暴露压到目标水平:

$$\hat\sigma=\max\!\big(\sigma_{20}(\text{portfolio}),\ \sigma_{60}(\text{portfolio})\big),\qquad x=\min\Big(1,\ \frac{\sigma^{\star}}{\hat\sigma}\Big),\qquad \sigma^{\star}=0.35\ (35\%\ \text{年化})$$
股票权重整体 ×x,差额补入现金。x≤1 保证永不加杠杆;取两窗口最大值避免单一窗口对波动率的误估。

此步之后,权重进入贝叶斯优化的后续环节:压力态降仓 → 回撤护栏(下一节)。两组目标波动率均为 0.35。

§11

贝叶斯优化:压力态降仓

Bayesian Optimization

贝叶斯优化是组合风险的根基之一:用两状态贝叶斯推断(GATE_TYPE="bayes")在调仓日、波动率目标之后、回撤护栏之前,用最近 L 日组合收益判断「市场是否处于压力态」,若是则系统性降仓。它把「降多少仓」变成概率问题:压力态概率越高,降仓越深。

11.1 两状态模型

假设组合日收益来自两个状态之一:正常态(均值 0)或压力态(负均值 μ_s、更高波动):

$$\text{正常态 }N:\ r_t\sim\mathcal{N}(0,\ \sigma_n^2),\qquad \text{压力态 }S:\ r_t\sim\mathcal{N}(\mu_s<0,\ \sigma_s^2),\qquad \sigma_n=\frac{0.20}{\sqrt{252}},\ \sigma_s=\frac{0.40}{\sqrt{252}},\ \mu_s=-0.0005$$
日度参数由年化参数换算(÷√252)。压力态用两倍波动 + 负漂移刻画「急跌」:单日 -1% 在正常态下是 -3.5σ 的极端事件,在压力态下则常见得多。

11.2 后验推断(对数似然比 + 递归先验)

$$\underbrace{P(S\mid r_{1:L})}_{\text{后验}}\;=\; \frac{\overbrace{\pi}^{\text{先验}}\cdot L_S}{\pi\cdot L_S+(1-\pi)\cdot L_N}, \qquad \ln L_N=-\frac{1}{2\sigma_n^2}\sum_{t=1}^{L} r_t^2-L\ln\sigma_n, \qquad \ln L_S=-\frac{1}{2\sigma_s^2}\sum_{t=1}^{L}(r_t-\mu_s)^2-L\ln\sigma_s$$
后验 = 先验 × 似然比归一化。等价于对数形式:$\ln\frac{P(S)}{P(N)}=\ln\frac{\pi}{1-\pi}+(\ln L_S-\ln L_N)$。
$$\pi_{t+1}=(1-\alpha)\cdot P(S\mid r_{1:L})+\alpha\cdot p_0,\qquad L=45,\ \alpha=0.20,\ p_0=0.05$$
递归先验(状态持久化):下一次调仓的先验 = 本次后验向基准 5% 收缩 20%——既延续证据,又防止某次极端推断让先验永久卡在高位。后验持久化于 state["fwd_bayes_p"],跨调仓日生效。

11.3 降仓规则

$$\text{scale}=1-k\cdot P(S),\qquad k=0.9,\ \Rightarrow\ \text{股票} \times \text{scale},\ \text{现金补足差额}$$
P(S)=1 时 scale=0.10(股票保留 10%);P(S)=0 时不动。降仓是「连续」的——越像压力态降得越多,而非跳变式开关。

图 11-1 · 三配置回测段内表现对比(熊市窗口)

压力窗口下的组合表现:急跌与慢熊大幅减损,温和回调保持稳健。

完整的风控链条:压力态降仓(贝叶斯优化)与回撤护栏(知止)共同构成贝叶斯优化的风险预算体系——前者以市场状态概率为输入,后者以组合自身回撤为输入,二者各司其职,叠加执行。
§12

回撤护栏(知止)

Drawdown Guard

知止是组合级回撤护栏(guard_combined / live 每日 _update_guard_gate):每日以基金 NAV(总资产/总份额,不受出入金干扰)相对历史峰值计算回撤,当回撤跌破阈值时,把各组股票目标权重统一乘以下档系数,现金补足。滞回机制防止回撤在阈值附近震荡导致的反复砍仓/加仓:

$$\text{dd}=\frac{\text{NAV}}{\text{NAV}_{\text{peak}}}-1, \qquad g=\begin{cases} 0.70 & \text{dd}\le -0.12\ \text{(若} g=1.0\text{)}\\ 0.50 & \text{dd}\le -0.18\\ 1.00 & \text{dd}\ge -0.08\ \text{(恢复,滞回窗)}\\ \text{原值} & \text{otherwise} \end{cases}$$
参数:GUARD_LEVELS=(-0.12→0.70, -0.18→0.50),GUARD_RECOVER_DD=-0.08。即:跌 12% 先降三成仓,跌 18% 再砍到半仓;回升到 -8% 以内才恢复满仓。每档之间留了 4 个百分点的滞回带。

只在调仓日生效(两次调仓之间持仓随市场漂移,不做日内干预),避免过度交易。净值峰值由 state["nav_peak"] 持久化。

§13

每次调仓会发生什么

A Rebalance Day, Step by Step

每日 14:00(UTC+8,launchd com.biquant.rebalance)运行 src/live_rolling.py。当天轮到调仓的组(渊渟或岳峙,见 §9 日历)按以下顺序处理:

① 取数下载/刷新 50 标的价格(四源兜底 + 复权门 + 流动性地板整列置 NaN)
→
② 信号新鲜度检查sig 缓存覆盖到最新行情日,否则重建;失败 fail-loud 阻断
→
③ 计算目标权重v8 信号 → Top10+缓冲 → 反波动率定权 → vol target(§8/§10)
→
④ 贝叶斯优化用近 45 日组合收益算压力态概率,股票 ×(1−0.9P)(§11)
→
⑤ 回撤护栏净值回撤状态机,股票 ×g(§12)
→
⑥ 订单生成目标值 vs 当前持仓;新仓≥10u、存量仅受交易所 minNotional 约束
→
⑦ 下单与记账现货限价单;更新持仓与成本;现金/理财对账
→
⑧ 报告写 rolling_log、快照上传、投资人邮件

13.1 订单生成细节(rebalance_group)

13.2 一次调仓的数学总结

$$\text{order}_i:\ \text{Buy/Sell}\ \text{qty}_i,\qquad \text{qty}_i=\frac{w_i^{\text{final}}\cdot g_{\text{知止}}\cdot (1-kP)\cdot x\cdot \text{equity}}{P_i^{\text{live}}}-\text{holdings}_i$$
一份目标权重 w*,依次穿过波动率目标缩放 x、贝叶斯压力态系数、回撤护栏系数,再乘以该组应管理的资金,与当前持仓做差产生订单。
§14

回测结果与证据

Backtest Evidence

官方回测(PYTHONPATH=src uv run python src/backtest.py,2014-12 起,长历史数据,1 个基点交易成本,数据至 2026-10-15)的官方口径(含贝叶斯优化风控):

CAGR+46.0%+54.8%+49.8%
最大回撤-22.05%-33.10%-26.55%
Sharpe(年化)2.031.841.99
年化波动19.61%25.54%21.50%
Calmar2.091.661.87
Sortino2.682.492.74
总收益(全期)+87.5%*+176.4%*+118.7%*

*口径说明:全期总收益 = 末值净值 − 1(倍率口径);三列 CAGR / MaxDD / Sharpe / 波动 / Calmar / Sortino / 总收益均出自同一官方回测、同一配置切换,仅风控开关不同。

图 14-1 · 官方回测净值曲线(受保护 vs 基线,对数坐标)

组合曲线以 2014 年末 1.0 起,2026-10-15 收于 88.49(×88.5);同期的市场基准标普500 收于 ×4.58。

图 14-2 · 受保护组合回撤曲线

最大回撤 -22.05%;2022 慢熊期间回撤持续累积,知止分档降仓、-8% 恢复滞回生效。

14.1 熊市分窗口表现

图 14-3 · 熊市/回调窗口三配置对比

贝叶斯优化在 2020 急跌(-15.8% vs 无风控 -26.0%)与 2022 慢熊(-17.3% vs -31.7%)显著减损;2025 温和回调 -2.3%(无风控 -2.4%),2026 反弹行情 +8.5%(无风控 +10.2%)保持稳健。

选参稳健性(为什么这些参数可信):champion 参数(L=45, σn=0.20, σs=0.40, μs=-0.0005, k=0.9, α=0.20, p0=0.05)经「时代内稳健留一法(DEV≤2022,过拟合概率从 33% 降至 13%)+ TEST(2023+) 纯保留」双层验证,参数一经定稿固定,禁动态选参。
§15

风险与局限

Risks & Limitations
附录

参数表 · 复现命令

Appendix

A.1 关键参数总表

STRATEGY_ARCHITECTUREv3_0滚动调仓架构
GATE_TYPEbayes贝叶斯优化(压力态降仓)
V8_FACTOR_POOL_3232 因子32 因子动态精选池
K_CLUSTERS6层次聚类簇数,每 10 日重聚
IC 窗口 / 前瞻126 / 10 日ICIR 窗口与前瞻收益
START_IDX252信号预热期(交易日)
CYCLE_DAYS / offset10 / 0, 5调仓周期与时点错开
TOP_K / BUFFER_RANK10 / 16持仓数与粘性缓冲
VOL_CAP / 权重钳位2.00 / [0.04, 0.20]反波动率定权上下限
TARGET_VOL0.35年化波动率目标
GATE_BAYESL45 / σn.20 / σs.40 / μs-.0005 / k.9 / α.20 / p0.05贝叶斯优化七参数
GUARD_LEVELS-12%→0.70, -18%→0.50知止分档与恢复 -8%
MIN_POSITION_NOTIONAL10.0新建仓位门槛
MIN_QUOTE_VOLUME_USDT5 万 / 2 万(美元)流动性地板
TRANSACTION_COST0.001回测单边成本假设

A.2 复现命令

PYTHONPATH=src uv run python src/backtest.py官方回测(自动刷新 prices_bt)
PYTHONPATH=src uv run python src/live_rolling.py --dry-run实盘逻辑干跑(读账户不下单)
PYTHONPATH=src:scripts uv run python tests/test_signal_v8.py信号测试(offset/聚类/缓存/fail-loud)
PYTHONPATH=src uv run python tests/test_fwd_vol_gate.py贝叶斯优化 + 回撤护栏回归测试(15 项)
PYTHONPATH=src:scripts uv run python tests/test_ohlcv_freshness.py行情数据链防退化
.venv/bin/python scripts/build_v8_signal_cache.py重建 10D IC 与信号缓存

更多工程细节见 HANDOVER.md(上手手册)与 docs/adr/(决策记录)。