跑出来的结果里有几只不该被选中的标的,逐条看过去,问题不在条件本身,而在条件之外少了一层过滤。通达信公式过滤风险股要做的,就是在结果集上再加一组判据,把带风险标识的标的挡在外面。这组判据落在三类可查字段上,每一类都有自己的取数边界,用错一处会把正常标的也一起挡掉。下面按字段类型、写法、失效情形、核对顺序逐层说。
一、过滤动作落在哪三类字段上
公式能读到的信息分三层:名称与代码、K 线数据本身、板块与交易状态。风险标识正好可以分别从这三层各取一部分。
| 字段类别 | 取什么 | 适用场景 |
|---|---|---|
| 名称与代码前缀 | 标的名称或代码开头的标识字符 | 名称里带风险标识的标的 |
| 数据长度 | 有效 K 线根数 | 上市时间短、样本不足的标的 |
| 板块与交易状态 | 所属板块、当日是否有成交 | 归属特定板块或长期无交易的标的 |
三类判据的作用方式都是「返回一个可以参与逻辑运算的值」,把三个条件用 AND 串起来之后放在选股条件里,就是在原有条件上再加一层闸门。这里不涉及任何对标的的取舍判断,只是按可查字段做的数据筛选。
二、名称类判据:前缀匹配与大小写
名称类判据用名称前缀函数来做,写法是把要匹配的前缀写成字符串放在括号里,函数返回成立或不成立。它的作用方式是把名称的头部与给定字符串对照,返回一个布尔值,可以和其他条件用 AND 连接。
这一处最容易出问题的地方有两个。
第一个是前缀与包含的区别。名称指示符位于名称最前面,所以判据要用前缀匹配。用字符串包含类的写法去判断,会连带匹配到名称中间出现同样字符的标的,把不该挡的挡掉。
第二个是大小写与半角全角的差异。同一个标识在不同数据源里可能以不同的大小写形式出现,公式里写的字符串要与本机数据里的形态一致。核对办法是找一个你已知带标识的标的,单独跑一次只含这一条判据的公式,看它是否被选中,再找一个名称里不含标识的标的对照。
{名称前缀判据:只保留不匹配的,也就是把带标识的挡在外面}
NOTST:=NOT(NAMELIKE('ST'));
NOTDEL:=NOT(NAMELIKE('PT'));
{把名称类判据与原条件串起来}
BASE:=C > REF(C,1);
COND: BASE AND NOTST AND NOTDEL;
三、数据长度类判据:从哪天算起
数据长度类判据取的是有效 K 线根数,用 BARSCOUNT 系列函数。写 BARSCOUNT(C),返回的是从第一根有效数据到当前根的根数,它随每一根新数据递增。
用通达信公式过滤风险股中的数据长度判据时,判据是「根数大于某个阈值」。阈值定多少取决于你用多少根数据来确认信号:如果条件里用到了取六十根极值的函数,阈值就至少要覆盖那六十根,否则窗口本身取不到值,判据和条件的失效区间会重叠。
这里有三个必须分清的细节。
第一,它数的是有数据的天数,不是自然日。停牌期间不生成 K 线,这一段不计入。把根数直接当成自然日会高估上市时间,订正办法是用一根已知停牌区间的标的做对照,看它返回的值与自然日差了多少根。
第二,换周期之后根数会变。日线上返回的是交易日根数,周线上返回的是周数,同一份源码挂到周线上,阈值口径要跟着改。
第三,复权设置不改变根数。复权改的是价格序列的取值,不改数据的长度,这一类判据对复权设置不敏感。
{有效数据长度:停牌区间不计入,换周期后数值随之变化}
LEN:BARSCOUNT(C);
ENOUGH: LEN > 250;
{数据不足时前面若干根取不到值,输出会留空}
MA60:MA(C,60);
四、板块与交易状态类判据
板块类判据用的是板块归属函数,返回的是标的所属的板块名称,属于字符串输出。字符串不能直接当条件用,要先转成布尔值,再参与逻辑运算。
这类判据的边界在于板块是会变的。行业归属相对稳定,概念与专题类的板块归属会随调整变化,今天属于某个板块的标的过一段时间可能不在里面。用板块做过滤时要用相对稳定的那一类,并且在记录里写明核对日期,否则过一段时间复核,会以为公式改了。
通达信公式过滤风险股用到的三类字段到这里就齐了,接下来是它们之间怎么串。
交易状态类判据处理的是「当天有没有成交」这件事。长期没有交易的标的在公式里的表现是当日数据为空或成交量为零,条件是取不到输入而不是取值不成立。把这两种情况都写成同一个判断,会让条件在数据缺失时静默通过。分开处理的写法是先判断数据是否有效,无效时直接判不成立。
五、判据写反的后果
三类判据都是布尔值,写反一处,结果会朝两个方向偏,两个方向的表现不一样。
- 判据方向写反:把「不带标识」写成「带标识」,结果集里只剩下本来要挡掉的那一批。这种偏差在结果数量上就能看出来,选中数会突然变得很少。
- 判据范围过宽:用包含匹配代替前缀匹配,或者阈值定得过大,正常标的被一并挡掉,结果集里少了一部分本该在的标的。这种偏差不容易看出来,需要拿一份不经过滤的结果做对照。
- 条件在数据缺失时静默通过:标的在需要的位置没有数据,条件取不到输入,既不算成立也不算不成立。结果是它既没被挡掉,也没被正常选中,落在一个中间态里。
三种偏差都不产生编译错误,公式照常画线,只有对照结果集才发现。这也是为什么过滤判据做完之后需要做一次差分核对。
{三个条件用 AND 串起来,放在选股条件里}
COND: BASE
AND NOTST
AND (LEN > 250);
六、核对顺序与验证方法
按下面的顺序走,每一步都能把偏差定位到一类判据上。
- 先跑一份不加任何过滤的结果,记下条数,作为基准。
- 加上名称类判据再跑一次,看少了哪些。少了的那一批应当全部是名称里带标识的,出现别的标的就说明匹配方式用错了。
- 加上数据长度类判据,看少的那一批是否都是样本不足的。换到周线周期重跑一次,确认阈值口径跟着周期改了。
- 加上板块类判据,核对少掉的那一批在核对日期上确实属于对应板块。
- 拿一条已知长期无交易的标的做单点检查,确认它在条件里的表现是「不成立」,而不是「静默通过」。
这五步做完,三类判据的方向、范围、缺失处理都各自被钉过一遍。写进公式之后,把判据单独做成一条输出线挂上去,用十字光标在几个具体标的上读数,比只在结果列表里看更可靠。
公式里的函数名与可用参数以本机函数说明为准,不同版本与券商定制版之间存在差异。涉及界面入口的部分,请以你所用客户端的帮助文档为准。
本文只作技术研究口径,全部内容围绕数据字段的取数规则展开,不涉及也不构成对任何标的的判断或取舍建议。通达信公式过滤风险股的落脚点始终是「按可查字段做的数据筛选」,不是对标的本身的价值判断。做完之后建议把判据与核对日期记在公式的说明栏里,下次复核时能直接对上。
