AutoQuant 与 QuantumRandy:量化策略研发的两个齿轮
两个项目主要是对论文的复现,仅做学术研究,距离实战距离尚远。
*仓库地址在文末
一、缘起
加密货币永续合约市场与传统股票市场有本质差异:7×24 小时交易、资金费率机制、高额滑点与手续费。一篇名为 "AutoQuant: An Auditable Expert-System Framework for Execution-Constrained Auto-Tuning in Cryptocurrency Perpetual Futures" 的论文提出了一个面向永续合约的、可审计的回测与参数优化框架。
与此同时,另一篇来自 arXiv 的论文(2505.11122)探索了用 LLM + 蒙特卡洛树搜索(MCTS) 自动挖掘 alpha 因子的范式。
这两个项目分别是对以上两篇论文的实践性还原。但它们的意义不在于复现论文——而在于,它们恰好构成了量化策略研发最核心的两个环节:因子生成 与 因子验证。一个负责"想",一个负责"验",二者的交互形成了一个闭环。
二、两个项目的定位
AutoQuant —— 严谨的回测与筛选实验室
AutoQuant 解决的核心问题是:如何在一个充满摩擦的市场里,真实地评估一个策略的表现?
它并非一个实盘交易系统,而是一个"回测实验室"。其设计哲学贯穿一个词:STRICT4H——在 4 小时级别的 K 线上,实施最严格的执行约束,杜绝一切"偷看未来"的作弊行为。
QuantumRandy —— LLM 驱动的 alpha 因子矿场
QuantumRandy 解决的核心问题是:如何自动地、系统性地生成大量 alpha 因子候选?
它不是让研究员手动推导公式,而是将 alpha 挖掘建模为一棵巨大的搜索树——每一个节点是一个因子公式,每一条边是一次"改进"操作。然后用 MCTS 在这棵树上游走,由 LLM 提供创造力,由回测提供评判。
三、AutoQuant 的核心原理
3.1 STRICT t+1 执行:反"未来函数"的第一道墙
在回测中最常见的错误是"偷看未来"(look-ahead bias)。比如在 K 线 t 的收盘时,用 t 的收益率来决定 t 的仓位——这在现实中不可能做到,因为你在收盘那一刻还不知道收益率。
AutoQuant 的规则简单而铁面:bar t 收盘时生成信号,从 bar t+1 开盘起才持有仓位。 即 exposure = signal.shift(1)。
3.2 资金费率的"无偷看"处理
资金费率是永续合约特有的机制。Binance 上的资金费率是每 8 小时结算一次,但我们的 K 线是 4 小时的。
这里有一个微妙的陷阱:你不能把 8 小时后的资金费率用在 4 小时前的 K 线上。AutoQuant 的处理方式是 前向填充(ffill):只使用"到目前为止已知"的最新资金费率,绝不使用未来数据。同时,每根 4 小时 bar 只计一半的资金费率成本——因为一次结算是 8 小时。
$$ c_{\text{fund}} = \text{exposure} \times \text{funding\_rate} \times 0.5 $$
3.3 成本三分:看得见的和看不见的
在永续合约市场,真实收益远不止"价格涨跌 × 仓位"。AutoQuant 将成本拆解为三层:
| 成本类型 | 计算方式 | 含义 |
|---|---|---|
| 手续费 | ∣Δexposure∣ × taker_bps / 10000 | 每次开平仓的交易所费用 |
| 滑点 | ∣Δexposure∣ × slippage_bps / 10000 | 市价单对盘口的冲击 |
| 资金费率 | 见 3.2 | 持有多空头的定期费率结算 |
由此,净收益为:
$$ r_{\text{net}} = r_{\text{raw}} - c_{\text{fee}} - c_{\text{slip}} - c_{\text{fund}} $$
这种"全口径"的成本计算,意味着许多在裸回测中漂亮的曲线,在扣费后直接腰斩——而这,才是真实。
3.4 复合信号:动量 + 异动 + 费率偏置
AutoQuant 的信号生成(autoquant 策略)由三个维度融合而成:
A. 动量维度 —— EMA 快慢线之差
$$ \text{momentum} = 0.5 \times \left(1 + \tanh\left(\frac{\text{EMA}_{\text{fast}} - \text{EMA}_{\text{slow}}}{\text{EMA}_{\text{slow}} \times \text{threshold}}\right)\right) $$
用 tanh 做平滑映射,将无限范围的价差压缩到 [0, 1] 区间,作为"看涨倾向"的概率度量。同时除以 EMA_slow 做归一化,使得不同价格水平下的信号具有可比性。
B. 异动维度 —— 布林带偏离度
$$ \text{anomaly} = \min\left(\frac{|z|}{b_{\text{dev}}}, 1\right), \quad z = \frac{\text{close} - \mu}{\sigma} $$
价格偏离均值的标准差倍数越大,异动得分越高。clamp 到 [0, 1] 防止极端值主导信号。
C. 资金费率偏置 —— 动态阈值
这是 AutoQuant 最有创意的设计之一。当市场极度看多时,资金费率会飙升(多头支付空头)。策略不应在此时盲目做多,因为持有成本太高。
$$ \text{dynamic\_thr} = \text{base\_thr} + k \times \max(|\text{funding\_rate}| - \text{bias\_thr}, 0) $$
资金费率越高,开仓阈值越严格——相当于"市场情绪过热时,提高入场的门槛"。
最终信号由动量与异动的加权和决定,与动态阈值比较后产生做多/做空/空仓:
$$ \text{signal} = \begin{cases} +1 & \text{composite} \geq 0.5 + \text{dynamic\_thr} \\ -1 & \text{composite} \leq 0.5 - \text{dynamic\_thr} \\ 0 & \text{otherwise} \end{cases} $$
3.5 两阶段筛选:从"看起来好"到"真的好"
回测的本质危险是过拟合——你总能找到一组参数让历史曲线完美,但它对未来毫无预测能力。
AutoQuant 的对策是两阶段筛选:
Stage I —— 参数搜索(Optimization)
给定一个策略模板(如双均线交叉),在参数空间中进行搜索。默认使用 Optuna 的 TPE(Tree-structured Parzen Estimator)采样器,它会根据已有结果自适应地调整搜索方向——表现好的参数区域被更多探索,差的区域被逐渐抛弃。如果 Optuna 未安装,则退回随机搜索。
目标函数是 CAGR(年化复合增长率)。这一步选出 120 次试验中的 top 40。
Stage II —— 成本情景鲁棒性筛选(Robustness Screening)
这不是简单的"换一个时间段测试",而是构造一个 成本情景网格:
- 手续费三档:3bps、4bps、6bps
- 资金费率乘数三档:0.5x、1.0x、1.5x
- 共 3 × 3 = 9 种情景
每个 Stage I 的候选参数在这 9 种情景下分别回测。通过门槛的因子需要满足:
- 平均月几何收益 ≥ 0.5%
- 最差情景月收益 ≥ 0%
- 平均最大回撤 ≤ 30%
- 平均换手密度 ≤ 12%
这个设计的逻辑在于:一个真正稳健的策略,不应该对成本参数过度敏感。如果费率从 4bps 变到 6bps 就让你的策略从盈利变亏损,那它在实盘中大概率活不下去。
四、QuantumRandy 的核心原理
4.1 Alpha 即公式:21 个操作符构成的 DSL
传统量化研究中的 alpha 因子可以看作一个数学表达式。QuantumRandy 定义了一个微型 DSL(领域特定语言),包含 6 个字段和 21 个操作符:
字段: open, high, low, close, volume, funding_rate
操作符: sma, ema, std, zscore, corr, ret, delta, rank, delay, sign, rsi, div, neg, abs, log, sqrt, min, max, add, sub, mul
例如:
zscore(sub(sma(close,12), sma(close,48)), 48) # 均线交叉,z-score 标准化
neg(zscore(funding_rate, 42)) # 资金费率均值回归
zscore(corr(ret(close,6), ret(volume,6), 48), 72) # 价量相关性这个 DSL 用一种极其紧凑的方式表达了几百种可能的因子结构。它的解析器基于 Python 的 ast 模块(抽象语法树),将公式字符串解析为树结构,然后在市场数据上逐节点求值。
4.2 MCTS:在因子空间中"下棋"
如果暴力枚举所有可能的公式组合,哪怕只限制深度为 5、操作符为 6 个,组合数也是天文数字。需要一种智能的搜索策略——MCTS(蒙特卡洛树搜索)正是为此而生。
MCTS 原本用于围棋(AlphaGo 的核心算法),但在这里,棋盘变成了"公式生成器"。MCTS 的四个步骤为:
A. 选择(Selection)—— 使用 UCT(Upper Confidence Bound for Trees)公式选择最有潜力的节点继续扩展:
$$ \text{UCT}(i) = \underbrace{v_i}_{\text{历史平均得分}} + \underbrace{c \cdot \sqrt{\frac{\ln N_{\text{parent}}}{n_i}}}_{\text{探索奖励}} + \underbrace{\frac{0.04}{1 + |\text{children}_i|}}_{\text{未充分展开奖励}} $$
三项分别对应:利用(exploitation)、探索(exploration)、鼓励展开新分支。
B. 扩展(Expansion)—— 对选中的节点,采样一个"弱维度",调用生成器产生若干改进公式。这里的维度有 5 个:
- effectiveness:预测力(Rank IC、方向胜率)
- stability:PnL 平滑度(月胜率、波动率惩罚)
- turnover:换手率
- diversity:与已有因子的相关性
- overfit_risk:过拟合风险(复杂度 + 回撤)
每个候选因子的 score 是这五个维度的均值,再减去复杂度惩罚:
$$ \text{score} = \text{mean}(\text{effectiveness}, \text{stability}, \text{turnover}, \text{diversity}, \text{overfit\_risk}) - \lambda \cdot (2^{\text{extra\_ops}} - 1) $$
复杂度惩罚呈指数增长——当一个因子多了 3 个多余操作符,它的惩罚是 $2^3 - 1 = 7$ 倍 $\lambda$。这就是"奥卡姆剃刀":简单有效的公式优先。
C. 模拟(Simulation)—— 对每个候选公式运行严格回测(与 AutoQuant 相同的 t+1 执行、成本拆分逻辑),得到 5 维评估。
D. 回传(Backpropagation)—— 将评估结果沿路径向上更新所有祖先节点的 value。
4.3 双引擎生成:LLM 创新 + 本地模板保底
QuantumRandy 的公式生成有两条路径:
路径一:DeepSeek API(主引擎)
将当前公式、目标维度、可用操作符、已存在因子列表打包成 prompt,发给 DeepSeek 大模型。模型需要返回包含公式和经济解释的 JSON。
这里有一个关键设计——强制经济解释。LLM 不仅要给出公式,还要给出 ≥60 个字符的经济学依据,且必须包含金融关键词(momentum、reversal、volatility、carry 等)。这杜绝了 LLM 胡乱堆叠操作符的行为——没有经济意义的结构不被接受。
路径二:本地模板引擎(保底)
当 API 不可用或返回无效结果时,退回到本地模板生成。本地模板引擎有 25 个预置模板,按 5 个维度分类,每条模板有明确的金融含义(如"均线交叉捕捉趋势"、"资金费率 / 波动率衡量风险调整后 carry 压力")。
一个重要的优化是字段类型分离:close/high/low 用于 ret()、delta()、rsi()(需要价格序列),而 funding_rate/volume 也大量用于 zscore、sma、ema。特别是资金费率在字段选择中的权重被提高到 35%——因为实证表明它是通过四道滤网比例最高的信号源。
4.4 四道滤网:从因子到可交易信号
候选因子在 MCTS 评分中可能看起来不错,但那只是第一步。真正决定一个因子生死的,是 QuantumRandy 的 Brutal Filter(残酷滤网)——四道门:
第一道:预测力(Predictive Power)
- Rank IC ≥ 0.01:因子值与未来收益的 Spearman 秩相关系数
- 方向胜率 ≥ 49%:因子方向与实际涨跌方向的一致率
IC 和胜率是量化最基础的预测力指标。这里的要求极为克制——IC 只要正,胜率只需略高于随机——因为过高的门槛会导致过拟合。
第二道:同质性(Homogeneity)
- 与已有成熟因子库的最大相关性 < 0.70
这道门防止的是:你"发现"的新因子其实只是已有因子的线性变形。FSA(Frequent Subtree Avoidance)机制也服务于此——当某个子树结构(如 zscore(ret(close,6),48))在 zoo 中频繁出现时,它会被列入禁止列表,后续生成不得使用。但也有例外:资金费率的子树被加入白名单,因为它确实有效,不应该被"封印"。
第三道:摩擦审计(Friction Audit)
- 扣除 taker 手续费 + 滑点 + 资金费率后的 Sharpe ≥ 0.30
这与 AutoQuant 的成本拆分直接对接。许多因子在"裸信号"上 IC 很高,但扣除交易成本后 Sharpe 归零——因为它们依赖高频换手。
第四道:生命周期(Lifespan)
- 验证集 Sharpe ≥ 0
- IC 半衰期 ≥ 1 bar
半衰期的计算方式:在训练数据上计算因子与未来 1-bar 收益的 IC,然后逐渐增加预测 horizon,找到 IC 衰减到一半的最短时滞。如果因子在训练集上看起来很显著,但在验证集上完全失效(Sharpe < 0),说明它过拟合了训练数据。
四道门全部通过,因子才被标记为 SURVIVED。任何一道不过,都是 KILL。
4.5 自我净化:Auto-Purge 与动物园管理
MCTS 运行过程中会产生大量因子,存入"动物园"(zoo)。但一个问题逐渐浮现:随着 zoo 膨胀,同质性门变得越来越难通过(因为参考库越来越大),导致后期的因子即使质量不错也会被误杀。
QuantumRandy 的解决方案:
- 自动清理:每轮 brutal filter 后,自动移除被杀死(且非种子)的因子
- 种群上限:非种子因子保留 top 50,其余淘汰
- 种子保护:种子因子(如
neg(zscore(funding_rate,42)))永远不会被清除
这形成了一个"优胜劣汰"的生态:好的因子留下,差的自动消失,zoo 保持在可控规模。
五、两个项目的共生关系
单独看每个项目,AutoQuant 是一个严谨的回测框架,QuantumRandy 是一个因子矿场。但放在一起,它们形成了一条完整的策略研发流水线:
QuantumRandy AutoQuant
│ │
│ LLM + MCTS 生成因子候选 │
│ 四道滤网初筛 │ STRICT4H 回测引擎
│ IC / Sharpe / 换手 / 相关性 │ 成本三分:费率 + 滑点 + 资金
│ │
├──────── 共享回测逻辑 ────────────────┤
│ │
│ t+1 执行 / 资金费率对齐 │
│ ffill 无偷看 / 成本扣除 │
│ │
▼ ▼
因子入选 leaderboard 策略参数搜索 + 情景鲁棒性验证
(SURVIVED/KILL 标记) (CAGR/Sharpe/月度胜率/回撤)具体而言:
- 回测层面:两个项目的回测引擎逻辑完全一致——t+1 执行、资金费率 ffill、成本拆分、CAGR/Sharpe/最大回撤的计算。QuantumRandy 的
backtest.py在本质上是一个轻量版的 AutoQuant 引擎。 - 验证层面:QuantumRandy 的第三道滤网(摩擦审计)直接使用了 AutoQuant 的成本建模方法论。一个因子能不能"活下来",取决于它在真实成本结构下的表现。
- 迭代层面:AutoQuant 筛选出的稳定策略,可以作为 QuantumRandy 的种子因子(seed formula),进入下一轮 MCTS 搜索。反过来,QuantumRandy 发现的新 alpha 结构,可以丰富 AutoQuant 的策略模板库。
六、关键设计决策
回顾这两个项目,有几个设计选择值得单独拿出来讲:
6.1 为什么是 4 小时 K 线?
4 小时是一个微妙的平衡。1 小时以下噪音太大,交易成本侵蚀严重;日线以上信号太少,样本不足。4 小时 K 线每年约 2190 根,既能提供足够的统计样本,又保持了合理的信噪比。更重要的是,资金费率恰好是每 8 小时(两根 4 小时 bar)结算一次,时间窗口天然对齐。
6.2 为什么资金费率这么重要?
在传统股票量化中,没有资金费率这种机制。但在加密货币永续合约中,资金费率是多头空头博弈的直接体现:当市场狂热时,资金费率飙升到年化 100%+,多方支付巨额资金成本;当市场恐慌时,资金费率转负,空方支付资金成本。
因此,资金费率既是一个市场情绪指标(高费率 = 过度乐观),又是一个实际交易成本(你做多的时候真的在付这笔钱)。忽略它,等于回测与现实脱节。
QuantumRandy 的 v0.7 版本命名为"Funding Rate Renaissance",核心发现就是:资金费率是通过 brutal filter 比例最高的因子来源。将本地模板中资金费率的出现率从 14% 提升到 46% 后,因子存活率显著改善。
6.3 奥卡姆剃刀:简单的东西更好
两个项目都内嵌了对复杂度的惩罚机制。AutoQuant 在 Stage II 筛选时限制换手密度(间接惩罚过度优化),QuantumRandy 则直接在 MCTS 评分中引入了指数级别的复杂度惩罚。
这不是审美偏好,而是统计现实:在有限的样本量下,更复杂的模型更容易过拟合。一个 2 操作符的均线交叉策略,比一个 6 操作符、4 层嵌套的"大杂烩"公式更可能在未来奏效。
6.4 不追求"最优",追求"稳健"
常规的量化研究往往追求"找到最高 Sharpe 的策略"。但 AutoQuant 的两阶段筛选,特别是 Stage II 的成本情景网格,隐含了一个更务实的目标:找到一个在多种成本情景下都不会崩掉的策略。
这个哲学也体现在 QuantumRandy 的评分函数中——五个维度各有权重,没有一个维度能单独主导 score。一个好的 alpha 因子需要在预测力、稳定性、低换手、多样性、防过拟合五个维度上都均衡。
七、局限与未完成
这两个项目都标注为"research/backtest framework only, not a live trading system"。目前的局限包括:
- 单一品种:默认仅支持 BTCUSDT 4h,跨品种(ETH、SOL、AVAX)尚需补充数据
- 无组合优化:当前独立评估每个因子的表现,未涉及多因子组合、仓位分配、协方差矩阵
- 无前向验证(walk-forward):验证窗口是静态切分的,而非滚动的
- 执行层面的简化:未模拟限价单的成交概率、市场深度、队列位置等微观结构
当然都是一个“复现论文”的级别,距离实战级别的因子挖掘还是很远的
评论已关闭