有了指标以后,可以开始比较参数。
第 13 篇先做最朴素的网格搜索:短均线窗口、长均线窗口、仓位比例三类参数组合起来,每组跑一次回测,然后按评分排序。它不聪明,但透明、可复现,适合作为后面大模型辅助策略研究的基线。

先不要急着让模型改策略
参数搜索最容易变成过拟合。
所以第一版先把过程写得足够清楚:候选参数怎么生成,哪些组合被过滤,评分怎么算,结果怎么排序。
几个容易混在一起的名词先拆开:
| 名词 | 含义 |
|---|---|
| 参数 | 策略规则里的可调数值,例如均线窗口、仓位比例、止损阈值 |
| 网格搜索 | 把每个参数列出几个候选值,穷举组合逐个回测 |
| 过拟合 | 参数在这段历史上很好,换一段历史就失效 |
| 样本内 | 用来挑参数的那段数据 |
| 样本外 | 参数挑完后,用来验证是否还能工作的另一段数据 |
第 13 篇还没有做样本外验证,所以它只能产出“候选”,不能直接产出“可上线策略”。这个边界要写在代码和文章里。
参数候选
第 13 章新增 app/parameter_search.py。
@dataclass(frozen=True)
class ParameterCandidate:
short_window: int
long_window: int
position_ratio: float
候选生成时会过滤无效组合:
if short_window <= 1 or long_window <= short_window:
continue
if not 0 < position_ratio <= 1:
continue
这能避免出现短窗口大于长窗口、仓位比例为 0 或超过 100% 这类明显无意义参数。
每组参数都跑同一套回测
搜索函数会遍历候选参数:
backtest = run_signal_backtest(
symbol,
all_bars,
initial_cash=initial_cash,
position_ratio=params.position_ratio,
short_window=params.short_window,
long_window=params.long_window,
)
metrics = compute_performance_metrics(backtest.equity_curve, backtest.trades, initial_cash, backtest.max_drawdown)
这样第 10 篇的回测和第 12 篇的指标就串起来了。
评分要惩罚风险和无交易
当前评分函数很简单:
def score_search_result(result: ParameterSearchResult) -> float:
metrics = result.metrics
drawdown_penalty = abs(metrics.max_drawdown) * 0.5
turnover_penalty = max(0.0, metrics.turnover - 4.0) * 0.02
trade_penalty = 0.01 if metrics.trade_count == 0 else 0.0
return round(metrics.total_return - drawdown_penalty - turnover_penalty - trade_penalty, 6)
它不会保证最优,但能表达一个工程态度:收益不是唯一目标,深回撤、高换手和无交易候选都应该被扣分。
当前主线联动运行
现在主线仓库里有一个从第 13 篇跑到第 15 篇的可执行示例:
git clone https://github.com/ax2/zi-quant-platform.git
cd zi-quant-platform
uv sync --extra dev
uv run python -m scripts.chapter_examples strategy-promotion --source sample
第 13 篇对应的是参数搜索部分:

这次样例里排名前三的候选都使用 15 日长窗口、0.8 仓位比例,收益和回撤相同。这不是异常,而是一个很常见的信号:当前数据和策略规则太简单,不同短窗口没有拉开差异。真实研究里看到这种结果,应该继续做样本外验证,而不是因为排名第一就直接晋升。
本章更新与代码仓库
本章更新内容:
- 新增
app/parameter_search.py。 - 实现参数网格生成、候选回测、指标计算、风险惩罚评分和结果 payload。
- 新增
tests/test_parameter_search.py,覆盖无效参数过滤、排序和空数据边界。 - 在当前主线补充
scripts.chapter_examples strategy-promotion联动示例,可真实运行第 13-15 篇代码链路。 - 补充参数、网格搜索、过拟合、样本内和样本外的背景说明。
代码仓库:
https://github.com/ax2/zi-quant-platform
本章代码:
git clone https://github.com/ax2/zi-quant-platform.git
cd zi-quant-platform
git checkout chapter-13
uv sync --extra dev
uv run pytest tests/test_parameter_search.py
第 13 章全量测试通过:179 passed,仍只有既有 FastAPI deprecation warning。
本篇小结
参数搜索不是为了榨出漂亮收益,而是为了让策略候选的产生过程可复查。
第 13 篇把参数候选、回测、指标和排序串起来。下一篇把候选结果保存成实验记录,为后面的策略晋升做准备。

407

被折叠的 条评论
为什么被折叠?



