策略回测
写好策略只是第一步,更重要的是在历史数据上验证它能不能赚钱、回撤有多大。聚宽的回测引擎需要你在 initialize 里做好配置——佣金、滑点、复权、基准——这些设置直接影响回测结果的真实度。本章讲清配置项和风险指标怎么看。
一、设置基准 — set_benchmark
基准用来对比策略好坏,默认沪深 300:
set_benchmark('000300.XSHG') # 沪深 300
set_benchmark('600000.XSHG') # 单只股票
set_benchmark({'000001.XSHG':0.5, '000300.XSHG':0.5}) # 自定义组合
二、设置佣金与印花税 — set_order_cost
必须设置,否则回测偏乐观。OrderCost 的各项费率:
set_order_cost(OrderCost(
open_tax=0, # 买入印花税(股票为 0)
close_tax=0.001, # 卖出印花税 0.1%
open_commission=0.0003, # 买入佣金 万三
close_commission=0.0003, # 卖出佣金 万三
close_today_commission=0, # 平今仓佣金(期货)
min_commission=5 # 最低佣金 5 元
), type='stock')
type:'stock'/'fund'/'futures'/'index_futures'等。ref:可按品种('AU')或具体合约('AU1709')单独设费率。
三、设置滑点 — set_slippage
滑点模拟成交价与预期的偏差,让回测更贴近真实:
| 类型 | 用法 | 说明 |
|---|---|---|
| 固定值 | FixedSlippage(0.02) | 加减 0.01 元 |
| 百分比 | PriceRelatedSlippage(0.00246) | 按价格比例(系统默认) |
| 跳数(期货) | StepRelatedSlippage(2) | 按最小变动单位的倍数 |
set_slippage(FixedSlippage(0.02)) # 全局
set_slippage(PriceRelatedSlippage(0.002), type='stock') # 仅股票
set_slippage(StepRelatedSlippage(2), type='futures', ref='CU') # 仅铜
四、动态复权 — use_real_price
强烈建议开启。开启后回测中使用真实价格下单,数据 API 返回的是前复权价格:
set_option('use_real_price', True)
不开启时,所有价格基于建回测当天的基准日做前复权,可能导致不同日期回测结果不一致。开启后持仓中的送股/分红会自动体现在账户里。
五、成交量限制与避免未来数据
set_option('order_volume_ratio', 0.25) # 单笔成交不超过当日成交量的 25%
set_option('avoid_future_data', True) # 开启后取未来数据会报错
六、风险指标解读
回测结束后,聚宽在结果页展示一系列指标(每天 17:00 左右更新):
| 指标 | 含义 | 怎么看 |
|---|---|---|
| 策略收益 | 总收益率 | 和基准比 |
| 年化收益 | 折算到年的收益率 | 长期参考 |
| Alpha | 超额收益(与市场波动无关) | >0 说明有超额能力 |
| Beta | 对大盘的敏感度 | 1 表示同步,>1 放大,<1 平抑 |
| Sharpe | 每单位总风险的超额回报 | 越高越好,>1 不错,>2 优秀 |
| Sortino | 每单位下行风险的超额回报 | 比夏普更关注「坏的波动」 |
| 信息比率 | 单位跟踪误差的超额收益 | 衡量主动管理的性价比 |
| 最大回撤 | 净值从高点的最大跌幅 | 关系能不能拿住,越小越好 |
| 策略波动率 | 收益率的年化标准差 | 风险的直接度量 |
| 胜率 / 盈亏比 | 盈利交易占比 / 平均盈亏比 | 期望收益为正才有戏 |
Alpha > 0 说明策略跑赢了风险对应的「应该得到的收益」。一个高夏普、低回撤、正 Alpha 的策略才是好策略。
七、看懂超额收益曲线
聚宽用除法版超额收益 (策略净值/基准净值 - 1) 来消除净值规模的复利效应:
- 曲线上升 = 策略跑赢基准
- 曲线下降 = 策略跑输基准
在对数轴上,如果超额收益线稳定斜向上,说明策略有持续的 Alpha——这是最值得追求的形态。
八、回测工具函数
在投资研究中可以用 create_backtest 批量创建回测、get_backtest 获取回测结果,做参数优化和并行回测:
# 研究中创建回测
bt_id = create_backtest(algorithm_id='xxxx', start_date='2024-01-01',
end_date='2024-06-30', frequency='day',
initial_cash=1000000)
# 获取结果
gt = get_backtest(bt_id)
gt.get_results() # 收益曲线
gt.get_risk() # 风险指标
gt.get_positions() # 持仓详情
小结
回测前必设基准、佣金、滑点;建议开启动态复权和成交量限制;看结果重点看 Alpha、夏普、最大回撤,并关注超额收益曲线是否稳定向上。下一步学组合层面的优化:组合优化。