4、随机搜索法:随机搜索原理、与网格搜索对比、适用场景
讲完了网格搜索,咱们来聊聊随机搜索。
说实话,我第一次接触随机搜索时,心里是有点抵触的。你想想看,做量化交易讲究的是严谨、精确,怎么能用「随机」这种听起来就不靠谱的方法?
但后来我在一个CTA策略项目里被网格搜索折磨得够呛——参数空间稍微大一点,计算量就爆炸了。那次我硬着头皮试了随机搜索,结果出乎意料的好。嗯,从那以后,我的工具箱里就永远给随机搜索留了个位置。
4.1 随机搜索的核心原理
随机搜索的原理,说白了就一句话:在参数空间里随机采样,而不是穷举所有组合。
网格搜索像是一个强迫症患者,非要走遍每一个格子。随机搜索则像个随性的探险家,走到哪算哪,但走的路足够多,也能发现宝藏。
核心思想:给定参数空间,每次随机选取一组参数组合进行回测,重复N次后,从所有结果中选出最优的那组。
具体流程是这样的:
- 定义每个参数的取值范围(比如均线周期5~100,止损比例0.5%~5%)
- 设定采样次数N(比如1000次)
- 每次从每个参数的分布中随机抽取一个值,组成一组参数
- 用这组参数跑回测,记录结果
- 重复N次,选出最优结果对应的参数组合
这里有个关键点:采样方式。我习惯用均匀分布来采样,但如果你对某些参数区间有先验知识,也可以用其他分布。比如我知道某个参数大概率在某个区间表现好,就可以让采样密度偏向那里。
来看一段简单的Python代码,感受一下:
import numpy as np
# 定义参数范围
param_ranges = {
'ma_short': (5, 50),
'ma_long': (20, 200),
'stop_loss': (0.005, 0.05)
}
# 随机搜索
n_iterations = 1000
best_score = -np.inf
best_params = None
for i in range(n_iterations):
# 随机采样
params = {
'ma_short': np.random.randint(5, 51),
'ma_long': np.random.randint(20, 201),
'stop_loss': np.random.uniform(0.005, 0.05)
}
# 确保短周期 < 长周期
if params['ma_short'] >= params['ma_long']:
continue
# 回测并评估(伪代码)
# score = backtest(params)
# if score > best_score:
# best_score = score
# best_params = params
print(f"最优参数: {best_params}")
print(f"最优得分: {best_score}")
我的小技巧:采样次数N怎么定?我一般先设一个较小的值(比如200次),看看结果是否稳定。如果每次跑出来的最优参数差异很大,就增加N。如果差异不大,说明参数空间已经被充分探索了。
4.2 随机搜索 vs 网格搜索:一场公平的较量
咱们来做个对比。假设有3个参数,每个参数有10个候选值。
| 对比维度 | 网格搜索 | 随机搜索 |
|---|---|---|
| 搜索次数 | 10×10×10 = 1000次 | 可自由设定,比如100次 |
| 搜索策略 | 穷举所有组合 | 随机采样 |
| 计算成本 | 随参数数量指数增长 | 线性增长,可控 |
| 结果确定性 | 确定能找到最优组合 | 概率性找到近似最优 |
| 高维空间表现 | 极差,维度灾难 | 较好,不受维度影响 |
| 实现复杂度 | 简单直观 | 稍微复杂一点 |
你可能会问:网格搜索能找到全局最优,随机搜索只能找到近似最优,那为什么还要用随机搜索?
原因很简单:在现实中,你根本等不到网格搜索跑完。
我曾经在一个策略上有6个参数需要调优,每个参数取20个值。网格搜索需要跑20^6 = 6400万次回测。按每次回测0.1秒算,需要跑740天。你想想看,等跑完了,市场早就变天了。
而随机搜索,我设了5000次采样,跑了不到10分钟就找到了一个相当不错的参数组合。虽然不是理论上的全局最优,但实盘表现已经足够好了。
注意:随机搜索不是万能的。如果参数空间里最优解的区域非常小、非常尖锐,随机采样可能很难命中。这时候可以考虑先用随机搜索粗筛,再用局部搜索精调。
4.3 适用场景:什么时候该用随机搜索?
根据我的实战经验,以下场景特别适合随机搜索:
- 参数数量多(≥4个):网格搜索的维度灾难会让你崩溃,随机搜索是更好的选择
- 计算资源有限:如果你只有一台笔记本,或者回测一次要跑很久,随机搜索能帮你快速找到「够用」的参数
- 参数范围大:比如均线周期从5到500,网格搜索需要很多格子,随机搜索可以灵活采样
- 对最优解要求不极端:你不需要理论上的全局最优,只要一个「足够好」的实用参数
- 快速原型验证:在策略开发初期,快速验证一个想法是否可行,随机搜索比网格搜索高效得多
反过来,以下场景不太适合随机搜索:
- 参数很少(1~2个),且取值范围不大
- 对精度要求极高,必须找到全局最优
- 参数空间非常崎岖,最优解区域极小
我的实战建议:我通常的做法是「两步走」。先用随机搜索跑几百次,找到几个有潜力的区域。然后在这些区域附近,用网格搜索或更精细的随机搜索做局部优化。这样既快又准。
4.4 随机搜索的进阶技巧
嗯,这里再分享几个我踩过的坑和总结的技巧:
技巧一:分层采样
我曾经在一个趋势跟踪策略里,发现某些参数组合虽然回测表现好,但实盘表现很差。后来我意识到,这是因为随机采样时,某些参数组合虽然数值上合理,但逻辑上不合理(比如短周期均线比长周期还长)。
解决办法是:在采样时加入约束条件,过滤掉明显不合理的组合。
技巧二:自适应采样
别傻傻地从头到尾都用均匀分布。我习惯先跑一轮随机搜索,看看哪些参数区域表现比较好。然后在第二轮采样时,让采样密度向这些区域倾斜。这有点像「先粗搜,再精搜」的思路。
技巧三:记录采样历史
这个坑我踩过。有一次随机搜索跑了一晚上,结果忘了保存中间结果,程序崩溃后一切归零。从那以后,我每次采样都会把参数和结果实时写入文件。这样即使中断,也能从断点继续。
一句话总结:随机搜索不是「瞎蒙」,而是一种有策略的随机。它用计算效率换搜索精度,在大多数实际场景中,这个交换是值得的。
这张图把随机搜索的流程梳理得很清楚。核心就是那个循环:采样→评估→记录→再采样。简单,但有效。