2.2 命令行模式与 AI 智能策略研究

适用版本 V3 WindowsmacOSLinux
推荐 · 必读
V3 用户只读这一篇:先用 AI 助手上手,再看细节
命令行 kh 加上 Codex、Claude Code 这类 AI 助手,是使用 khQuant 的核心方式,也是我们最推荐的方式:你用中文说想研究什么,AI 调用 khQuant Skill 和 kh 下数据、改策略、批量回测、汇总排名,最后把结论和风险讲给你听。本篇这样安排:
  1. 第 1 节,五分钟上手:装好 AI 助手和 Skill,用一段中文让 AI 跑出第一份研究;
  2. 第 2 节:看一次真实研究的完整结果;
  3. 第 3~6 节:AI 助手和 Skill 的细节、结果管理、常用参数和排错;
  4. 第 4 节(附):不用 AI、自己动手敲命令,给有兴趣的读者。

本篇重点:本篇讲 V3 最推荐的用法:用中文把研究任务交给 AI 助手,它通过 kh 命令行下数据、跑回测、汇总结果,你只负责批准和核对。

1 五分钟上手:让 AI 助手替你做研究

下面用一个研究目录 C:\khdemo_ai 举例(Mac、Linux 可以用 ~/khdemo_ai),请换成你自己的路径。所有研究文件都放在这个目录里,不会弄乱你平时的数据和策略。

1.1 确认 kh 能用

装好 V3(见 2.1)后,打开一个新的终端(Windows 用 PowerShell),输入:

kh version
新开的 PowerShell 里运行 kh version
新开的 PowerShell 里运行 kh version

显示版本号就可以了。没反应的话按平台检查:

平台做法
Windows 安装版安装时保留「添加 kh 命令到系统 PATH」(默认勾选),装完新开一个 PowerShell
macOS 安装版第一次打开软件时在授权框里输入开机密码;取消了的话点工具栏「安装CLI」,见 2.4
Linux用 pipx 安装 wheel 包,见 2.5

1.2 装好一个 AI 助手,并在研究目录里打开

用支持 Skill 的 AI 编码助手:Codex、Claude Code、Cursor、DeepSeek harness、WorkBuddy 等,任选一个;其他能读写文件、在终端里运行命令的 AI 编码助手也都兼容。下面的例子用 Codex。安装和登录以各工具官网的说明为准,大致是:

工具安装在研究目录里打开
Codex到 OpenAI 官网下载 Codex 桌面版,或用命令行版(npm install -g @openai/codex),用 ChatGPT 账号登录桌面版新建对话时选择这个文件夹;命令行版先 cd C:\khdemo_ai 再运行 codex
Claude Code按 Anthropic 官网说明安装(命令行运行 claude),用 Claude 账号登录先 cd C:\khdemo_ai 再运行 claude
Cursor到 Cursor 官网下载安装「打开文件夹」选这个目录

以 Codex 桌面版为例:点「新聊天」,在输入框上方的「选择项目」里点「新建项目」,项目名随意,「源文件夹」点「添加」选 C:\khdemo_ai,再点「创建项目」:

Codex 桌面版「创建项目」:源文件夹选研究目录
Codex 桌面版「创建项目」:源文件夹选研究目录

第一次会问是否信任这个文件夹,点「信任文件夹」,AI 才能在里面读写文件、运行命令:

「信任此文件夹吗?」点「信任文件夹」
「信任此文件夹吗?」点「信任文件夹」

建好后,新对话的标题会写「我们应该在khdemo_ai中做些什么?」,输入框上方显示项目名,之后的对话都在这个目录里进行:

对话已经绑定到 khdemo_ai 研究目录
对话已经绑定到 khdemo_ai 研究目录
  • 没有官方订阅的,可以用 API 中转站接入 Codex(可选),见第 3.2 节。
  • 第一次让 AI 运行 kh 时,它会请你批准联网下载数据,以及写入研究目录以外的位置(数据目录、回测结果目录 %LOCALAPPDATA%\KhQuant\backtest_results)。看清命令再批准。Codex 输入框下方可以选批准方式:「请求批准」(编辑外部文件和联网时都会问你)、「帮我批准」(只在检测到有风险时问)、「完全访问权限」(不再询问,截图里用的就是这一项)。新手建议选「请求批准」;它的代价是 AI 每次下载、回测前都会停下来等你点,第 1.5 节那种多组回测要守在旁边,或者按第 1.5 节末尾的办法处理。

1.3 一句话装好 khQuant Skill

khQuant Skill 是一份给 AI 看的说明书,告诉它 khQuant 的命令怎么用、策略怎么写、哪些操作要先问你(详见 3.3)。它公开在 GitHub khscience/khquant-skill,免费。在 AI 助手里直接说:

请从 https://github.com/khscience/khquant-skill 下载 khQuant Skill,
把 skills/khquant 文件夹安装到你自己的用户级 Skill 目录里,
装好后告诉我装在哪里,并提醒我重启。

按提示重启 AI 助手。怎样确认装好了:Codex 里输入 $khq,列表里能看到「看海量化 KhQuant」:

Codex 输入框里输入 $khq,出现「看海量化 KhQuant」这个 Skill
Codex 输入框里输入 $khq,出现「看海量化 KhQuant」这个 Skill

Claude Code 里输入 / 能看到 /khquant;Cursor 等其他工具可以直接问它「你有 khquant 这个 Skill 吗」。之后点名使用($khquant 或 /khquant),说到「回测」「下载股票数据」这类话时也会自动启用。想手动安装,见第 3.3 节。

1.4 第一次对话:先检查,再初始化

按 2.1 在界面里设过数据目录的,先看这里

在图形界面「设置 → 数据设置」里保存过数据目录后,kh 就算已经初始化了,会直接沿用这份设置;但界面用的策略目录不会写进命令行的 strategy_dir,它是空的。这时运行 kh run 【1-MA策略案例】双均线精简_使用khMA函数.kh 这类只写文件名的命令,会报「配置文件不存在」。按 2.1 装好、在界面里设过数据目录的,就是这种情况。补上策略目录即可(Windows 界面默认的策略目录在「文档\KhQuant\strategies」,PowerShell 里运行):

kh config set strategy_dir "$env:USERPROFILE\Documents\KhQuant\strategies"

macOS 把引号里换成你在界面里用的策略目录(默认位置见 2.4 第 2.8 节)。不要运行 kh init:它会用默认值整份覆盖 settings.json(界面和命令行共用这一份),数据目录变回默认值(Windows 有 D 盘时是 D:\khData,没有 D 盘时是 用户目录\khData;macOS ~/Library/Application Support/khQuant/stock_data),已经填过的 Tushare Token、回测性能设置也会被重置。

先不要跑策略。请用 khQuant Skill 检查 kh 能不能用、环境有没有问题,
并用 kh config show 告诉我现在的数据目录和策略目录。
如果还没初始化,就逐项问我这两个目录放在哪里。
Tushare Token 之类的密钥我自己填,你不要碰,也不要直接打开 settings.json。

AI 会先运行 kh version、kh doctor 和 kh config show,再根据结果处理。下面是实拍(已初始化过的电脑,用时一两分钟):

第一次对话:AI 报告 kh 版本、数据目录、策略目录和 kh doctor 结果,没有碰密钥和 settings.json
第一次对话:AI 报告 kh 版本、数据目录、策略目录和 kh doctor 结果,没有碰密钥和 settings.json

第二行「用 kh config show」不要省:实测只写「不要打开 settings.json」时,AI 会把它理解成连配置都不能看,结果没去核对数据目录和策略目录。miniQMT 未就绪的警告只是说 miniQMT 客户端没开,用本地数据库回测不受影响。

确认能用后,可以先跑一下自带示例熟悉流程:

用命令行跑一下自带的双均线精简示例,生成 HTML 报告,再给我解释结果。
  • 示例的均线参数是随机生成的,每次结果不同。
  • 如果 AI 用 tx 下载数据,提醒它加 --adj front,否则示例会一笔交易都没有(见第 4.3 节)。

1.5 交给它一个研究任务

能跑通示例后,就可以用中文提研究问题了。下面这段是我们实测用过的提示词(在原话基础上补了两处:每条 kh run 都显式带 --data-root,并写清哪些文件放进研究目录),复制过去,把目录换成你的就能用:

用 $khquant 帮我做一个小研究:沪深300指数(000300.SH)上的双均线策略,短均线和长均线取多少比较好?

要求:
1. 研究目录是 C:\khdemo_ai:.kh 配置、results.csv、HTML 报告和 DONE.txt 都放这里;原始回测结果目录仍在 kh 默认的结果目录,用 kh result list 查找。先用 tx 源下载 000300.SH 自 2022-01-01 起的日线,加 --adj front(前复权),用 --data-root 存到 C:\khdemo_ai\data;不要因为库里已经有 000300.SH 就跳过下载。不要改 kh 的全局配置。
2. 以内置的双均线案例为基础,改成可以调参数的版本。短均线试 5、10、20,长均线试 30、60、120,回测区间 2023-01-01 到 2026-09-30,全部用 kh run 命令跑,每条都加 --data-root C:\khdemo_ai\data。
3. 把每组参数的收益率、最大回撤、夏普比率整理成 results.csv,按收益和回撤给出排名,用几句话写结论和需要注意的风险。
4. 给表现最好的那组生成 HTML 回测报告。
5. 全部完成后,写一个 C:\khdemo_ai\DONE.txt,里面写上“完成”。

这段提示词好用在几处:指定单独的目录和 --data-root,研究数据不会混进你平时的数据库;明确要求下载前复权数据(自动补的沪深 300 基准只有不复权价,AI 看到「已有数据」就不下的话会零交易);参数范围和回测区间写死,各组之间才有可比性;要求它写风险,结论不会只报喜;最后写一个 DONE.txt,你不用盯着屏幕,看到文件就知道做完了。

发出去之后要不要守着,取决于批准方式:

  • 选的是「请求批准」:它会在下载和每次 kh run 前停下来等你确认,9 组回测就要点很多次。想走开,可以在它第一次请求时,在对话里一次性同意「本次研究用到的 kh data download 和 kh run 都可以直接执行」;或者只在这个专用研究目录里临时放宽权限,做完再改回来。
  • 我们实测时用的是「完全访问权限」,所以发出去之后就去忙别的了,看到 DONE.txt 再回来。

结果是什么样的,看下一节。

2 看看结果:一次真实的研究

2026 年 10 月 7 日,我们在 Codex 里装好 khQuant Skill,新建对话,只问了一个问题:「沪深300指数上的双均线策略,短均线和长均线取多少比较好?」,再写清文件放哪、参数范围、回测区间和要哪些指标。之后没有再插手。

在 Codex 里用中文下达研究任务,它先核对 kh 版本、环境和命令用法
在 Codex 里用中文下达研究任务,它先核对 kh 版本、环境和命令用法

Codex 全程只用 kh 命令,约 15 分钟交回:下好的数据、改成可调参数的策略(参数写在 .kh 的 strategy_params 里)、9 组参数的回测、按收益和回撤排名的结果表、结论和风险提示,以及第一名的 HTML 报告。按总收益率排名:

排名短 / 长均线总收益率最大回撤夏普比率成交笔数
15 / 60-6.86%21.58%-0.4722
220 / 60-7.46%23.56%-0.5320
310 / 120-7.90%20.54%-0.5114
420 / 120-9.74%19.90%-0.5612
55 / 30-15.33%23.76%-0.7146
65 / 120-17.94%24.29%-1.1020
710 / 30-21.44%24.22%-1.0338
810 / 60-22.96%32.37%-0.9720
920 / 30-27.80%30.12%-1.5838
Codex 的结论开头:完成九组回测,全局配置未改
Codex 的结论开头:完成九组回测,全局配置未改

它没有替策略说好话:9 组全部亏损,同期指数本身是上涨的,所以只能说明「在这段历史里哪组相对好一点」,不能证明有超额收益;还主动提醒了过度拟合和交易成本的风险。

Codex 用 kh 生成的第一名组合 HTML 回测报告
Codex 用 kh 生成的第一名组合 HTML 回测报告

这就是命令行 + AI 的价值:重复的命令、改文件、跑一组组回测、整理表格,都交给 AI;你把精力放在提问题和判断结果上。想让 AI 从零写一个新策略并回测验证,见 3.4。

注意

示例里的标的和参数只为演示流程,回测结果只反映历史数据,不代表未来收益,不构成任何投资建议。

3 细说:AI 助手和 khQuant Skill

3.1 AI 助手能帮你做什么

  • 检查环境、初始化 kh,逐项问你路径。
  • 按你的描述下载数据,并总结下载了什么。
  • 按你的思路写策略文件、生成 .kh 配置、检查语法(写策略的完整做法见 3.4)。
  • 把一组参数组合各跑一遍,按收益和回撤排名。
  • 解读回测结果,生成 HTML 报告。

它最大的价值是把重复的命令和整理工作接过去,不是替你判断策略好坏。关键结论请自己用 kh result show 或报告复核。

3.2 (可选)用 API 中转站接入 Codex

这一步不是必需的。Codex 可以用官方订阅,也可以通过 API 中转站使用。中转站的好处是不需要复杂的网络环境配置,用多少花多少,可以先小额充值体验。下面以作者在用的中转站为例:

  1. 点击这个中转站链接注册,进入后台。
  2. 控制台 →「令牌管理」→「添加令牌」:名称随便填(如 codex),令牌分组按中转站文档选择对应 Codex 的分组,其他保持默认;提交后复制密钥。
  3. 「钱包管理」里选择充值套餐,付款后拿到兑换码,填入兑换区获得额度。套餐和价格以中转站官网为准。
  4. 打开它的 API 快速接入教程,按说明选择系统和工具,下载并安装配置工具。
  5. 打开配置工具,粘贴密钥,点「安装」,等待自动配置完成,再打开 Codex 即可。
在中转站后台添加令牌(页面以官网当前为准)
在中转站后台添加令牌(页面以官网当前为准)
在配置工具里粘贴密钥并安装(页面以官网当前为准)
在配置工具里粘贴密钥并安装(页面以官网当前为准)
注意

中转站是第三方服务,可能存在服务质量不稳定或模型能力打折扣的风险,是否稳定请自行小额试用后判断。使用中转站时,你发给 AI 的内容(包括策略代码)会经过中转站;配置工具会改写本机 Codex 的配置。是否使用由你自己决定。

3.3 手动安装、更新和卸载 Skill

先取得仓库:git clone https://github.com/khscience/khquant-skill.git,或在网页上 Code → Download ZIP 后解压。然后把其中的 skills/khquant 文件夹复制到所用 AI 工具的 Skill 目录。各工具的目录和点名方式见 3.3 第 2 节(那里统一维护)。

Windows PowerShell 示例(Claude Code):

New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.claude\skills" | Out-Null
Copy-Item -Recurse -Force skills\khquant "$env:USERPROFILE\.claude\skills"

macOS / Linux:

mkdir -p ~/.claude/skills && cp -r skills/khquant ~/.claude/skills/

装好后重启 AI 工具。之后说到「回测」「下载股票数据」之类的话,Skill 会自动启用;也可以用上表的方式点名使用。各工具的 Skill 目录可能随版本变化,以工具当前的说明为准。

  • 更新:在仓库目录 git pull 后重新复制,或者让 AI「把 khQuant Skill 更新到 GitHub 上的最新版」。
  • 卸载:删除上面对应目录里的 khquant 文件夹。

3.4 Skill 帮你守住的边界

Skill 给 kh 的命令分了三档:查询类直接执行;下载、回测、改配置这类先给你看命令、你同意后才执行;删除结果、修复数据、kh init 这类必须你明确同意。完整的命令分档表见 3.3 第 4.2 节(那里统一维护)。

  • 每条命令执行前,AI 会在回复里先写一行 $ kh …,你能看到它要做什么。
  • 密钥:让 AI 引导你自己运行 kh config set tushare_token … 或在图形界面里填。设置文件里的 Token 并没有加密,不要让 AI 直接打开 settings.json,看配置用 kh config show(只显示打码后的值)。
  • 平时建议 AI 工具保持「执行命令前需要批准」;批量研究要走开时,只在专用研究目录里临时放宽,或在对话里一次性同意这次要用的命令,做完改回来(见第 1.5 节)。
  • kh strategy validate 归在「只读」一档,但它会实际执行一遍策略文件的顶层代码;检查来路不明的策略文件前先自己看一眼代码。

3.5 常用的说法

步骤你可以这样说AI 会运行
下载数据「下载上证50成分股近 5 年的日线,前复权」kh data download --pool sz50 --period 1d --start … --adj front --source …
看数据「总结一下刚下载的数据」kh data stats、kh data info
写策略「写一个 RSI 低于 30 买入、高于 70 卖出的策略,先用 validate 检查」写 .py 和 .kh,kh strategy validate(写策略的细节见 3.4)
批量研究「把双均线参数改成固定值,短期 5/10/20、长期 30/60/120 两两组合,各跑一遍近一年的回测,按收益和回撤排名」改成可调参数的策略(或按第 4.7 节用环境变量传参),逐个 kh run … --json,再汇总
看结果「解释一下第一名的最大回撤,生成它的报告」kh result show、kh result report

实际的工作循环大致是「写代码 → kh strategy validate → 短区间 kh run → 核对 → 改了再跑」。下面是 3.4 实拍里 Codex 的一段过程:

实拍:Codex 检查结构、跑短区间,发现问题后改写法再跑
实拍:Codex 检查结构、跑短区间,发现问题后改写法再跑

3.6 让结果更可靠的习惯

  • 研究前先让 AI 把随机参数改成固定值,区间也固定下来,不同组之间才有可比性。
  • 批量回测时让 AI 用 --json 汇总,并把「参数 → 结果」记录成表(结果文件夹本身区分不出参数,见第 4.7 节)。
  • 排名第一的组合,自己打开报告看一遍交易明细,警惕过度拟合;最好换一段没参与挑选的区间再验证一次。
  • 不要让 AI 删除回测结果或清理数据。
  • 回测结果只反映历史数据,不代表未来收益。

想让 AI 从零写一个新策略并回测验证(写法检查、和自带案例对比、常见错误),见 3.4。

4 附:不用 AI,自己动手用命令行

前面 AI 运行的每一条命令,你都可以自己敲。下面按顺序手动走一遍,适合想弄清楚每一步、写自己的脚本,或者在服务器上排查问题的读者。

提示

下面的例子都在 Windows PowerShell 里运行,macOS 和 Linux 的命令完全相同,只是路径写法不同。直接输入 kh 不带参数,会显示一页带分类的命令帮助。

kh 命令一览
kh 命令一览

4.1 检查环境:kh doctor

kh doctor

逐项检查 Python 依赖、数据目录、数据源配置和策略目录,最后给出「总计: N 通过, M 警告」。OK 表示正常,WARN 是需要留意的项。第一次运行时,「DuckDB 数据目录未配置」「策略目录未配置」这两条警告是正常的,下一步 kh init 会解决。

在 Windows 上还会看到一条「历史行情导入源 miniqmt 未就绪」,它只影响用 miniQMT 下载,不影响 tx、BaoStock 下载和回测,可以不管。

doctor 不需要先初始化。其他大部分命令在初始化前运行会提示 ERR 尚未初始化,请先运行: kh init。

4.2 初始化:kh init

在界面里设过数据目录的,跳过这一步

kh init 会用默认值整份覆盖 settings.json(界面和命令行共用),数据目录、Tushare Token、回测性能设置都会被重置。按 2.1 在界面里设过数据目录的,只需补上策略目录,做法见第 1.4 节的提示框。

kh init

向导一共 5 步,括号里是直接回车时的默认值:

步骤问什么建议
1/5 回测数据源DuckDB 本地数据库 / miniQMT(默认 DuckDB;macOS、Linux 不问)回车,用 DuckDB
2/5 数据路径DuckDB 数据目录(Windows 默认 D:\khData,没有 D 盘时为 用户目录\khData)已经在界面里设过的,填同一个目录;目录不存在会自动创建
3/5 策略目录策略文件放在哪(Windows 默认 D:\CLIstrategies,没有 D 盘时为 用户目录\CLIstrategies)填一个独立目录,不要放在安装目录里。自带示例会复制进去,同名文件会问是否覆盖(默认不覆盖)
4/5 数据源配置Tushare(默认否)、BaoStock(默认启用)、HTTP 桥接(默认否)先都回车。tx 不需要配置
5/5 其他参数无风险利率(默认 0.03)回车
提示

Windows 上默认放在 D 盘;电脑没有 D 盘时,默认改成用户目录下的 khData 和 CLIstrategies,一路回车也能完成。3.4.1.9 及更早的版本没有这个处理,没有 D 盘时第 3 步会报错退出,需要手动输入路径。

最后显示「配置已保存到 …\.khquant\settings.json」和配置摘要。中途按 Ctrl+C 退出不会保存配置(已经复制到策略目录的示例文件会留着)。再次运行 kh init 会从头覆盖原有配置,已经填过的 Tushare Token 要重新填。

在图形界面里保存过设置的,kh 会直接用同一份设置(包括数据目录),先运行 kh config show 看当前设置,再按第 1.4 节的提示框补上策略目录。

4.3 下载数据:kh data download

先下两个指数的日线,数据量小、速度快:

kh data download --source tx --stocks 000300.SH,000001.SH --start 20251001 --adj front
  • --source:数据源,必填。tx 免费、不用账号;也可以用 baostock(默认就是前复权,速度慢一些)。各数据源的区别见 2.3。
  • --stocks:股票代码,逗号分隔。也可以用 --pool hs300 选预设板块,或 --file 读文件。
  • --start、--end:日期,格式 YYYYMMDD,不写结束日期就到今天。
  • --adj front:同时下载前复权价。tx 默认只下不复权,自带案例要用前复权,不加这个参数的话回测能跑完,但一笔交易都不会有。

输出类似:

  > 数据源: tencent | 股票: 2 只 | 周期: 1d
  > 复权: front | 覆写: 否
  …(tx 数据来源说明、写库模式、区间等几行)
  OK 000300.SH 1d:保存 4067 条 (2010-01-04 ~ …);回读通过
  OK 000001.SH 1d:保存 241 条 (2025-10-09 ~ …);回读通过

000300.SH 有 4000 多条,是因为每次下载都会自动把沪深 300 从 2010 年起的日线补齐,作为回测基准。不需要的话加 --skip-benchmark。

查看库里有什么:

kh data list
kh data info 000001.SH

data list 列出所有股票;data info 显示一只股票各周期的条数和起止日期。数据库的结构见 1.4 第 4 节。

4.4 认识策略文件:kh strategy

kh strategy list

列出策略目录里的 .py 策略,以及有没有同名的 .kh 配置。新建一个空白策略:

kh strategy create my_first

会在策略目录生成 my_first.py(带 init、khPreMarket、khHandlebar、khPostMarket 四个空函数)和 my_first.kh。检查一个策略文件的结构:

kh strategy validate C:\CLIstrategies\my_first.py

要写 .py 的路径(完整路径或相对当前目录的路径),它不会到策略目录里找。它会实际执行一遍文件的顶层代码,然后检查 khHandlebar 和 init 是否存在(两个都必须有,init 要带 stock_codes, init_data 两个参数)。它能发现缺函数、语法错误,发现不了逻辑错误。策略怎么写见第 3 部分(3.1 框架介绍起)。

4.5 跑回测:kh run

用自带的双均线案例。kh run 会到策略目录里找配置,.kh 后缀可以省略。用过界面的,先按第 1.4 节的提示框补好 strategy_dir,否则这里会报「配置文件不存在」:

kh run 【1-MA策略案例】双均线精简_使用khMA函数.kh

这个案例交易的是个股 000001.SZ,我们只下了指数,所以会提示:

  ERR 股票数据不存在: 000001.SZ(DuckDB: …)

可以先下载这只股票,也可以用命令行参数临时换成已经下好的指数(拿指数代替个股,只是为了少下数据):

kh run 【1-MA策略案例】双均线精简_使用khMA函数.kh --stocks 000300.SH --start 20251201 --end 20260930 --report
  • --stocks、--start、--end、-c(资金)、-p(周期)会覆盖 .kh 里的设置,但不修改 .kh 文件本身。--stocks 是整个替换股票池。-p 只改数据周期,不改触发方式;两者不一致时会提示,触发方式请在 .kh 里改(见 1.8)。
  • 开始日期放在 12 月,是给长均线留出预热数据:长均线最多要 30 个交易日。
  • --report:跑完生成 HTML 报告并用浏览器打开;加 --no-open 只生成不打开。

跑完显示结果摘要:

  回测结果
  ──────────────────────────────────────────────
  交易天数:    204.0 天
  初始资金:      1,000,000.00
  最终资金:        905,083.41
  总收益率:    -9.49%
  年化收益率:  -11.50%
  最大回撤:    10.29%
  ══════════════════════════════════════════════
  结果目录: strategy_5448e98d-…_20251201_20260930_…

案例的均线参数是随机生成的,每次运行结果都不一样,这是正常的。上面的数字只是示例。

运行过程中的详细日志直接显示在终端里(输出到 stderr),结果摘要输出到 stdout。结果保存在回测结果目录(Windows 安装版在 %LOCALAPPDATA%\KhQuant\backtest_results),和图形界面的「回测历史」是同一个地方,在界面里也能看到这次结果。

4.6 看结果:kh result

kh result list
kh result show
kh result report
  • result list:最近的回测列表,含区间、总收益、最大回撤和运行时间。
  • result show:最近一次的绩效指标;--id 2 看列表里的第 2 条。
  • result report:给最近一次生成 HTML 报告并打开。
  • result compare --last 3:把最近 3 次放在一起对比。

更多用法见第 5.1 节。

4.7 自己写脚本批量试参数

khQuant 没有内置参数优化。不用 AI 时,做法是:让策略从环境变量读参数,再用脚本循环调用 kh run。下面的文件都放在研究目录 C:\khdemo_ai,请换成你自己的路径。

第一步,把双均线精简案例的 .py 和 .kh 复制到研究目录,改名为 ma_param.py、ma_param.kh。

第二步,用记事本打开 ma_param.kh,把 "strategy_file" 一行改成新的文件名:

"strategy_file": "ma_param.py",
建议改上

复制出来的 .kh 仍然写着原案例的文件名。kh 找策略文件的顺序是:.kh 所在目录下的 strategy_file → 当前目录下的 strategy_file → 程序目录 → .kh 同目录的同名 .py(这里就是 ma_param.py)→ 策略目录。所以通常会找到你的 ma_param.py;但如果你在策略目录里运行命令,第二步就会命中原案例的 .py,每组跑的都是带随机参数的原版,结果却看不出异常。改上文件名最稳妥。也可以不改文件,在命令里加 -s C:\khdemo_ai\ma_param.py 指定策略文件。

第三步,打开 ma_param.py,在 import random 下面加一行 import os,再把随机生成参数的两行改成读环境变量:

import os
params = {
    'ma_short': int(os.environ.get('MA_SHORT', 5)),
    'ma_long': int(os.environ.get('MA_LONG', 20)),
}

第四步,循环运行。下面用沪深 300 前复权日线(放在 C:\khdemo_ai\data),回测 2023-01-01 到 2026-09-30。没走过第 1 节的,先下载数据:

kh data download --source tx --stocks 000300.SH --start 20220101 --adj front --data-root C:\khdemo_ai\data

然后循环运行。PowerShell:

$rows = foreach ($p in @(@(5,20), @(10,30), @(20,60))) {
  $env:MA_SHORT = $p[0]; $env:MA_LONG = $p[1]
  $line = kh run 'C:\khdemo_ai\ma_param.kh' --data-root 'C:\khdemo_ai\data' --stocks 000300.SH --start 20230101 --end 20260930 --json 2>$null | Where-Object { $_ -like '{*' }
  $r = $line | ConvertFrom-Json
  [pscustomobject]@{ 短均线=$p[0]; 长均线=$p[1]; 总收益率=[math]::Round([double]$r.total_return,2); 最大回撤=[math]::Round([double]$r.max_drawdown,2) }
}
$rows | Format-Table -AutoSize
$rows | Export-Csv grid.csv -NoTypeInformation -Encoding UTF8
Remove-Item Env:MA_SHORT, Env:MA_LONG

实际输出(每组参数不同,结果也不同,说明参数生效了):

短均线 长均线 总收益率 最大回撤
------ ------ -------- --------
     5     20   -18.95    24.54
    10     30   -24.10    27.24
    20     60   -28.67    32.34

Linux、macOS 的 bash:

for p in "5 20" "10 30" "20 60"; do
  set -- $p
  echo "== MA $1/$2"
  MA_SHORT=$1 MA_LONG=$2 kh run ~/khdemo_ai/ma_param.kh --data-root ~/khdemo_ai/data --stocks 000300.SH --start 20230101 --end 20260930 --json 2>/dev/null
done

Python(适合参数多、要排序筛选时):

import json, os, subprocess
CFG = r"C:\khdemo_ai\ma_param.kh"
EXTRA = ["--data-root", r"C:\khdemo_ai\data", "--stocks", "000300.SH", "--start", "20230101", "--end", "20260930"]
results = []
for short, long_ in [(5, 20), (10, 30), (20, 60)]:
    env = dict(os.environ, MA_SHORT=str(short), MA_LONG=str(long_))
    p = subprocess.run(["kh", "run", CFG, *EXTRA, "--json"], env=env,
                       capture_output=True, text=True, encoding="utf-8")
    s = json.loads([l for l in p.stdout.splitlines() if l.startswith("{")][-1])
    results.append((short, long_, float(s["total_return"]), float(s["max_drawdown"])))
for r in sorted(results, key=lambda r: -r[2]):
    print("MA%d/%d 收益 %.2f%% 回撤 %.2f%%" % r)
  • .kh 请写完整路径,--json 的输出才是纯 JSON(见第 5.3 节)。kh run --json 输出里的数字是字符串,要自己转换(kh result show --json 里则是数字)。
  • 日志输出在 stderr,上面的写法把它丢掉了,排错时去掉 2>$null / 2>/dev/null。
  • 结果目录分不出参数:同一个策略跑出来的结果目录名和配置记录都一样,请像上面那样自己把「参数 → 结果」记下来。
  • 另一种传参方式:在 .kh 里加一个自定义字段(例如 "strategy_params": {"ma_short": 5, "ma_long": 60}),每组参数一份 .kh,策略里用 data["__framework__"].config.config_dict.get("strategy_params", {}) 读出来。第 2 节 Codex 实测用的就是这种做法。
  • 只改日期、股票池、资金的话,直接用 --start、--end、--stocks、-c,不需要改策略。
  • 大规模回测的内存、分段加载和 Parquet 缓存见 1.12。

5 附:命令速查

下面是做研究时最常查的几样:结果和报告怎么管、几个通用参数、出错时看哪里。全部命令见附录 A。

5.1 管理回测结果和报告

kh result list --all                        # 默认只列最近 20 个,--all 列出全部
kh result show strategy_b429b43e-123a4b5c_…_194513   # 用文件夹名精确查看
kh result show --id 3 --json                # JSON 输出(数值是数字)
kh result report --id 3 --no-open           # 生成 HTML 报告
kh result report --index --no-open          # 生成当前结果目录的索引页 index.html(不含旧版本位置里的结果)
kh result compare --last 3                  # 对比最近 3 个
kh result clean --keep 10 --dry-run         # 预览:保留最近 10 个,其余删除
  • list 和 --id 的序号按文件夹的修改时间排列,最近改动的排第 1。给旧结果生成一次报告,它就会跳到第 1 位,序号随之变化。
  • 结果默认存在:Windows %LOCALAPPDATA%\KhQuant\backtest_results,macOS ~/Library/Application Support/khQuant/backtest_results,Linux ~/khquant/backtest_results。
  • list --strategy 名字 过滤后会重新从 1 编号,这个序号不能直接用在 show --id 上,请用文件夹名查看。它也只在最近 20 个里找,找旧结果要加 --all。
  • compare 里不完整的结果会显示成 +0.00%,不代表真的零收益。
  • clean 不加 --dry-run 时直接删除,没有确认,不完整的结果和旧位置的结果也会被删。务必先预览。

5.2 HTML 报告

用 kh result report 或 kh run … --report 生成的 report.html 是一个独立文件,图表脚本都嵌在里面,不联网也能打开,可以直接发给别人。文件一般 1MB 多。

  • 顶部三个页签:「回测结果」「策略源码」「策略配置」。注意源码和配置也在文件里,分享前确认可以公开。
  • 「回测结果」里依次是:总收益、年化、最大回撤、夏普比率四张卡片;16 项关键指标;净值、回撤、持仓、日盈亏的联动图;日收益分布;月度收益;交易记录、日收益、个股分析;个股行情和交易位置。
  • 成交股票超过 100 只时,个股 K 线只放 100 只,页面上会注明。
  • kh result report 每次都重新生成并覆盖;换过数据目录后给老结果生成报告,个股 K 线默认仍从当时的数据目录读,可以用 --data-root 指定。
  • 索引页 index.html 列出当前结果目录里所有结果的区间、收益、回撤,点击可以跳到各自的报告(只有生成过报告的才有链接)。

结果存在哪里、一个结果文件夹里有哪些文件、在图形界面里怎么管理和清理,见附录 A 第 12 节;Web 工作台的历史结果页见 2.6。

5.3 几个常用参数

参数作用哪些命令有
--help查看这个命令的全部参数所有命令,例如 kh run --help
--json输出 JSON,方便脚本处理run、result list、result show
-q静默运行,连结果摘要也不显示,跑完用 kh result show 看run
--data-root本次临时用另一个数据目录,不改全局设置run、result report、data download(支持哪些数据源以 kh data download --help 为准,目前是 tx、同花顺)
--no-open不自动打开浏览器。run 要和 --report 一起用才会生成报告;web 只启动服务run、result report、web

这些参数都要写在子命令后面:kh result list --json 可以,kh --json result list 会报错。

给脚本用 kh run --json 时,.kh 请写完整路径。只写文件名、由 kh 到策略目录里找到时,输出第一行会多一句「使用策略目录中的配置」,不是纯 JSON。全部命令和参数见附录 A。

5.4 出错时看哪里

现象处理
ERR 尚未初始化,请先运行: kh init运行 kh init。在图形界面里保存过数据目录的不会出现这条,也不要运行 kh init,见第 1.4 节的提示框
kh init 第 3 步报 FileNotFoundError … 'D:\\'3.4.1.9 及更早版本、电脑没有 D 盘时才会出现:升级到最新版,或重新运行 kh init 手动填路径
ERR 股票数据不存在: …这只股票还没下载。用 kh data list 看库里有什么,先下载或用 --stocks 换成已有的代码
ERR 配置文件不存在: …文件名写错,或者文件不在当前目录和策略目录里。在界面里设过数据目录、没设过命令行策略目录时,只写文件名也会这样,见第 1.4 节的提示框
回测跑完收益 0.00%,日志里有「回测期间没有产生交易记录」先检查复权:用 tx 下载时是否加了 --adj front。再看策略日志
提示 DuckDB 数据库被其他进程占用关掉图形界面的数据管理窗口或其他正在用这个目录的程序,再试
AI 说找不到 kh 命令Windows 安装时「添加 kh 命令到系统 PATH」要保持勾选(默认已勾),装完要重启 AI 工具;Mac 点工具栏「安装CLI」;Linux 运行 pipx ensurepath
环境或依赖有问题kh doctor;更多见附录 B

常见问题

问:Skill 好像没起作用?
答:确认装在正确的目录,重启 AI 工具;Claude Code 里用 /khquant、Codex 里用 $khquant 点名使用。

问:AI 要我把 Tushare Token 发给它?
答:不要发。自己在图形界面的设置里填,或在自己的终端运行 kh config set tushare_token …。

问:我用的是 V2,能用吗?
答:V2 没有 kh 命令,本篇的流程用不了。V2 也能让网页版 AI 帮你写策略代码,再在界面里加载回测,见 3.3、3.4。

问:改了参数跑了好几次,结果文件夹名几乎一样,怎么区分?
答:文件夹名只由策略文件名和时间决定,不包含参数。批量试参数时请自己(或让 AI)记录参数和结果,见第 4.7 节。

问:kh result list --strategy 过滤出的第 1 条,show --id 1 看到的却是别的?
答:两边的序号不是一套。用 kh result show 文件夹名。

下一步

  • 让 AI 从零写策略并回测验证:3.4;Skill 里有什么:3.3;自己动手写策略:3.1、3.2。
  • 想在浏览器里操作:2.6 Web 端(kh web)。
  • 每天收盘后自动补数据、各数据源的区别:2.3(kh data sync --schedule)。
  • 全部命令和参数:附录 A;排错:附录 B。

本篇基于 V3.4.1.10 和 khQuant Skill v1.3.3 编写,示例输出为实际运行结果(部分路径已省略)。

×
没有账号?注册  忘记密码?

风险提示

投资有风险,开户需谨慎。本系统仅为投资者提供量化交易相关的数据处理与分析工具,不构成任何投资建议。 请您在审慎思考后作出选择。特别声明:本系统对您与券商之间的交易、合作不承担任何法律责任。 市场有风险,投资需谨慎。

© 2024 khQuant看海量化回测平台 版权所有

官网:www.khsci.com/khQuant