1.7 回测配置详解

适用版本 V2V3

本篇重点:本篇逐项讲回测配置:策略文件、基准、交易成本、回测时间、复权方式和股票池。

1 策略配置

1.1 策略文件

「策略文件」一栏显示当前使用的策略 .py 文件。点右侧「选择策略文件」可以换一个策略,对话框默认打开用户策略目录(V2 是 文档\KhQuant_OS\strategies)。
保存配置时,如果策略文件和 .kh 在同一个目录,配置里记的是相对路径。所以把 .kh 和 .py 一起复制到别的文件夹,加载后仍能找到策略文件。

注意

不要把策略文件和配置文件放在软件安装目录里。升级软件时安装目录会被删除重建,里面的文件会丢失。加载的配置或选择的策略在安装目录里时,软件会弹出提醒。

1.2 运行模式

固定显示「回测」,不能修改。khQuant 只做回测,不包含实盘和模拟交易。

V3 亮点在软件里写策略、打断点
V2 需要用自己的编辑器(例如记事本、VSCode、PyCharm)打开 .py 文件修改。V3 Windows 版有内置编辑器(需要先自行安装 VS Code 和 Python 扩展,见 2.7):点工具栏「编辑器」就能打开当前策略,在代码行号左边点一下设断点,回测跑到这一行会停下来,可以逐行执行、查看每个变量的值。macOS 版没有内置编辑器;Linux 没有图形界面,用自己的编辑器。
策略要用第三方 Python 库(例如机器学习库)时,V3(Windows 版)的「设置 → 包管理」页输入包名就能在软件里安装,不用自己配置 Python 环境。安装版 V2 只自带 NumPy、Pandas 等常用库,没有这个功能。

V3 内置编辑器的断点调试:左边是变量、调用栈,右边是停在断点处的策略代码(图片来自2.7《内置编辑器》)
V3 内置编辑器的断点调试:左边是变量、调用栈,右边是停在断点处的策略代码(图片来自2.7《内置编辑器》)

2 基准合约

基准合约用来和策略收益做对比,回测报告里的超额收益、Alpha、Beta 等指标都依赖它。

  • 默认是 000300.SH(沪深300)。
  • 支持两种写法:标准格式 000300.SH,或 BaoStock 格式 sh.000300,效果相同。
  • 鼠标停在输入框上,会提示几个常用指数:000300.SH 沪深300、000905.SH 中证500、000852.SH 中证1000、000001.SH 上证指数。

基准也要有本地数据(日线):

  • 沪深300:首次启动引导里已经下载过;以后每次用 BaoStock 导入行情,软件都会顺带补齐它的缺口。
  • 其他指数:在「数据管理 → BaoStock导入」里用预设板块「常用指数」,或者手动输入指数代码下载日线。

回测前的数据检查会把基准一起检查。回测结果窗口如果提示缺少基准数据,可以点提示里的「补基准数据」:沪深300 会直接下载,其他指数会引导你去「数据管理」。

3 交易成本

「交易成本设置」一组有四个费用项和两个滑点项。

「交易成本设置」一组(示例配置的值):最低佣金 5、佣金比例 0.0001、卖出印花税 0.0005、流量费 0、滑点按成交金额比例 1
「交易成本设置」一组(示例配置的值):最低佣金 5、佣金比例 0.0001、卖出印花税 0.0005、流量费 0、滑点按成交金额比例 1

先说费用:

项目 界面默认值 计算方法
最低佣金(元) 5.0 按比例算出的佣金低于这个数时,按这个数收取。每一笔买入、卖出分别计算。
佣金比例 0.0001 佣金 = 成交金额 × 佣金比例。买入、卖出都收。填小数,万分之一填 0.0001。
卖出印花税 0.0005 印花税 = 卖出成交金额 × 税率,只在卖出时收。ETF、LOF 等场内基金不收。
流量费(元/笔) 0.0 每笔成交固定收取的金额。有的券商不收,按自己的券商情况填写。

费率请按自己开户券商的实际标准填写,上表只是界面的默认值。
过户费不在界面上设置。软件按中国结算的规定,根据成交日期和市场自动计算,ETF、LOF 等场内基金不收:

成交日期 沪市 深市 北交所
2022-04-29 及以后 成交金额的 0.01‰ 成交金额的 0.01‰ 成交金额的 0.01‰
2015-07-09 至 2022-04-28 成交金额的 0.02‰ 成交金额的 0.02‰ 成交金额的 0.025‰
2015-07-09 以前 成交股数面值的 0.3‰ 成交金额的 0.0255‰ —

每笔成交的总费用 = 佣金 + 印花税 + 过户费 + 流量费,在回测报告的交易记录里可以逐笔查看。

提示

A 股卖出印花税在 2023-08-28 从 0.1% 降到 0.05%。回测区间跨过这一天时,界面上只能填一个固定税率。如果要按日期自动切换,可以用记事本打开 .kh 文件,在 backtest → trade_cost 里加一行 "stamp_tax_mode": "a_share_legal",保存后重新加载。开启后界面上填的印花税率不再使用。

4 滑点

真实成交时,成交价往往比下单时看到的价格差一点,这个差额叫滑点。回测里用滑点让成交价更接近实际。
先在「滑点类型」里选算法,再在「滑点值」里填数:
按最小变动价跳数

  • 「滑点值」填整数,范围 0~100,表示跳几个最小变动价位。默认 2。
  • 每跳默认 0.01 元。买入价 = 价格 + 跳数 × 0.01,卖出价 = 价格 − 跳数 × 0.01。
  • 例:滑点值填 2,价格 10.00 元时,买入按 10.02 元成交,卖出按 9.98 元成交。
  • 填 0 表示不加滑点。

按成交金额比例(界面默认)

  • 「滑点值」填百分比,范围 0~10,表示买卖双边合计的滑点。默认 0.1,即 0.1%。
  • 买入、卖出各按一半调整:买入价 = 价格 × (1 + 滑点值 ÷ 100 ÷ 2),卖出价 = 价格 × (1 − 滑点值 ÷ 100 ÷ 2)。
  • 例:滑点值填 1(示例配置就是 1),价格 10.00 元时,买入按 10.05 元成交,卖出按 9.95 元成交。

调整后的价格按报价精度四舍五入:股票保留 2 位小数,ETF 保留 3 位。

提示

滑点对每一笔成交都生效,包括挂单之后才成交的、部分成交的。

限价单有一个上限:加完滑点后,买入价不会高于委托的限价,卖出价不会低于限价。例如限价 10.00 元买入,当天开盘 10.05 元、盘中最低跌到 9.98 元,按限价 10.00 元撮合;滑点 2 跳本来要加到 10.02 元,但不能超过限价,所以最终按 10.00 元成交。如果开盘价就是 9.95 元,按开盘价撮合,加 2 跳后是 9.97 元,没有超过限价,按 9.97 元成交。

市价单、止损单没有限价,加滑点后不设上限。

两种算法的数值分开保存:切换滑点类型时,会恢复这种算法上一次填的值,不会把一种换算成另一种。

提示

每跳的金额(默认 0.01 元)不在界面上设置,保存在 .kh 文件 slippage 里的 tick_size 一项,需要时可以用记事本修改。

「滑点类型」下拉框展开,有「按最小变动价跳数」「按成交金额比例」两项
「滑点类型」下拉框展开,有「按最小变动价跳数」「按成交金额比例」两项

5 回测时间

「回测时间设置」里有「开始日期」和「结束日期」,点右侧的小方块按钮弹出日历选择,也可以点进框里直接改,格式是 年-月-日。

「回测时间设置」一组,示例配置为 2025-01-01 至 2025-07-03
「回测时间设置」一组,示例配置为 2025-01-01 至 2025-07-03
  • 可选范围是 2000-01-01 到今天;结束日期不能早于开始日期,改了开始日期后,结束日期的下限会跟着变。
  • 回测区间要在本地已下载数据的范围内。
  • 策略计算均线等指标要用到开始日期之前的数据,下载时要往前多留一段(见 1.4)。

6 数据设置

6.1 复权方式

股票分红、送股、配股后,股价在除权除息日会出现跳空,这个跳空由分红送转造成,与当天的买卖无关。复权就是对历史价格做调整,让价格序列连续。「复权方式」下拉框有五项:

选项 说明
不复权 使用实际成交价格,除权除息日会出现价格跳空。
前复权 以最新价格为基准,调整以前的价格。最近的价格和行情软件里看到的一致,越早的价格改动越大。
后复权 以上市初期的价格为基准,调整以后的价格。早期价格不变,近期价格会比实际价格高。
等比前复权 前复权的另一种算法:每次除权按比例整体缩放以前的价格。
等比后复权 后复权的另一种算法:每次除权按比例整体缩放以后的价格。

复权方式影响回测时读取的开盘、最高、最低、收盘价。策略里用 khMA、khHistory、khKline 计算均线、取历史行情时,没有指定复权方式的,自动按这里选的复权方式计算;如果在策略里明确指定了另一种复权方式,就按指定的来算,日志里会提示一次两者不一致。
能用哪几种,取决于数据源提供了哪些复权价。 本地数据库里,原始价格是基础字段,每种复权价是单独的几列,下载时勾选了才会有:

数据源 不复权 前复权 后复权 等比前复权 等比后复权
BaoStock 可用 下载时勾选「前复权」 下载时勾选「后复权」 不提供 不提供
Tushare 可用 下载时勾选「前复权」(股票需 adj_factor、ETF 等场内基金需 fund_adj 接口权限) 下载时勾选「后复权」(股票需 adj_factor、ETF 等场内基金需 fund_adj 接口权限) 不提供 不提供

所以在 V2 里,实际可用的是不复权、前复权、后复权三种。指数的复权价和原始价相同,但下载时仍要勾上对应的复权方式,否则回测前的检查会把它判为缺数据。
选了数据库里没有的复权价时,会发生两件事:

  1. 回测前的数据检查会把这些日期判为「缺数据」,弹出数据不完整的对话框。
  2. 如果点「继续回测」:
    – 选的是等比前复权或等比后复权:软件把整个回测区间统一改用对应的普通前复权或后复权,并在日志里提示一次。软件不会在同一段行情里混用不同的复权价。
    – 选的是前复权或后复权,但下载时没勾这一项:这些日子读到的开高低收是空值,策略拿不到价格,结果不可信。请先补下载对应的复权价,再回测。
注意

V2 主界面在没有加载任何配置时,「复权方式」的默认值是「等比前复权」,而 BaoStock 和 Tushare 都不提供等比复权价。自己从头配置时,请改成「前复权」(自带示例配置用的就是前复权)。

注意

选择前复权或后复权回测时,软件不做涨跌停校验。原因是本地库里的前收盘价是不复权价格,不能和复权后的开高低收直接比较,按它算出的涨跌停价不准确。需要严格模拟「涨停买不进、跌停卖不出」时,请选「不复权」。

V3 差异V3 可以用上全部五种复权方式

V3 的部分数据源在导入时可以勾选「等比前复权」「等比后复权」,用这些数据源下载的股票可以使用全部五种复权方式。V3 的 BaoStock、Tushare、同花顺导入同样只提供前复权和后复权。具体见 2.3《数据管理模块(V3)》。

「复权方式」下拉框展开,五个选项:不复权、前复权、后复权、等比前复权、等比后复权
「复权方式」下拉框展开,五个选项:不复权、前复权、后复权、等比前复权、等比后复权

6.2 周期类型

「周期类型」有 tick、1m、5m、1d 四项,决定回测前数据检查按哪个周期检查。鼠标停在下拉框上会提示各周期的数据来源:

  • 1d(日线)、5m(5 分钟):BaoStock 或 Tushare 都能下载。
  • 1m(1 分钟):只能用 Tushare 下载,需要 stk_mins 权限。
  • tick:BaoStock 和 Tushare 都不提供,需要自行导入 DuckDB。

周期类型要和中间面板的「触发类型」对应:日K线触发配 1d,5分钟K线触发配 5m,1分钟K线触发配 1m,Tick触发配 tick。两者不一致时,点「开始运行」后会弹出「周期不匹配警告」,可以选择继续或取消。触发方式详见 1.8。

6.3 数据字段

「数据字段」是一组勾选框,列出可以加载的字段。勾选的字段会在每次触发时传给策略。

  • 周期为 1m、5m、1d 时,列出 K 线字段:开盘价、最高价、最低价、收盘价、成交量、成交额、今结算、持仓量、前收价、停牌标记。
  • 周期为 tick 时,列出分笔字段:最新价、开盘价、最高价、最低价、前收盘价、成交总额、成交总量、原始成交总量、证券状态、持仓量、前结算、委卖价、委买价、委卖量、委买量。
  • 默认全部勾选。时间和收盘价无论是否勾选都会加载;另外,成交判断要用到的字段也总会加载,取消勾选不会让涨跌停、限价、成交量限制这些检查失效:K 线周期是开盘价、最高价、最低价、成交量,不复权回测时还有前收价;tick 周期是最新价、开盘价、最高价、最低价、成交总量、前收盘价。如果数据源本身缺少其中某一列,运行日志会提示一次,说明哪项检查因此失效。
  • 复权由上面的「复权方式」统一控制,这里没有单独的复权字段。

取消勾选策略用不到的其他字段(例如成交额、今结算、持仓量),可以减少一些内存占用;上面说的成交必需字段不受影响。拿不准时保持全选即可。

「数据设置」一组:复权方式前复权、周期类型 1d,数据字段 10 个勾选框全部勾选
「数据设置」一组:复权方式前复权、周期类型 1d,数据字段 10 个勾选框全部勾选

7 股票池

「股票池设置」决定回测时策略面对哪些股票。下方的列表就是最终的股票池,有「股票代码」「股票名称」两列。往列表里加股票有四种方式:

7.1 勾选板块

上方有 12 个板块勾选框,每行 3 个:上证50、沪深300、中证500、创业板、科创板、沪深A股、上证A股、沪深ETF、场内基金/LOF(鼠标悬停显示全称「沪深场内基金(含ETF/LOF)」)、T0型ETF、T0股票型ETF、常用指数。可以同时勾选多个,列表里的股票会自动去重。

  • 勾选 T0型ETF 或 T0股票型ETF 时,软件会提示:这两个清单可能有滞后,请以交易所最新公告为准。
  • 板块成分股清单随安装包提供,可以在「设置 → 基本设置 → 股票列表管理」里点「更新成分股列表」更新(见 1.12)。
注意

取消勾选某个板块时,列表会按仍然勾选的板块重新生成,之前用「添加股票」「导入股票」加进来的股票也会被清掉。建议先勾选板块,再手动添加个别股票。

7.2 自选清单

「自选清单」勾选框旁边的文字是一个链接:

  • 点文字,会用系统默认程序(例如 Excel 或记事本)打开自选清单文件 %LOCALAPPDATA%\KhQuantOS\data\otheridx.csv。文件不存在时,软件会先创建一个带几行示例的文件。
  • 文件格式:第一行是表头「股票代码,股票名称」,之后每行一只股票,代码和名称都要填,只有代码没有名称的行会被跳过。示例里的股票只是格式演示,请换成自己要研究的股票。
  • 编辑保存后,勾选「自选清单」,文件里的股票就会加入列表。

7.3 添加股票

点「添加股票」,在弹出框里输入一只股票,可以是:

  • 完整代码,如 600000.SH;
  • 6 位数字,软件按本地股票列表补上市场后缀,有重名时让你选择;
  • 股票名称,精确匹配优先,其次模糊匹配,多个结果时让你选择。

手动添加只支持沪市和深市代码。

7.4 导入股票

点「导入股票」,选择一个 CSV 或 TXT 文件。文件每行一只股票:第一列是代码,第二列是名称(可以不填)。有表头的话会自动跳过。

7.5 删除和清空

  • 删除选中:在列表里选中一行或多行(按住 Ctrl 或 Shift 多选),点「删除选中」。被删除的股票会被记住,之后再勾选包含它的板块时,不会被重新加回来;用「添加股票」或「导入股票」可以把它加回来。
  • 清空列表:清空整个列表,并取消所有板块的勾选。
注意

股票池里的每只股票,都要事先下载好回测区间(含预热期)的对应周期数据。股票池很大时,数据检查和回测都会变慢。「设置 → 基本设置 → 回测前数据检查」在「自动(推荐)」模式下,遇到大规模回测会跳过回测前的全量检查,回测过程中仍会汇总提示缺数据的情况。

「股票池设置」一组:上方是 12 个板块和「自选清单」链接,中间是股票列表(示例配置里有 1 只,已打码),下方是四个按钮
「股票池设置」一组:上方是 12 个板块和「自选清单」链接,中间是股票列表(示例配置里有 1 只,已打码),下方是四个按钮

8 初始资金与最小交易量

这两项在中间面板的「账户信息」里:

  • 初始资金:回测开始时账户里的现金,默认 1000000(100 万元)。收益率、仓位都按它计算。
  • 最小交易量:默认 100。这一项会保存在配置文件和回测记录里。实际买卖的股数由策略里的下单函数决定,按 100 股的整数倍取整。

9 保存配置

改完参数后:

  • 点「保存配置」覆盖当前的 .kh 文件(会先确认);
  • 点「配置另存为」另存一份新配置。

下次点「加载配置」选这个文件,界面上的参数就会全部恢复。.kh 文件是 JSON 格式的文本文件,可以用记事本查看和修改。

常见问题

问:回测前提示数据不完整,但我确实下载过这些股票?
答:按顺序检查三点:回测区间是否在下载范围内;「周期类型」选的周期是否下载过;「复权方式」选的复权价是否下载过。V2 里选了「等比前复权」「等比后复权」,或者下载时没勾「前复权」却选了前复权,都会被判为缺数据。

问:佣金比例应该填多少?
答:按自己开户券商的实际费率填,注意填的是小数:万分之一填 0.0001,万分之二点五填 0.00025。

问:滑点值填 1,是 1 分钱还是 1%?
答:看「滑点类型」。按最小变动价跳数时,1 表示 1 跳(默认 0.01 元);按成交金额比例时,1 表示买卖双边合计 1%,买入、卖出各调整 0.5%。

问:基准可以用个股或 ETF 吗?
答:基准按日线读取本地数据,理论上只要本地有它的日线就能用。一般用市场指数,便于和大盘比较。

问:勾了板块之后,手动加的股票不见了?
答:取消勾选任意板块时,列表会按仍勾选的板块重新生成。请重新添加,或者把要加的股票写进自选清单文件,勾选「自选清单」。

V3

写策略、配参数,V3 更顺手
  • 内置 VSCode 编辑器(Windows 版),在软件里直接写策略、打断点
  • 包管理页:在软件里安装策略要用的第三方库
  • CLI 支持在命令里覆盖 .kh 参数,批量改参数回测

本篇基于开源 V2 和 V3.4.1.10 编写。

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

风险提示

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

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

官网:www.khsci.com/khQuant