策略回测使用说明:从示例策略到自己写条件
回测回答的是「这个想法过去成不成立」,不是「今天买什么」。页面打开时上面就有几个可以直接跑的示例——点一下装进画布,再点「开始回测」。每个例子演示一种写法,从最简单的单条件到用函数、到卖出条件里用持仓字段。
两种写法
积木:选字段、选比较、填数
表达式:直接写条件
形如 rs3m >= 90 and dist_ma20 >= 0。支持 and or not、比较、四则运算和括号。可用函数:
| 函数 | 含义 |
|---|---|
ma(20) / ma(close,20) | 20 日均值,省略第一个参数时对收盘价 |
ema(20) | 指数均值 |
ref(close,1) | 前 1 日的值 |
count(zt>0,5) | 近 5 日里满足条件的天数 |
sum(amt,5) | 近 5 日求和 |
hhv(high,20) / llv(low,20) | 近 20 日最高 / 最低 |
std(close,20) | 近 20 日标准差 |
cross(ma(5),ma(20)) | 前者上穿后者 |
abs(x) | 绝对值 |
滚动类函数(ma/ema/count/sum/hhv/llv/std)一条表达式里最多 5 个——每个都要把全市场全历史算一遍,多了会让回测排队。先用少几个条件把方向试出来。
可用字段(共 65 个,分 11 类)
点开看全部
| 分类 | 字段 |
|---|---|
| 强度 | nhbp 强度新高但价未新高、rsnh 强度线新高、rs12m 相对强度·12月(0-99)、rs1m 相对强度·1月(0-99)、rs3m 相对强度·3月(0-99)、rs6m 相对强度·6月(0-99) |
| 均线位置 | ma20r 60日内站上20日线占比、bull_ma 均线多头排列、dist_ma10 距10日线、dist_ma120 距120日线、dist_ma20 距20日线、dist_ma250 距250日线、dist_ma30 距30日线、dist_ma5 距5日线、dist_ma60 距60日线 |
| 涨跌幅 | p20 20日涨幅、p250 250日涨幅、p5 5日涨幅、pct60 60日涨幅、p1 当日涨幅、d52 距52周高点、dist_hi 距63日高点、gap 跳空 |
| 涨停 | zt 当日涨停、zt_mla 涨停且属主线、lb 连板数 |
| 量能 | ud 20日U/D量比、amt 成交额、turn 换手率、rv 相对量(50日)、vr10 量比(10日)、vr20 量比(20日)、vr 量比(5日)、vr60 量比(60日)、vhy 量能52周新高 |
| 市值与上市 | ldays 上市交易日数、mc 总市值、fmc 流通市值 |
| 波动与振幅 | adr 20日均振幅、boll_w BOLL带宽、amp 当日振幅、ampr 振幅/20日均振幅、dcr 收盘在当日区间位置、vw 近15日日均波幅 |
| 形态 | vcp VCP波动收缩、nh52 创52周新高、px_nh 创63日新高、cup 杯柄形态、stage 阶段 |
| 技术指标 | boll_pos BOLL带内位置、kdj_d KDJ-D、kdj_j KDJ-J、kdj_k KDJ-K、macd_dea MACD-DEA、macd_dif MACD-DIF、macd MACD柱、macd_x MACD金叉、rsi12 RSI(12)、rsi24 RSI(24)、rsi6 RSI(6) |
| 均线交叉 | cross10_20 10日线叉20日线、cross20_60 20日线叉60日线、cross5_10 5日线叉10日线、cross5_20 5日线叉20日线 |
| 其它 | tape_amt tape_amt |
字段右边的单位提示在积木里会显示。close/open/high/low/vol 这些基础序列在表达式里能用,但不出现在积木清单里。
买多少、怎么卖
账户模式 vs 等权篮子
卖出条件
profit 盈亏%、held 持有天数、cost 买入价、px 当前价。例如 profit >= 10 and dist_ma5 < 0 ——赚够 10% 且跌破 5 日线才走。多条之间是「满足任一条就卖」。一字板:买不买得到,要你自己决定
我们用真实成交数据量过这件事
回测里最容易高估收益的地方,是把开盘一字板的涨幅算成你的收益——你挂单排队,成交回报永远不来。所以默认口径是当作买不到。
但我们用 2020 年以来的真实大单数据核过这一刀,发现它切得偏狠:
| 类别 | 样本 | 当天成交额中位 | 换手中位 | 成交笔数中位 |
|---|---|---|---|---|
| 真一字(开=高=低=涨停价) | 3324 | 6472 万 | 1.53% | 846 |
| 开盘涨停但盘中开板 | 2253 | 50168 万 | 9.62% | 1868 |
| 盘中封板 | 45509 | 37129 万 | 7.58% | 2455 |
真一字当天成交中位 6472 万、846 笔,不是零。但时点分布说明了另一半:那批最大的成交几乎全在 09:30 那一分钟,三分之一的一字板 20 笔大单全挤在 5 分钟内——队列开盘就排满了,成交给的是集合竞价就把单子挂进去的人。
三种口径,以及一个反直觉的发现
能否成交取决于队列位置,而队列深度我们观测不到(封单数据 2025 年 6 月才有)。所以我们不猜一个成交概率,而是把假设摆出来让你选:
| 口径 | 含义 | 适合 |
|---|---|---|
| 当作买不到(默认) | 一手也买不到,按现金计 | 保守估计,也符合常识 |
| 按当日成交额判 | 订单金额不超过当天成交额的百分之一才算排得上;没有数据的一律当买不到 | 大账户 |
| 当作买得到 | 按涨停价成交 | 看上限,不是结论 |
反直觉的一点:中间那档对小账户完全不起作用。实测同一个连板策略、阈值不变、只改本金:10 万和 100 万一次都没被卡住,500 万(每格 50 万)才开始出现 4 次,1 亿本金 54 次。
也就是说——小账户买不到一字板,不是成交额不够,是排队排不上;大账户才变成成交额的问题。前者我们没有数据可以判,所以默认保留最保守的口径。
覆盖范围:大单数据只采当日龙虎榜上榜股与涨停股,涨停类策略的信号有 97%~99% 能对上;趋势与形态类策略基本没有,所以那些策略换这个口径不会有变化。
买 top 几:一个比选股条件更影响结果的维度
同一套条件,七种挑法,跨度 68 个百分点
选股条件选出 227 只,账户只能买 10 只——挑哪 10 只,本身就是策略的一部分,而且影响可能比条件本身还大。
实测本站选股器的「小盘高换手活跃」模板(日均匹配 227 只,持有 10 日,15% 止盈 8% 止损,2022 年起):
| 买前 10 只的挑法 | 年化 | 相位极差 | 笔数 |
|---|---|---|---|
| 按总市值 小→大 | +17.33% | 3.42pp | 2235 |
| 随机挑 | -29.13% | 10.54pp | 2380 |
| 按振幅 小→大 | -27.59% | 4.87pp | 1964 |
| 按当日涨幅 大→小 | -48.59% | 0.47pp | 3309 |
| 按成交额 大→小 | -49.70% | 0.33pp | 3357 |
| 按换手率 大→小 | -50.80% | 0.34pp | 3548 |
| 按相对强度·3月 大→小 | -50.96% | 0.36pp | 3225 |
从 -50.96% 到 +17.33%,跨度 68 个百分点。选股条件一个字没改。
三件值得注意的事
一、最直觉的几种挑法全是最差的。按强度、按成交额、按涨幅、按换手——四个「看着最该选」的指标全在 -48% 到 -51%。唯一为正的是按市值从小到大。在一个「小盘高换手」的池子里再往小市值挑,这个结果本身合理(小市值因子),但它说明排序字段不是随便选的,它本身就是一个策略维度。
二、指定排序后相位极差塌了。随机挑是 10.54pp,一旦指定排序就掉到 0.33~0.47pp。这不是好事——排序把「买哪几只」的随机性彻底消掉了,结果变得高度确定,但那是对这段历史的确定。相位极差变小,意味着「收益要压得住噪音」这一关变容易通过了,而它本该更难通过。
三、这个控件默认「随机挑」。随机无偏,但不是真人做法——真人会按某个指标排序。那个选择本身就是策略的一部分,所以我们不替你选,也不建议照抄上表里最好看的那个:它只是七种挑法里在这段历史上最好的一个。
上表第一行怎么配出来的
照着填一遍,能看清一套策略是由哪几块拼出来的:
| 填哪里 | 填什么 | 为什么 |
|---|---|---|
| 选股条件 | mc <= 80 and turn >= 10 and amt >= 2 | 市值 80 亿以内、换手 10% 以上、成交额 2 亿以上(本站选股器「小盘高换手活跃」模板的条件) |
| 持满 | 10 日 | 没有更早的卖出信号时,第 10 天收盘卖 |
| 止盈 / 止损 | 15% / 8% | 先到哪个算哪个;不填就是裸持到期 |
| 买前几只按什么挑 | 总市值 小→大 | 这一栏在买入节点上。条件每天选出约 227 只,账户只买得起 10 只,这里决定挑哪 10 只 |
| 本金 / 最多持有 | 10 万 / 10 只 | 决定每格多少钱,也决定一手 100 股买不买得起 |
| 起始 | 2022-01-01 | 面板从这天起 |
| 扰动扫描 | 勾上 | 不勾只给一条曲线,勾上才给相位极差 |
换掉其中任何一格,结果都会变。上表七行的差别只来自「买前几只按什么挑」这一格——其余六格完全一样。
这也是我们不把它当成推荐的原因:它是七种挑法里在这段历史上最好的那个。真正该带走的不是这个配置,而是「买 top 几」这一格值得你认真想。
为什么结果是一组数而不是一条曲线
相位分歧
成交记录要看
常见问题
先点页面上的示例装进画布,再点「开始回测」。条件有两种写法:积木(选字段、选比较、填数)和表达式(直接写 rs3m >= 90 and dist_ma20 >= 0),两者等价,积木下方会实时显示等价表达式。
65 个,分 11 类:强度、均线位置、涨跌幅、涨停、量能、市值与上市、波动与振幅、形态、技术指标、均线交叉。表达式里还能用 close/open/high/low/vol 这些基础序列,以及 ma/ema/ref/count/sum/hhv/llv/std/cross/abs 十个函数。
账户模式算的是「拿 10 万块跟着它做会怎样」:有本金上限、一手 100 股、最多同时持有 N 只、买过的不重复买。等权篮子假设每个信号都买得上,算的是选股条件的平均质量。实测同一策略两者差 39 个百分点,差额全在「信号给了但你没买上」。
由你自己指定。买入节点上有一栏「按什么挑前几只」,可以按成交额、换手率、相对强度、市值等排序,默认随机挑。这一格影响很大——实测同一套选股条件、七种挑法,年化跨度 68 个百分点。
同一策略仅起始日差一天,年化可以差 10~100 个百分点。勾上「扰动扫描」后,回测会按起始日逐日后移各跑一遍,结果页上那条「相位分歧」散点就是这个量级。比它小的差异不足以说明问题。
止盈、止损、持有天数三个框各管一件事,任一触发就卖。还可以再写一条自定义条件,用持仓字段:profit 盈亏百分比、held 持有天数、cost 买入价、px 当前价。例如 profit >= 10 and dist_ma5 < 0,赚够 10%% 且跌破 5 日线才走。