4、随机搜索法:随机搜索原理、与网格搜索对比、适用场景

讲完了网格搜索,咱们来聊聊随机搜索。

说实话,我第一次接触随机搜索时,心里是有点抵触的。你想想看,做量化交易讲究的是严谨、精确,怎么能用「随机」这种听起来就不靠谱的方法?

但后来我在一个CTA策略项目里被网格搜索折磨得够呛——参数空间稍微大一点,计算量就爆炸了。那次我硬着头皮试了随机搜索,结果出乎意料的好。嗯,从那以后,我的工具箱里就永远给随机搜索留了个位置。

4.1 随机搜索的核心原理

随机搜索的原理,说白了就一句话:在参数空间里随机采样,而不是穷举所有组合

网格搜索像是一个强迫症患者,非要走遍每一个格子。随机搜索则像个随性的探险家,走到哪算哪,但走的路足够多,也能发现宝藏。

核心思想:给定参数空间,每次随机选取一组参数组合进行回测,重复N次后,从所有结果中选出最优的那组。

具体流程是这样的:

  1. 定义每个参数的取值范围(比如均线周期5~100,止损比例0.5%~5%)
  2. 设定采样次数N(比如1000次)
  3. 每次从每个参数的分布中随机抽取一个值,组成一组参数
  4. 用这组参数跑回测,记录结果
  5. 重复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 随机搜索的进阶技巧

嗯,这里再分享几个我踩过的坑和总结的技巧:

技巧一:分层采样

我曾经在一个趋势跟踪策略里,发现某些参数组合虽然回测表现好,但实盘表现很差。后来我意识到,这是因为随机采样时,某些参数组合虽然数值上合理,但逻辑上不合理(比如短周期均线比长周期还长)。

解决办法是:在采样时加入约束条件,过滤掉明显不合理的组合。

技巧二:自适应采样

别傻傻地从头到尾都用均匀分布。我习惯先跑一轮随机搜索,看看哪些参数区域表现比较好。然后在第二轮采样时,让采样密度向这些区域倾斜。这有点像「先粗搜,再精搜」的思路。

技巧三:记录采样历史

这个坑我踩过。有一次随机搜索跑了一晚上,结果忘了保存中间结果,程序崩溃后一切归零。从那以后,我每次采样都会把参数和结果实时写入文件。这样即使中断,也能从断点继续。

一句话总结:随机搜索不是「瞎蒙」,而是一种有策略的随机。它用计算效率换搜索精度,在大多数实际场景中,这个交换是值得的。

随机搜索核心逻辑流程图 开始随机搜索 定义参数范围 & 设定采样次数N 循环 i = 1 到 N 从参数分布中随机采样一组参数 回测评估,记录结果 i=N? 结束

这张图把随机搜索的流程梳理得很清楚。核心就是那个循环:采样→评估→记录→再采样。简单,但有效。