本篇重点:本篇讲怎么用运行日志排查问题,以及怎么在回测历史里找回、复现和管理每一次回测。
1 系统日志面板
主界面右侧一栏是「系统日志」分组,从上到下是:日志显示区、「日志类型过滤」一排复选框、一排按钮。

1.1 日志级别和颜色
| 级别 | 颜色 | 内容 |
|---|---|---|
| DEBUG | 浅紫色 | 调试信息。正常运行时软件基本不输出这一级,主要在点「测试日志」时出现 |
| INFO | 白色 | 常规运行信息:启动、加载配置、回测开始和结束、策略里的 logging.info,以及回测中的「生成买入信号」「生成卖出信号」「每日统计」 |
| WARNING | 橙色 | 需要注意但不影响运行的情况,例如周期不匹配后继续运行、部分股票某个时间点没有数据 |
| ERROR | 红色 | 出错,可能影响运行结果 |
| TRADE | 蓝色 | 策略里包含 [TRADE] 的日志(委托出错、资金不足等提示记为 WARNING 或 ERROR)。回测时逐笔的委托、成交回报默认不输出,买卖情况看 INFO 里的买卖信号行,或者回测报告的交易记录 |
出错时,面板里只显示一句错误说明;完整的错误堆栈(Traceback)写在 app.log 文件里,排查问题时去文件里看。
1.2 按级别过滤
「日志类型过滤」后面有 DEBUG、INFO、WARNING、ERROR、TRADE 五个复选框,默认全部勾选。取消勾选某一级,面板会立即重新显示,只保留勾选的级别。例如只勾 ERROR 和 TRADE,可以快速看出错信息和策略自己标记的 [TRADE] 日志;逐笔成交回报默认不输出,看成交请用回测报告的交易记录。
过滤只影响面板显示,不影响 app.log 文件。
1.3 四个按钮
- 清空日志:清空面板上的内容,之后面板会显示一条「日志已清空」。不影响
app.log文件。 - 保存日志:弹出保存对话框,把面板上当前显示的内容(已经按过滤条件筛过的)保存成 .txt 文件。默认保存到日志文件夹,文件名形如
log_时间戳.txt。 - 测试日志:生成几条不同级别的示例日志和一条示例交易记录,用来确认面板显示和颜色是否正常。
- 回测历史管理:打开回测历史窗口,见本篇第 4 节。

点「测试日志」会输出几条示例,可以看到各级别的颜色:

1.4 和日志有关的两项设置
在工具栏「设置」→「基本设置」里:
- 延迟显示日志(默认开启):回测运行期间,日志先缓存起来,回测结束后一次显示到面板。回测过程中面板比较安静,速度也更快。想边跑边看日志时关闭这一项。
- 最大日志显示行数(默认 1000,范围 100~100000):面板最多保留多少行,超出后删掉最早的行。按级别过滤时,也只能在保留下来的这些行里筛选。
回测进度不逐条打印在面板里,显示在主窗口底部状态栏的进度条上(「回测进度: xx%」)。
面板行数有限,长回测的早期日志会被挤掉。需要完整记录时,直接看 app.log 文件。
2 日志文件 app.log
V2 的日志文件在:
%LOCALAPPDATA%\KhQuantOS\logs\app.log
在资源管理器地址栏输入 %LOCALAPPDATA%\KhQuantOS\logs 回车即可打开。软件每次启动时,会在日志里写一行「日志文件路径: …」,也可以从这里确认位置。
文件规则:
- 记录 INFO 及以上级别,包括出错时的完整堆栈。
- 每次启动接着往后写,不会清空。单个文件超过 20MB 时自动换新文件,旧文件依次改名为
app.log.1到app.log.5,最多保留 5 个。 - 数据管理窗口有自己的日志区,它的日志不进主界面面板。
反馈问题时,把出错前后的 app.log 内容一起提供,定位会快很多。
3 在策略里写日志
策略文件开头的 from khQuantImport import * 已经带入了 logging,直接调用即可:
from khQuantImport import *
def khHandlebar(data):
logging.info("进入买入条件判断") # INFO,白色
logging.warning("行情为空,本次跳过") # WARNING,橙色
logging.error("指标计算出错") # ERROR,红色
logging.info("[TRADE] 满足条件,准备买入") # 包含 [TRADE],显示为 TRADE,蓝色
return []
几点说明:
logging.debug()的内容不会记录,面板和文件里都看不到。调试时用logging.info()。print()的内容不显示在系统日志面板里。- 消息里带
[TRADE]时,面板会把它当作 TRADE 级别显示,并去掉这个标记。 - 想让某条信息醒目,用 WARNING 或 ERROR。不要在每次触发里都打印大量内容,Tick 或分钟触发时日志会非常多,既拖慢回测,也会把面板里的早期内容挤掉。
4 回测历史管理
4.1 每次回测自动存档
每次回测正常跑完,软件都会新建一个独立的文件夹保存这次的结果,不会覆盖、也不会复用以前的文件夹,连续快速运行两次也一样。V2 的位置是:
%LOCALAPPDATA%\KhQuantOS\backtest_results\
每个文件夹对应一次回测,文件夹名形如 strategy_5448e98d-123a4b5c_20250101_20250703_20260930_073257(依次是策略名的编码、保证每次不重名的后缀、回测起止日期、运行时间)。里面有:
config.csv:回测配置;trades.csv:交易明细;daily_stats.csv:每日统计;benchmark.csv:本次回测的基准指数数据(每次都由这次运行生成);summary.csv:汇总指标;- 当时的策略文件(.py)、配置文件(.kh)副本,以及这次运行实际使用的完整配置(文件名以
full_开头的 .kh,例如full_temp_running_config.kh;内存不足自动重跑、命令行运行时文件名会不同)。
回测报告窗口就是读取这些文件生成的。在报告窗口点「导出回测结果」可以直接打开这个文件夹(见 1.10)。
「设置」→「基本设置」里的「停止后直接退出」默认开启。开启时,回测中途点「停止运行」,不显示报告,也不保存这次记录。需要保留中途停止的结果时,先关闭这一项。
4.2 打开回测历史窗口
点主界面右侧「系统日志」面板下方的「回测历史管理」按钮,打开「回测历史结果管理器」。窗口打开后在后台扫描所有记录,记录多时需要等几秒。窗口底部的状态栏会显示扫描结果,例如「已加载 2 个有效结果,隔离 1 个不完整结果」。
表格各列:选择、策略名称、开始日期、结束日期、初始资金、最终资产、总收益率、年化收益率、最大回撤、创建时间、操作。点列标题可以按这一列排序;注意收益率、回撤这几列目前按文字排序,不一定是数值大小顺序,比较时以数字为准。

窗口上方的工具栏:
- 刷新列表:重新扫描回测结果文件夹。
- 删除选中:删除「选择」列里勾选的所有记录。
- 搜索:输入策略名称或日期,表格只显示匹配的记录。
- 筛选:全部、最近7天、最近30天、最近90天、自定义日期。
- 显示不完整结果(N):默认不勾选,括号里是不完整记录的条数。中途中断、缺少配置或统计文件的记录默认隐藏,勾选后才显示,可以一并删除。
4.3 每条记录的三个按钮
- 报告:打开这次回测的报告窗口,内容和回测刚跑完时一样。报告怎么看见《1.10 看懂回测报告》。
- 还原:把这次回测的配置恢复到主界面。点击后会弹出确认框,确认后:
1. 把存档里的策略文件和 .kh 配置文件复制回原来的位置;原位置有同名文件时会被覆盖。
2. 优先读取这次运行的完整配置(结果文件夹里以 full_ 开头的 .kh),把回测区间、股票池、触发方式、初始资金、数据字段勾选等参数填回主界面。内存不足自动重跑的回测、命令行跑的回测也一样能还原。
3. 弹窗列出已还原的内容和警告(例如存档里没有找到 .kh 文件)。
还原之后直接点「开始运行」,用的就是那次回测实际使用的配置。还原之后点「保存配置」,会让你另存为一个新文件,不会覆盖之前打开的 .kh。 - 删除:弹出确认框,确认后删除这条记录的整个文件夹,不能恢复。
「还原」会覆盖原路径下的同名策略文件。如果你在上次回测之后又改过策略,而且想保留改动,先把当前策略文件另存一份再还原。
4.4 什么时候用
- 复现:隔一段时间想重跑某次结果,点「还原」,参数和策略文件都回到当时的状态,再点「开始运行」。
- 对比:改了参数跑了几次,在表格里对比总收益率和最大回撤,再逐个点「报告」看细节。
- 清理:试验性的回测多了,用搜索或筛选找出来,勾选后点「删除选中」。
V3 的系统日志面板、过滤和四个按钮与 V2 相同;回测历史管理窗口的列和「报告」「还原」「删除」按钮也相同,更完整的说明见附录 A 第 12 节「回测结果的存放与管理」。另外,V3 的 Web 回测工作台有统一的历史结果列表,命令行里用 kh result 可以列出、查看和对比历史回测。
日志文件位置不同:V3 在 Windows 上优先写到程序目录旁的 logs 文件夹,写不进去时改用 用户目录\KhQuant\logs;macOS 在 ~/Library/Logs/khQuant/。可以从启动日志里的「日志文件路径」确认。
常见问题
问:面板里只看到一句错误,不知道哪一行出错?
答:打开 %LOCALAPPDATA%\KhQuantOS\logs\app.log,搜索这句错误,下面就是完整的堆栈,能看到出错的文件和行号。
问:策略里写了 logging.debug(),怎么看不到?
答:日志只记录 INFO 及以上级别,logging.debug() 的内容不会记录。改用 logging.info()。
问:回测时日志面板一直不动,是卡住了吗?
答:多半是开启了「延迟显示日志」(默认开启),日志会在回测结束后一次显示。进度看窗口底部的进度条。
问:中途停止的回测为什么在历史记录里找不到?
答:「停止后直接退出」开启时,手动停止的回测不保存记录。另外,缺少配置或统计文件的记录默认隐藏,勾选「显示不完整结果」可以看到。
问:删除的回测记录能找回吗?
答:不能。删除会直接删掉整个结果文件夹。
- 内置 VSCode 断点调试(Windows 版):停在出错行,查看每个变量
- Web 工作台:统一查看历史结果,关掉浏览器任务照常运行
- CLI:kh result 列出、对比历史回测
本篇基于开源 V2 和 V3.4.1.10 编写。
