通达信基本面选股公式最容易出问题的地方不在条件怎么写,在于条件依赖的那批数字有没有进本机。财务字段与行情字段是两套数据,行情每天跟着收盘走,财务数据按报告期整批更新,本机没下载就只能取到空值。空值参与比较,结果是一条记录都不返回,公式本身却编译通过,看起来像是条件写错了。
一、两套数据,两条更新线
行情数据是逐日的:开高低收、成交量、成交额,收盘之后补齐当天的部分。财务数据是逐期的:一份报表对应一个报告期,全市场同一批入库。两者的更新节奏不同,取数的路径也不同。
通达信的数据下载入口里,财务数据是单独的一类,与日线、分钟线并列。不同版本里这一项的名称可能是「财务数据」或「专业财务数据」,位置在数据下载对话框的列表里。第一件事是确认它被勾选过,并且最近一次下载成功。这一步没做,后面所有的条件都在跟空值比较。
| 数据 | 更新单位 | 本机缺失时的表现 |
|---|---|---|
| 日线行情 | 交易日 | K线断档,均线类条件失真 |
| 财务数据 | 报告期 | 财务条件恒为空,命中数为零 |
| 板块与状态 | 随客户端更新 | 范围过滤失效,结果范围偏大或偏小 |
二、报告期与公告期是两个时间轴
报表上的科目按报告期口径:一季度末、半年末、三季度末、年末。这些数字什么时候能被看到,取决于披露进度。年报要在次年四月底之前披露,半年报在八月底之前,三季报在十月底之前。也就是说,一只标的在三月看到的财务数据,最新的一期多半还是上年三季报。
公式取的是本机库里「最新一期」的财务值,不区分这一期在历史某一天是否已经公布。用这样的序列去做历史回看,等于让过去的K线用上了当时还没披露的数字:回看结论看起来很好,实盘按同一套条件跑却对不上。这不是公式写错,是数据的时间轴错位。
处理办法有两条。做当日筛选,按最新一期取数没有问题,因为筛选发生在今天。做历史回看,要么把观察区间限定在披露截止日之后,要么在条件里加一层时间限制,只统计那些在观察日之前已经披露的报告期。前一条容易做到,后一条需要额外的日期字段配合。
三、字段从函数列表里查,别背编号
财务字段在函数列表里按类别排列:每股指标、规模指标、成长指标、盈利指标、偿债指标各成一组。字段的名称与编号在不同版本之间有过调整,凭记忆默写编号,是编译不通过与取值错位的主要来源。
可靠的做法是打开公式编辑器,点插入函数,在财务分类里按中文名找到需要的项,双击插入。插入之后把字段名连同注释一起写进源码,日后换版本时,注释还能告诉你这一行原来想取什么。
四、单季与累计:利润表要先换算
利润表与现金流量表的科目是年初至今的累计值。三季报里的营业收入,是一月到九月的合计,不是第三季度单季。要单季的数,得用本期累计减上一期累计;一季度没有上一期,直接取累计值即可。
{单季口径:本期累计减上期累计,一季度直接取累计}
本期营收:=FINANCE(某营收字段);
上期营收:=REF(本期营收,某期数);
单季营收:=IF(上期营收>0,本期营收-上期营收,本期营收);
骨架里的字段与期数两处占位,按上一步从函数列表里查到的实际名称填。期数取多少,取决于比对的是季报还是半年报:季报对季报,间隔一个季度;半年报对半年报,间隔两个季度。期数填错,减出来的差值没有意义,而且不会报错。
资产负债表类科目是时点值,不是累计值,不需要做这个换算。把两类科目混在一支公式里做同比,结论会互相矛盾。
五、空值、负值与除零:三处会让结果失真
第一处是空值。上市时间短的标的,同比类字段没有上一期可比,取值落空。空值参与算术会得到不可预期的结果,参与比较则一律不成立。条件里先加一条上市天数或数据完整性的前置判断,可以把这批标的挡在外面。
第二处是负值。亏损标的的每股收益为负,用它去做「小于某个数」的判断,方向被反转,条件反而把亏损的标的选了进来。要么在条件里显式要求该字段大于零,要么把判据改成先取正再算比值,或者改用排名,别让符号悄悄改变筛选方向。
第三处是除零。净利润为负时,用净利润做分母的比值会变成负数或者无意义的大数;股东权益为负时同理。这类标的在结果里表现为极端值,排序时跳到两端。处理办法是在分母上加一道保护:分母大于零才计算,否则输出空值。
{分母保护:分母不大于零时不输出,避免极端值跳到排序两端}
分母:=FINANCE(某分母字段);
比值:IF(分母>0,分子/分母,DRAWNULL);
六、先收范围,再叠财务条件
条件选股是对全市场逐只求值,财务字段的读取比行情字段重。把范围收窄放在前面,能少算一大截:先按板块、按状态排除,再叠行情条件,最后叠财务条件。顺序不影响结果集,影响的是耗时。
状态字段里有两类值得先排除。一类是风险警示类,名称里带标识的标的;另一类是长期停牌与退市整理期的标的,它们的最新财务数据可能是很久以前的报告期,比进结果里会污染统计。排除写法按客户端的状态字段来,字段名同样在函数列表里查。
七、一个能直接套用的骨架
把上面几条拼起来,得到一支结构清楚的公式:范围过滤、行情条件、财务条件三层,每层单独成段,中间量用冒号加等号。
{第一层:范围与状态}
非风险警示:=IF(某状态字段=0,1,0);
上市够久:=BARSCOUNT(CLOSE)>某天数;
范围:=非风险警示 AND 上市够久;
{第二层:行情条件}
趋势:=CLOSE>MA(CLOSE,60);
{第三层:财务条件,字段名按函数列表填写}
营收:=FINANCE(某营收字段);
上期营收:=REF(营收,某期数);
有增长:=IF(上期营收>0,营收>上期营收*1.2,0);
结果:范围 AND 趋势 AND 有增长;
骨架里的 1.2 是示例门槛,换成什么值取决于要看的增速区间,写进参数表比写死在正文里好维护。三层之间用 AND 连接时,任意一层返回空值,整体就不成立,这也是前面几节反复强调空值处理的原因。三层分开写还有一个好处:通达信基本面选股公式出问题时,能按层定位,先看范围,再看行情,最后看财务,不用把整段推倒重来。
八、验证:单只核对、边界核对、数量核对
单只核对:挑一只结果里的标的,把公式用到的财务字段用文字函数打到副图上,与客户端里按 F10 打开的公司资料逐项对照。数值对不上,先查报告期是不是同一期,再查字段是不是同一个口径。
边界核对:把条件里的门槛从宽到严改三次,看结果数量是否单调下降。不单调,说明条件之间有相互抵消,或者某处空值处理把结果翻了过来。
数量核对:把财务条件整段去掉,只留范围与行情条件,记下数量;再叠上财务条件,看比例是否在可解释的范围内。落差过大,先查财务数据是不是只下载了一部分,再查报告期是不是太旧。
三处核对做完,公式的口径就落地了:数据是否完整、报告期是哪一期、单季还是累计、负值与空值怎么处理,四项都能说清楚。以后换门槛、换季度,改的是参数,不是结构。
通达信基本面选股公式的门槛不在语法,在数据。把财务数据下载、报告期口径、单季换算、空值负值这四件事处理干净,条件本身只剩几行。下一次结果为空时,先看数据,再看条件。
站内还有 通达信选股公式与预警 的条目,讲条件组合与排序;指标回测与风险验证 讲回看时的口径对齐;复盘方法与数据工具 讲盘后数据补全的顺序。
本文只作技术研究口径,内容是公式字段与数据处理方式的说明,不涉及也不构成对任何标的的判断,也不含任何收益预期。文中字段名与门槛均为示例,请按自己客户端里的函数列表与数据情况填写。
