我想要一个能够自动发现交易策略的系统,而不需要我手动调整每个参数。因此,我构建了这样一个系统。
finclaw 是一个用 Python 编写的开源量化金融引擎。它的核心功能之一是一个进化引擎,该引擎利用遗传算法的原理,自动变异、评估和改进交易策略。在对 NVDA 数据运行了 89 代后,我得到了以下收获。
手动策略调整的问题
每个量化交易者都会遇到同样的瓶颈:你编写一个策略,进行回测,调整一个参数,再次回测。重复 200 次。最终,你会在不知不觉中对历史数据过拟合。
我希望有一个能够系统性探索策略空间的工具——尝试一些我想不到的组合,并通过有原则的选择过程而不是凭直觉来淘汰无效的策略。
进化引擎的工作原理
核心循环看似简单:
-
- 种子 — 从 YAML 策略定义(入场规则、出场规则、过滤器)开始
评估 — 回测策略并计算适应度分数(收益、夏普比率、回撤、胜率)
- 分析 — 查看策略失败的地方(亏损交易聚集、糟糕的退出、错误的市场时机)
- 提出 — 生成有针对性的变异:收紧止损、调整RSI阈值、添加成交量过滤器
- 变异 — 应用最佳提案以创建子策略
- 选择 — 保持前N个策略的帕累托前沿
- 重复 — 直到收敛或达到最大代数
每个策略都是一个YAML文件,DSL引擎将其编译为可执行的交易规则:
name: momentum_rsi_evolved
entry:
- rsi_14 < 35
- ma_cross(5, 20) == "golden"
- volume > volume_ma_20 * 1.3
exit:
- rsi_14 > 72
- trailing_stop: 8%
filters:
- trend_adx_strength > 20
变异器修改这些规则——扩大RSI带宽,交换移动平均周期,添加或移除过滤器——而评估器则对每个变体进行全面的回测。
运行它
# 安装 finclaw
pip install finclaw
# 进化一个策略,持续 50 代
finclaw evolve my_strategy.yaml --symbol NVDA --generations 50 --frontier-size 5
或者通过 Python API:
from src.evolution.engine import EvolutionEngine, EvolutionConfig
from src.strategy.expression import OHLCVData
config = EvolutionConfig(
max_generations=50,
frontier_size=5,
no_improvement_limit=10,
)
engine = EvolutionEngine(config=config)
result = engine.run(seed_strategy, my_data)
print(f"最佳得分: {result['best_score'].composite():.4f}")
print(f"代数: {result['generations_run']}")
找到的89代
我用基本的黄金交叉动量策略对NVDA(2022-2025日数据)进行了初始化,并让其运行。
第一代(种子): 夏普比率 0.42,最大回撤 -28%,胜率 38%
种子表现平平。在2022年的回撤期间,出现了大量的反复交易。
第23代:夏普比率0.91,最大回撤-19%,胜率44%
引擎发现,添加一个成交量确认过滤器(成交量 > 1.5倍20日均值)消除了大部分虚假突破。同时,将跟踪止损从12%收紧至8%。
第56代:夏普比率1.24,最大回撤-15%,胜率48%
一次变异添加了一个ADX趋势强度过滤器(ADX > 25),防止在震荡横盘市场中入场。这是最大的单一改进——将回撤降低了4个百分点。
第89代(最终版):夏普比率1.31,最大回撤-14%,胜率51%
最终策略与种子几乎没有相似之处。它将RSI阈值从30/70演变为33/68,添加了两个原本没有的过滤器,并将固定止损改为带有ATR倍数的跟踪止损。
抗过拟合问题
如果不小心,遗传算法会成为过拟合的机器。以下是我为应对这一问题所构建的内容:
前向验证。评估器不仅仅是在完整数据集上进行回测。它使用前向滑动分割——在2年内训练,在接下来的6个月内测试,然后向前滑动。适应度分数是样本外表现。
蒙特卡洛压力测试。 每个候选策略还会通过100次蒙特卡洛洗牌进行测试,以检查其收益曲线是否稳健,还是仅仅运气好。
帕累托前沿。 不再优化单一指标,而是跟踪多个目标(收益、风险、一致性)。一个为了显著降低回撤而牺牲部分收益的策略仍然会留在候选中。
# 使用前向验证(内置)运行
finclaw evolve strategy.yaml --symbol AAPL --generations 30 --start 2020-01-01
架构
引擎由四个可插拔组件构成:
- 评估器 — 运行回测并计算
FitnessScore(由收益、夏普比率、回撤、胜率组成的综合指标) - 提案者 — 分析失败并生成变异候选
- 变异器 — 对策略定义应用 YAML 级别的变异
- 边界 — 管理帕累托最优策略集
每个组件都是可替换的。您可以插入自己的评估器,使用不同的回测引擎,或者编写一个自定义提案者,针对特定的策略弱点。
我所学到的
成交量过滤器比入场信号更重要。 在数十个演化策略中,影响最大的变异始终是某种形式的成交量确认。市场噪声很大;成交量可以告诉您信号是否真实。
止损策略向基于ATR的跟踪止损演变。 固定百分比止损一贯被波动性调整的止损所取代。这是有道理的——对于波动性大的股票,5%的止损过于紧凑,而对于平稳的股票则过于宽松。
规则越少越好。 引擎反复修剪过于复杂的策略。表现最佳的策略通常只有3-5个入场条件,而不是10个。奥卡姆剃刀原则在选择压力下得到了体现。
尝试一下
finclaw 是开源的。进化引擎可以在任何 OHLCV 数据上运行——美国股票、A 股、加密货币。
pip install finclaw
finclaw evolve your_strategy.yaml --symbol AAPL --generations 20
完整的代码库,包括 240+ 个技术因子、前向回测和纸上交易:
GitHub 上的 finclaw | Python · 240+ 因子 · 进化引擎 · 纸上交易
如果您对AI代理安全感兴趣(这是我工作的另一个领域),请查看ClawGuard——一个开源的AI代理安全引擎,拥有超过285种威胁模式。
进化引擎代码位于src/evolution/。欢迎提交PR。