两个项目主要是对论文的复现,仅做学术研究,距离实战距离尚远。

*仓库地址在文末


一、缘起

加密货币永续合约市场与传统股票市场有本质差异: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 也大量用于 zscoresmaema。特别是资金费率在字段选择中的权重被提高到 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):验证窗口是静态切分的,而非滚动的
  • 执行层面的简化:未模拟限价单的成交概率、市场深度、队列位置等微观结构

当然都是一个“复现论文”的级别,距离实战级别的因子挖掘还是很远的


AutoQuant

QuantumRandy

标签: none

评论已关闭