程序员量化交易实战 13:给策略参数做第一版网格搜索

有了指标以后,可以开始比较参数。

第 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 篇把参数候选、回测、指标和排序串起来。下一篇把候选结果保存成实验记录,为后面的策略晋升做准备。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值