拿到一份选股公式的统计输出,先别盯着计数,先看这份输出是在什么口径下取出来的。通达信选股公式回测口径指的是:样本从哪一天到哪一天、用哪种复权方式的价、公式有没有读到未来数据、以及这份样本本身是不是被挑出来的。口径不同,同一段公式在同一个市场里统计出来的信号数会差出量级,讨论数字前先把口径写在记录表上。

一、为什么要先看口径:数字只有在口径下才有含义

条件选股输出的是一串触发时点,统计是对这串时点做事后清点。清点这件事本身没有对错,只要口径固定,结果就稳定;口径换了而记录里没写,过一段时间再看这份输出,就说不清它对应的到底是哪个范围的数据。

判断一份输出能不能用,先问口径能不能复现:换一个人按记录表上的几项重新跑一遍,得到的信号数是否一致。能对上,这份记录就有价值;对不上,问题多半出在复权方式或样本区间这两项没写清,而不是公式本身。

这里要划清边界:口径讲的是数据侧的可得性、一致性与污染,判定标准讲的是拿到数据之后用什么尺度衡量,两者是两件事。本文只处理前者。

二、样本区间:起止点决定了看到的是哪一段行情

样本区间的选择直接影响统计结果的结构。市场在不同阶段的波动特征差别很大,把样本截止点往前挪一段或往后挪一段,落在样本里的行情形态就换了,同样一条条件公式触发的次数与分布也跟着换。

起点选在哪里有三处要明确。一是是否包含极端波动段。把一段剧烈波动包含进来与排除在外,输出的是两套数据,记录表上要写清这段是否在样本内。二是样本长度是否够。太短的样本里,公式触发的次数少,清点出来的数字随机性大,样本自身不足以支撑任何结构性的描述。三是区间边界是自然日还是交易日,节假日对应没有 K 线的日期,用自然日做区间边界会在边界处引入无数据的空档。

{样本区间写清楚的三个字段,写进记录表抬头}
起  20230101
止  20260930
边界口径  交易日(按 K 线根数计)
记录表抬头写清起止与边界口径,再写信号数。顺序反过来,数字就失去上下文。

三、数据完整性:未下载的历史、停牌日与复权方式

本地数据是不是完整,是口径里最容易被跳过的一项。通达信的历史数据按需下载,没下载过的那一段在公式计算时取不到值,公式在这些位置上的输出要么为空、要么按客户端对缺失数据的处理方式给出结果。用一段数据不完整的样本做清点,得到的信号数不反映公式在完整数据上的表现。

停牌日是另一处。停牌期间没有成交,K 线不生成或按客户端的处理方式生成,条件里涉及价格、成交量的判断在这些日期上会走不同的分支。跨越停牌段的条件在复牌后的第一个交易日触发与否,与公式里用的是 REF(CLOSE,1) 还是更长的回溯窗口有关,这一项在记录表上要单独标注。

复权方式是影响最大的一项。同一段行情,前复权、后复权、不复权三种口径下的价格序列不同:不复权保留了历史上的除权缺口,复权把缺口填平。均线、涨幅、与历史价相关的条件在这些序列上算出来的值不一样,触发时点也会落在不同日期上。

复权方式 价格序列的特征 对条件的影响
不复权 保留除权除息缺口,历史价按当时实际成交价 跨除权的价比较条件会在缺口处出现跳变
前复权 以最新价为基准向前调整,早期价格被改写 早期历史价随基准变化,长窗口统计受基准日影响
后复权 以上市首日为基准向后调整,近期价格被放大 价格数值与界面显示不同,比较类条件需统一口径

选择哪一种,取决于公式的条件是否涉及跨除权区间的价格比较。涉及区间的,几种口径算出来的结果不同;只涉及当日相对关系的,差别较小。记录表上写下用的是哪一种,比讨论哪一种更合适更重要。

换复权方式之后要重新计算,旧的输出不会自动跟着变。记录表上标的复权方式与实际取数口径要一致,否则这份统计从头就对不上。

四、未来函数污染:条件有没有读到后面几根 K 线

未来函数指公式在计算某个时点的输出时,用到了该时点之后才产生的数据。通达信里几类函数是常见嫌疑点。REF 用于取历史值,写成 REF(CLOSE,1) 取前一根,属于往回看,不构成污染;写错方向、或者取值步长被写成负数,就可能取到后面的值。ZIG 这类转向函数在描点时依赖后续确认的转折,画出线的位置会随之后的数据变化,是已知的一类污染源。PEAK、TROUGH 用于取波峰波谷的值,同样依赖转折是否已成立。

{可疑写法:ZIG 依赖后续确认,画出的转折会随后续数据变化}
Z:ZIG(3,5);

{自查写法:只在最后一根 K 线上判断,看历史信号是否稳定}
LAST: ISLASTBAR;

{把条件逐根推演:同一条件在不同起点上算}
C1: CLOSE > REF(CLOSE,1);
C2: CLOSE > REF(HHV(CLOSE,20),1);
XG: C1 AND C2;

自查手法有两条。一条是用 ISLASTBAR。它标记当前计算是否落在最后一根 K 线上,配合条件使用,可以看出某个信号是不是只在最后一根上成立。一条是逐根推演:把样本截止日往前挪,重跑一次,看历史段的信号是否发生过位置变化。位置发生变化说明公式在旧时点上用到了当时还不存在的数据,这类信号在事后统计里好看,在信号产生当时并不可得。

推演时的操作路径是:先缩短样本到较早的截止日,重跑条件选股,把结果导出;再把截止日逐段往后移,重复同样操作;最后把各次结果里同一时点的信号对齐比一比。对不上的那一段,就是污染的落点。

五、偏差类型:幸存者偏差、参数过拟合、样本内外不分开

三类偏差来源不同,表现也不同。

幸存者偏差来自样本的选取方式。用当下还在交易的标的构成样本,去看一段更早的历史,样本里已经不包含当初存在、后来退市或被合并的标的。分析池在建池那一刻就被筛过一遍,样本本身不完整,清点出来的信号数对应的是一个被挑选过的小集合。

参数过拟合来自反复调参。同一条公式的窗口、阈值被反复改动,每一轮都在同一段样本上比较输出,改到某个取值让这段样本上的分布看起来整齐为止。此时参数记忆的是这段样本的形态,换一段样本后表现会变化。判断方式是看参数是否落在整块可行区间里较稳的位置,而不是落在孤立的某个点上。

样本内外不分开是最容易处理也最容易被跳过的一项。把全部可用数据都当作观察对象,公式与参数都在同一段上确定,这份结果就是样本内的结果。做法是留出后一段作为样本外,在样本内把公式与参数定下来,再在有数据的样本外区间上跑一次,看触发的结构是否还成立。

六、自查代码与记录模板

下面这段用于把口径写进公式,方便在图上直接核对样本范围与逐根推演的起止。

{口径自查用,不参与条件判断}
BEGIN:   DATE >= 1230101;
END:     DATE <= 1260930;
INRANGE: BEGIN AND END;

{逐根推演辅助:给出当前 K 线距样本起点的根数}
BARSSINCEDATE: BARSCOUNT(CLOSE);

{条件本体,全部使用已确立的历史数据}
C1: CLOSE > REF(CLOSE,1);
C2: CLOSE > MA(CLOSE,20);
XG: C1 AND C2 AND INRANGE;

记录模板按列承载。每一轮统计单独一行,同一行里的各项必须来自同一次取数,不同行的样本区间不同时不能把信号数直接放一起比较。

样本区间 复权方式 信号数 未来函数检查结论
20230101 至 20260930(交易日口径) 前复权 按条件选股结果导出后计数 不涉及 ZIG 类函数,REF 全部为正向回溯
同上区间,截止日改为 20241231 前复权 与上一行同口径重新计数 与全区间对照,历史段触发时点是否位移
全区间换后复权重跑 后复权 重新计数 比较两项结果,确认复权影响落在哪些时点
留出样本外区间,参数在样本内固定 与样本内一致 再次计数 样本外是否仍用到未来数据,单独复核

回填这张表时按行检查三件事:这一行的复权方式与本行信号数是否来自同一次取数;这一行的样本区间与其他行是否写清可比性;这一行的未来函数检查结论是否真的跑过,而不只是填了「无」。

七、口径复核的落点,是把不确定项写成注明项

口径不是要把所有不确定项都消除,那是做不到的:本地数据总有没下载的一段,样本总有已经消失的标的,历史总有无法在当时取得的确认信息。能做的,是把每一项对应的取值或状态写进记录,让这份统计在被人重新使用时,一眼能看出它对应的是哪个范围的数据。通达信选股公式回测口径的价值就在这里,它不保证数字整齐,只保证数字的来路可查。

落笔时按四问过一遍:样本区间写全了吗,复权方式标了吗,未来函数检查跑了吗,偏差项注明了吗。四问都留痕,通达信选股公式回测口径这条线就算立住了,剩下的判定尺度属于另一件事,要不要引入判据、用哪一套判据,都是拿到干净数据之后才轮到的话题。

本文只作技术研究口径,不涉及也不构成对任何标的的判断。

站内还有 回测与风险验证 的条目,选股公式与预警 里讲条件到预警的落地,公式编写教程 里讲语法与函数,可对照查看。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。