RQAlpha 项目研究站 · 回测输出与指标
RQAlpha 回测结果怎么看:pickle 结构、指标与出图
回测结束时 RQAlpha 会把结果写成一个 pickle 文件,内容是一个字典:summary(摘要指标)、各类 portfolios(组合市值序列)、positions(持仓)、trades(交割单)、plots(你在策略里 plot 的曲线)。用 pandas 读出来就能做二次分析,也可以用 rqalpha plot 直接出图。
摘要与风险指标
组合市值序列
持仓与交割单
策略内 plot 记录
依据官方文档列出的结果字典键整理的结构示意;非官方架构图。
结果文件里有什么
官方文档给出的 keys 清单;RQAlpha 不同版本可能略有增减,以实际输出为准。
| Key | 内容 | 怎么用 |
|---|---|---|
summary | 回测摘要:收益、风险、成本等单值指标字典 | 批量对比的核心数据来源 |
total_portfolios | 总账户市值时序(DataFrame,索引为日期) | 画净值曲线、算自定义指标 |
stock_portfolios / future_portfolios | 股票 / 期货账户市值时序 | 混合策略里分离两类账户表现 |
benchmark_portfolios | 基准的市值序列 | 做相对收益对比;没设 benchmark 时无意义 |
stock_positions / future_positions | 持仓明细(含成本、市值、盈亏、可卖数量等) | 复盘每笔持仓的盈亏贡献 |
trades | 交易详情(交割单) | 核对成交频率、滑点影响与换手 |
plots | 策略中 plot() 记录的自定义指标序列 | 把信号、仓位等中间量带出来可视化 |
读取结果的最小写法
import pandas as pd → result_dict = pd.read_pickle('result.pkl') → result_dict['summary'] 看指标、result_dict['total_portfolios'][-5:] 看最近几天的组合状态。
summary 里的指标分四类
下面按用途分类解释官方示例中出现的字段;具体实现由 RQAlpha 与 rqrisk 计算,口径以官方为准。
| 类别 | 字段(示例) | 看什么 |
|---|---|---|
| 收益类 | total_returns、annualized_returns、alpha、benchmark_total_returns、benchmark_annualized_returns | 策略赚了多少、相对基准的超额有多少 |
| 风险类 | max_drawdown、volatility、downside_risk、sharpe、sortino、information_ratio、tracking_error、beta | 回撤能不能扛、波动与基准的偏离程度 |
| 成本类 | transaction_cost、commission_multiplier、slippage | 费用与滑点在多大程度上吃掉了收益 |
| 状态类 | start_date、end_date、frequency、run_type、matching_type、strategy_file、market_value、cash、portfolio_value | 确认「这份结果是怎么跑出来的」——复盘与对比前建议先看 |
frequency(1d/1m)、matching_type(current_bar/next_bar)、commission_multiplier 与 slippage 不同,结果可能差很多。对比两份回测前,先把这四项对齐;这四项都在运行参数里,具体写法见 运行策略。回测输出与出图的几种方式
都由 RQAlpha 的 sys_analyser 等系统 Mod 提供,参数在运行策略页有完整对应。
| 方式 | 命令/参数 | 适用场景 |
|---|---|---|
| 保存结果文件 | -o result.pkl | 需要二次分析、批量对比 |
| 回测后立即出图 | -p / --plot(--no-plot 关闭) | 本机快速看曲线 |
| 出图并保存 | --plot-save 路径 | 无图形界面的服务器 / 需要归档图 |
| 事后重新出图 | rqalpha plot result.pkl | 已存了 pkl 想补图,不必重跑回测 |
| 交易详情与报告 | --report(sys_analyser)、CSV 输出与 Excel 模板 | 需要留档、交付或线下核对成交 |
批量比较多次回测
RQAlpha 官方「参数调优」文档给出的对比写法,本质是把每个 pkl 的 summary 摊平成一行。
三步得到参数对比表
1. 用 glob.glob("results/*.pkl") 找到所有结果文件;
2. 逐个 pd.read_pickle,从 summary 里取 annualized_returns、sharpe、max_drawdown 等字段,连同文件名拼成一行;
3. 用 pandas.DataFrame 汇总后按不同指标排序,观察哪些参数区间表现稳定。
指标口径的五个边界
这部分不是功能说明,而是避免误读结果的纪律。
| 易误读点 | 为什么会这样 | 建议做法 |
|---|---|---|
| 基准相关指标看似异常 | 没有设置 benchmark 就没有基准参照 | 对比 alpha/beta/information_ratio 前先确认设了基准 |
| 同策略两次结果不一致 | 撮合引擎、滑点、手续费乘数或数据版本变了 | 对齐 summary 的状态类字段后再比较 |
| 年化指标看起来偏高 | 回测区间短、单边行情或数据样本不足 | 拉长区间、跨越牛熊,或看滚动指标 |
| 回撤比预期小 | 日频撮合在极端行情下的成交假设偏乐观 | 提高滑点与手续费假设、降低仓位上限做压力测试 |
| plots 为空 | 策略里没有调用 plot() | 在 handle_bar 中显式记录关键中间量 |
summary 每个字段是什么?照着官方示例输出逐项核对
下表用官方文档给出的 simple_macd 策略回测输出(2016-01-04 ~ 2017-01-19)做对照:左列字段名,第二列是官方示例里的值,后两列说明它回答什么问题、容易被误读在哪。数值随策略与区间变化,字段名以 RQAlpha 实际输出的 keys 为准。
| 字段 | 官方示例输出的值 | 回答什么问题 | 注意点 |
|---|---|---|---|
total_returns | 0.027 | 区间累计收益率 | 区间越短,少数几段行情对它的影响越大 |
annualized_returns | 0.025 | 按年折算的收益率 | 不足一年的区间做年化会放大比值,别直接与多年实盘收益类比 |
benchmark / benchmark_total_returns / benchmark_annualized_returns | 000001.XSHG / -0.0599 / -0.0573 | 基准是谁、基准自身涨跌多少 | 没设置 benchmark 时,这几个字段没有参照意义 |
alpha | 0.027 | 相对基准的超额收益 | 口径由 RQAlpha 与 rqrisk 实现,先对齐基准与区间再比较 |
beta | 0.314 | 相对基准的系统性风险暴露 | 基准不同的两次回测不可比;没有基准数据时读数无意义 |
volatility | 0.125 | 收益波动率(过程风险) | 与回撤幅度(max_drawdown)是两种视角:波动率低不等于回撤小 |
downside_risk | 0.143 | 只统计下行部分的波动 | 与 sortino 配套看;单独看容易忽略上涨端的波动 |
max_drawdown | 0.088 | 区间内从高点到低点的回撤幅度 | 日频撮合的成交假设偏乐观,实盘回撤通常更大 |
sharpe / sortino | 0.016 / 0.014 | 单位风险换来的收益 | 无风险利率与年化方式由 RQAlpha 决定,跨软件比同一指标前先对齐这两项 |
information_ratio / tracking_error | 0.457 / 0.181 | 相对基准的稳定性与偏离度 | 同样依赖基准;不设基准时无法解读 |
transaction_cost | 27467.462 | 区间累计交易成本 | 要跟手续费乘数、滑点一起看,才知道成本假设是否过于温和 |
commission_multiplier / slippage / margin_multiplier | 1 / 0 / 1 | 手续费乘数、滑点与保证金乘数 | 三项都是「结果可比性」开关,任何一项变了结果都会变 |
cash / frozen_cash / market_value / portfolio_value / pnl | -617.642 / 0.0 / 1027242.0 / 1026624.358 / 26624.358 | 资金与市值结构 | 示例里 cash 为负,说明 RQAlpha 的资金口径含融资/保证金占用,不能读成「账户没钱了」 |
frequency / run_type / matching_type / strategy_name / strategy_type | 1d / BACKTEST / CURRENT_BAR_CLOSE / simple_macd / stock | 这份结果是怎么跑出来的 | 对比两份结果前先把这几项对齐,否则差异可能来自设置而非策略 |
result_dict['summary'].keys() 与这张表对照,缺的字段不要凭印象补,缺哪个就在代码里取默认值。拿到结果文件之后:RQAlpha 的几种用法怎么选?
结果能做什么,取决于运行时加了哪些参数。先看用法对照,再看可复制的步骤。
| 用法 | 怎么做 | 得到什么 | 适用场景 | 注意点 |
|---|---|---|---|---|
| 只看摘要 | 不加输出参数直接 rqalpha run … | 控制台打印的收益与 Risk 摘要 | 先快速判断一次回测值不值得深看 | 不落文件,事后既无法追溯明细,也无法用 rqalpha plot 补图 |
| 存下来做二次分析 | 加 -o result.pkl,再用 pandas.read_pickle 读 | 指标字典 + 市值 / 持仓 / 交割单的 DataFrame | 自定义指标、批量对比、留档 | pkl 是 Python 对象,换机器读取前先保证依赖版本一致 |
| 出图与归档 | -p / --plot(--no-plot 关闭);无图形界面用 --plot-save 路径;事后补图用 rqalpha plot | 收益曲线图(可保存成文件) | 汇报、归档、服务器上出图 | 事后补图的前提是当初存了 -o 的 pkl |
| 核对成交明细 | --report(sys_analyser 保存交易详情),再读 trades 与 stock_positions | 交割单与逐日持仓明细 | 与券商流水核对、检查换手与滑点假设 | total_orders、total_trades、value_percent 按日输出在持仓表里,需要自己聚合 |
| 做相对收益评价 | 运行时加 -bm/--benchmark 000300.XSHG | 让 alpha / beta / tracking_error 有参照基准 | 与指数对比、评价超额能力 | 不设基准时这些字段看不出结论,别硬解释 |
四步把一次回测变成可用材料
1. 存结果并出图(官方教程写法):rqalpha run -f examples/golden_cross.py -s 2014-01-01 -e 2016-01-01 --account stock 100000 -p -bm 000001.XSHE -o result.pkl —— 指定基准、输出结果文件并画曲线(预期输出:控制台打印收益与 Risk,当前目录出现 result.pkl);
2. 读指标与序列:result_dict = pd.read_pickle('result.pkl') → result_dict['summary']['sharpe'] → result_dict['total_portfolios'][-5:](预期输出:先是一个指标 dict,再是一个以日期为索引、含 annualized_returns、daily_pnl、market_value、portfolio_value、total_returns、transaction_cost 等列的 DataFrame);
3. 事后补图:rqalpha plot result.pkl --plot-save plot.png —— 不重跑回测,直接把图存成文件(预期输出:生成 plot.png;这是官方「扩展命令行」章节给出的写法);
4. 批量汇总:用 glob.glob("results/*.pkl") 遍历结果目录,取每个 summary 的 annualized_returns、sharpe、max_drawdown 拼成一张 DataFrame,再分别按 sharpe 与 annualized_returns 排序(预期输出:两张 Top 10 列表,用来看哪些参数区间稳定)。
-o 与 --report 不是一回事:前者把回测数据输出到指定文件,后者保存交易详情。两者都不开时,RQAlpha 只在控制台给一段摘要,事后无法补图、也无法逐笔核对成交——需要留档时建议两者都开。常见问题
结果文件只能用 pickle 吗?
RQAlpha 官方流程以 pickle 为主(pandas 可直接读),此外 sys_analyser 支持交易详情与报告输出、CSV 与 Excel 模板。若需要喂给别的系统,建议在读取 pickle 后自行导出为 CSV/Parquet。
能只要指标、不存明细吗?
可以:不加 -o 也能在控制台看到收益与风险输出(官方「10 分钟教程」里回测结束会显示收益与 Risk),但指标细节与明细就无法事后追溯,无法使用 rqalpha plot。建议至少保留一个结果文件,便于复盘。
sharpe、sortino 这些指标怎么算的?
由 RQAlpha 引用的 rqrisk 库计算。不同软件在无风险利率、年化方式上取值不同,跨软件对比同一指标时,先把这两项口径对齐,否则差异可能来自算法而非策略。
能输出 HTML 或 PDF 报告吗?
RQAlpha 官方文档描述的输出形式是 pickle、图表、CSV 与 Excel 模板,未承诺内置 HTML/PDF 报告。需要定制报告,可在读取结果后用 pandas/matplotlib 自行生成。
trades 能导出成 Excel 核对吗?
可以先读 pickle 取出 trades,再用 pandas 的 to_excel 导出(框架依赖里已包含 openpyxl)。这样便于与券商流水逐笔核对。
想跳过写策略、直接拿到回测结论可以吗?
RQAlpha 的输出建立在「你自己写的策略」之上,它不提供现成策略结论。若你只是想快速建立一个研究结论并做指标计算,可看对比页里 EasyClaw 的 quant-analyst 技能方向(回测与风险指标建模),两者无已证实集成。