基金思想与总体架构
Philosophy & Architecture一句话定位:用「同一套动态多因子引擎」驱动两个等权的滚动组合(渊渟 / 岳峙),每个组合每 10 个交易日调仓一次;调仓目标 = 信号选出的 Top10 股票按反波动率定权,经波动率目标缩放到年化 35%;风险预算由贝叶斯优化统一统筹,压力态降仓与回撤护栏在调仓时按同一概率框架逐级裁剪;现金是唯一闲置资产,自动归集生息。
三个设计支柱:
- 因子是动态的,不是固定的。32 个候选因子每 10 个交易日依据其「10 日前瞻截面 IC」重新聚类、重新选拔冠军,方向由全历史实测 IR 的符号锚定(solid 锚),因子方向反转时自动退出、绝不取反硬做。
- 两个组合的调仓时点错开,形成「时间上的分散」。渊渟在 10 日周期的第 0 日调仓,岳峙在第 5 日调仓,二者持有期重叠一半。市场在某一周急变时,只有一半资金暴露在「刚调完仓」的状态,另一半处于「已持有数日」的中间状态,平滑了单点择时风险。
- 贝叶斯优化统一统筹风险。波动率目标管理常态下的敞口刻度,压力态贝叶斯推断抓「V 型急跌」,回撤护栏(知止)管理慢熊深回撤——三者同属贝叶斯优化的组成部分,叠加顺序固定为:信号定权 → 波动率目标 → 压力态降仓 → 回撤护栏 → 下单执行。
处理流水线总览
一次调仓日的完整数据流:从原始 OHLCV 到最终订单。
t 日收盘及之前的信息;信号经 shift(1) 后于 t+1 生效。回测与实盘同口径,杜绝未来函数。标的宇宙与数据层
Universe & Data Layer2.1 两层宇宙
标的宇宙分两层:
- Alpha 池
ALPHA_TICKERS(50 只):经「上市时长 + 业务清晰度 + 治理」三重筛选的成熟个股,是因子评分与组合构建的唯一候选池。被剔除的有:数据不满意的次新股(SKHY/QNT/CBRS/DRAM/SPCX 代理)、无基本面的 meme 股(DJT/GME/AMC)、财务造假风险标的(SMCI)、纯概念微盘(CYPH/ASTS/BMNR/AGPU/USAR)等。 - 观察标的
REGIME_TICKER=SPY:作为市场基准,用于对比净值与风险环境观察,不进入持仓。
2.2 数据链与质量门
实盘日线从多个公开行情源依序兜底下载(data_utils.download_prices)。回测永远只读独立的干净长历史 data/prices_bt.csv(每日增量刷新,重叠 5 天修复复权衔接,NaN 污染 >10% 拒存)。三道质量门:
- 复权自适应:兜底数据源序列先自动检测拆股/合股跳变并做后复权,再以缓存干净列最后一日的锚定对齐,只延伸新日期;锚定比例超出 [0.2, 5] 时回退整列冻结——拆股/分红日的假尖峰不会污染信号。
- 流动性地板:24 小时报价成交量中位数低于全局 5 万美元(个别标的自定义 2 万美元)的标的被整列置为无效,信号与权重天然跳过——不流动的标的永远不会被买入,已持仓标的则被粘性缓冲机制在下次调仓时卖出。
- 估值一致性闸门:每日用交易所实时总资产与账本口径交叉验证,偏离超过容差即拒绝更新净值、拒绝调仓,仅发对账告警。
prices_bt.csv,实盘信号读独立缓存 prices_live.csv,信号因子计算读真实 5 字段 OHLCV(research_open/high/low/close/volume.csv),禁止用 close 单列代理。任何一环退化由 tests/test_ohlcv_freshness.py 拦截。因子库: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)。
前瞻 IC 与 ICIR 评估
Forward IC & ICIR因子是否「有用」,用截面信息系数(IC)衡量:在任一交易日 t,计算因子值截面与未来收益截面之间的秩相关。系统采用10 日前瞻口径(compute_10d_ic_matrix),与 10 交易日调仓周期严格对齐:
逐日得到 IC 序列后,用「信息比率」ICIR 综合均值与稳定性,并年化到 10 日持有期(一年约 25.2 个 10 日周期):
实现细节(walk_forward.py):逐日对每因子取「当日因子值 & 10 日后收益」的有效股票对(≥10 只)计算 Spearman 相关;IC 矩阵按日缓存(cache_10d_ic_v8.pkl),陈旧时自动重算,作为聚类与加权的唯一事实来源。默认符号只用于冷启动回退,正式决策一律用实测符号。
动态层次聚类选因子
Hierarchical Clustering Selection32 个因子间高度相关(尤其同主题内部)。若直接全部采用,等于重复押注同一风险。本系统的做法(ClusterWalkForwardSelector):在 IC 相关性上做全池层次聚类,K=6,每个簇只派一名「冠军」。相似因子被分到同一簇,冠军 = 簇内 |ICIR| 最大者,从而把 32 个因子压缩成 6 个「正交化的观点」。
offset 错开调仓时点。信号层的聚类、offset 与缓存有专门回归测试兜底,任何改动都必须保持这些不变量。图 5-1 · 最近一次重聚类的 6 个簇及其冠军
数据自 IC 缓存现算(与生产同路径:126 日窗口、|corr| 距离、complete linkage、K=6)。冠军 = 簇内 max|ICIR|。
Löwdin 对称正交化
Löwdin Orthogonalization6 个簇冠军之间仍有残余共线性。生产管线(build_v8_signal_cache.py)在每个聚类周期内,对 6 冠军因子做截面标准化后的 Löwdin 对称正交化,把「共动」成分剥离,保留各自的增量信息:
数学性质:Löwdin 正交化是使 $\lVert\mathbf{F}_{\mathrm{orth}}-\mathbf{F}_z\rVert_F$ 最小的正交化方式,因此正交后每个因子仍尽量接近其原始含义,便于归因与监控;同时截面协方差完全单位化,后续加权不会重复计算共动风险。
solid 锚定加权与信号合成
Solid-Anchor Weighting & Signal Blend方向来自「全历史实测 ICIR 的符号」锚定,但只有当因子的方向在滚动窗口中持续稳定(solid)时才信任它:全历史 |ICIR|≥0.10 且滚动 126 日窗口符号与全历史符号一致率≥65% 的因子进入 solid 名单;名单内因子按锚定方向参与,当前窗口方向与锚相反时弃用(不取反);名单外因子权重为 0(仍保留在因子池参与聚类,提供分散价值)。两个经逐因子归因验证方向真实但未达门槛的因子(atr_20、momentum_252)同样按锚参与。这避免了「方向不稳的因子强行参与」和「负向因子被静默丢弃」两种极端:
sig_10d_v8_blend.pkl,50 列 × 全历史)。这就是后面 Top10 排序与粘性缓冲的输入。组合构建:Top10 与反波动率定权
Portfolio Construction每组调仓日,把当日截面信号排序,取 Top10 为候选持仓,但通过「粘性缓冲」抑制换手:
buffer_rank = 1.6×top_k = 16:旧持仓只要还排在前 16 名就保留(即使跌出前 10);新进者按信号排序补齐到 10 只。抑制因为名次微动导致的频繁买卖。入选持仓按 20 日已实现波动率的倒数定权(低波多配、高波少配),并经过「钳位 → 归一 → 迭代 20% 上限 → 再钳位 [4%,20%] → 再归一」五步:
图 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(信号排名不同)。
滚动调仓日历
Rolling Calendar两组各 50% 资金,共用同一张信号表,但调仓时点错开:
| 渊渟 | 50% | 10 交易日,offset=0 | 周期第 0 日调仓;聚类日 = (k−START_IDX)%10==0,与信号缓存重聚类锚点一致 |
| 岳峙 | 50% | 10 交易日,offset=5 | 调仓时点错开:在周期第 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)。
波动率目标
Volatility Targeting信号给出的满仓权重先按目标年化波动率缩放:用「提议组合」在 20 日与 60 日两个窗口的历史收益波动率,取两者更大者(保守估计),把总暴露压到目标水平:
此步之后,权重进入贝叶斯优化的后续环节:压力态降仓 → 回撤护栏(下一节)。两组目标波动率均为 0.35。
贝叶斯优化:压力态降仓
Bayesian Optimization贝叶斯优化是组合风险的根基之一:用两状态贝叶斯推断(GATE_TYPE="bayes")在调仓日、波动率目标之后、回撤护栏之前,用最近 L 日组合收益判断「市场是否处于压力态」,若是则系统性降仓。它把「降多少仓」变成概率问题:压力态概率越高,降仓越深。
11.1 两状态模型
假设组合日收益来自两个状态之一:正常态(均值 0)或压力态(负均值 μ_s、更高波动):
11.2 后验推断(对数似然比 + 递归先验)
state["fwd_bayes_p"],跨调仓日生效。11.3 降仓规则
图 11-1 · 三配置回测段内表现对比(熊市窗口)
压力窗口下的组合表现:急跌与慢熊大幅减损,温和回调保持稳健。
回撤护栏(知止)
Drawdown Guard知止是组合级回撤护栏(guard_combined / live 每日 _update_guard_gate):每日以基金 NAV(总资产/总份额,不受出入金干扰)相对历史峰值计算回撤,当回撤跌破阈值时,把各组股票目标权重统一乘以下档系数,现金补足。滞回机制防止回撤在阈值附近震荡导致的反复砍仓/加仓:
只在调仓日生效(两次调仓之间持仓随市场漂移,不做日内干预),避免过度交易。净值峰值由 state["nav_peak"] 持久化。
每次调仓会发生什么
A Rebalance Day, Step by Step每日 14:00(UTC+8,launchd com.biquant.rebalance)运行 src/live_rolling.py。当天轮到调仓的组(渊渟或岳峙,见 §9 日历)按以下顺序处理:
13.1 订单生成细节(rebalance_group)
- 新建仓位:目标值 <
MIN_POSITION_NOTIONAL=10.0则不建仓(避免碎片单)。 - 存量仓位:不受 10 门槛约束,正常调仓/补仓/减仓;目标值跌破交易所最小名义金额(约 5)时整仓退出。
- 仓位定价:
equity = 组权重 × 当前基金总额(50/50 恒定混合,非各组漂移净值),目标值 = 权重 × equity。 - 闲置现金:自动归集生息;买入资金不足时自动赎回;账本按组价值比例归因。
- 数据不足保护:调仓日信号全 NaN(数据源全挂)时保持原持仓、调仓顺延到下一运行日,绝不误清仓。
13.2 一次调仓的数学总结
回测结果与证据
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.03 | 1.84 | 1.99 |
| 年化波动 | 19.61% | 25.54% | 21.50% |
| Calmar | 2.09 | 1.66 | 1.87 |
| Sortino | 2.68 | 2.49 | 2.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%)保持稳健。
风险与局限
Risks & Limitations- 标的代理风险:回测用公开市场美股日数据作为交易标的的价格代理(假设 1:1 跟踪);实际交易标的可能存在定价偏差与流动性差异。
- 因子衰减与拥挤:32 因子池与聚类结构基于历史 IC 推断;IC 会随市场结构变化衰减,solid 锚方向只能事后纠正,无法预测衰减。
- 统计显著性边界:回测跨越 2014-2026(含 2020/2022/2025/2026 四次压力段),但单基金样本、非随机独立试验;CPCV 只认证「选参过程」,不保证未来。
- 执行摩擦:1 个基点交易成本假设未覆盖滑点、冲击与最小下单/碎股限制;实盘订单按交易所步长取整。
- 数据链路故障:四源兜底已大幅降险,但源全挂时该组调仓顺延(保持原仓),存在「该调未调」的敞口漂移。
- 无杠杆纪律:vol target 上限 x≤1;任何信号路径都不允许股票暴露 >100%(
weights_to_out防御性钳位)。
参数表 · 复现命令
AppendixA.1 关键参数总表
| STRATEGY_ARCHITECTURE | v3_0 | 滚动调仓架构 |
| GATE_TYPE | bayes | 贝叶斯优化(压力态降仓) |
| V8_FACTOR_POOL_32 | 32 因子 | 32 因子动态精选池 |
| K_CLUSTERS | 6 | 层次聚类簇数,每 10 日重聚 |
| IC 窗口 / 前瞻 | 126 / 10 日 | ICIR 窗口与前瞻收益 |
| START_IDX | 252 | 信号预热期(交易日) |
| CYCLE_DAYS / offset | 10 / 0, 5 | 调仓周期与时点错开 |
| TOP_K / BUFFER_RANK | 10 / 16 | 持仓数与粘性缓冲 |
| VOL_CAP / 权重钳位 | 2.00 / [0.04, 0.20] | 反波动率定权上下限 |
| TARGET_VOL | 0.35 | 年化波动率目标 |
| GATE_BAYES | L45 / σn.20 / σs.40 / μs-.0005 / k.9 / α.20 / p0.05 | 贝叶斯优化七参数 |
| GUARD_LEVELS | -12%→0.70, -18%→0.50 | 知止分档与恢复 -8% |
| MIN_POSITION_NOTIONAL | 10.0 | 新建仓位门槛 |
| MIN_QUOTE_VOLUME_USDT | 5 万 / 2 万(美元) | 流动性地板 |
| TRANSACTION_COST | 0.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/(决策记录)。