把通达信净资产收益率公式写进条件选股,筛出来的名单与财报软件上的排序对不上,这是常见的第一道坎。多数时候不是公式写错了,是两边的口径不同:一边用期末净资产做分母,另一边用期内平均净资产;一边取累计净利润,另一边已经换算成单季。
ROE 这个比值本身只有一层除法,复杂的是分子分母各自有几种取法。下面按取数、时点、分母、极值、落地五个层面拆开讲,最后给一套上机前的手算核对步骤。文中财务函数的字段编号以本机「函数说明」里的序号表为准,不同版本的字段表存在增补。
一、ROE 不是一个数,是一组比法
同样是「净资产收益率」,报表里能看到三个:摊薄 ROE、加权 ROE、扣非后的 ROE。三者的分子分母都不同,数值也不相同。
| 口径 | 分子 | 分母 | 差别来自哪里 |
|---|---|---|---|
| 摊薄 | 本期净利润 | 期末净资产 | 分母只看期末一个时点 |
| 加权 | 本期净利润 | 期内净资产加权平均 | 分母考虑期间内的增减 |
| 扣非 | 剔除一次性损益后的净利润 | 与上面两者之一配合 | 分子剔除了非经营项目 |
三者之间没有换算公式。期内做过增发、分红、可转债转股的公司在摊薄与加权之间差异更明显,分母的时点选择直接改变比值。写公式之前先确定要哪一种,整批条件都按这一种算,不要中途混用。
通达信净资产收益率公式能写出来的,是这三种里的一种。软件里现成的财务字段给的是报表口径的数值,自编公式算出来的则取决于你取的是哪两项、用哪个时点。两者对不上,先查口径。
二、取数:净利润与净资产各取哪一项
通达信的财务数据通过财务函数按序号取,写作 FINANCE(序号)。序号与字段名的对应关系在公式编辑器的函数说明里,不同版本会增补字段,序号可能顺延。取数时按字段名去查序号,比背编号稳。
{ 取数与比值:字段编号以本机函数说明为准 }
净利:=FINANCE(净利润字段);
净资:=FINANCE(净资产字段);
ROE:IF(净资>0,净利/净资,DRAWNULL);
这里有两处容易被忽略。第一处是「净资产」有多种:归属于母公司股东的净资产、所有者权益合计。两者在合并报表里数值不同,取错一项,比值就整体偏移。第二处是「净利润」同样有归属口径,与净资产的口径要配对,归属对归属,合计对合计。
还有一条替代路径:用每股收益除以每股净资产。这条路写起来短,误差来自股本口径。每股收益的股本是期内加权还是期末,每股净资产用的是期末股本,两者不一致时,除出来的比值与直接取两项相除的结果有差距。
取数完成后先别急着算比值,把两个原始字段单独输出看一眼。净利润为负、净资产为正,比值是负数;净利润为正、净资产为负,比值也是负数。两种负数的含义完全不同,靠比值本身分不出来。
三、单季与累计:中报不能直接与年报比
通达信财务字段里的利润类数据,跟着报告期走。一季报是本季累计,中报是上半年累计,三季报是前三季累计,年报是全年累计。同一根 K 线上取到的数值,对应的是最近一期已入库的报告期,不是当季。
想把累计换成单季,只能用相邻两期相减。中报减一季报得二季度单季,三季报减中报得三季度单季,年报减三季报得四季度单季。一季报本身就是单季,不用减。
{ 用相邻两期累计相减得到单季 }
本期累计:=FINANCE(净利润字段);
上期累计:=REF(本期累计,报告期间隔);
单季:本期累计-上期累计;
报告期间隔不是一个固定常数。按季报披露节奏,相邻两期相隔约 60 到 65 个交易日;按年报与三季报之间相隔的交易日数又与前者不同。用 REF 按固定根数回看,遇到停牌或长假会错位,稳妥的做法是按报告期日期对齐,或在公式里用条件判断把四个报告期分开处理。
单季数据与累计数据放在一起排序,会把不同报告期的公司混在一列。二季度单季的 ROE 与全年 ROE 天然不在一个量级,直接比大小没有意义。做横向比较时先统一到同一报告期,做纵向比较时先统一到同一口径。
四、加权与摊薄:分母用期末还是平均
分母用期末净资产,算的是摊薄口径。分母用期内平均净资产,算的是加权口径。平均的算法有两种:期初期末简单平均,以及按月份加权。两种算法在净资产变动集中在年中时差异最大。
通达信的财务函数直接给出的是报表里的净资产,不带平均。想算加权口径,只能自己用期初与期末两项求平均,期初那一项用 REF 回看上一报告期。这一步的间隔与上一节的报告期间隔是同一个问题,同样要对齐报告期而不是对齐 K 线根数。
{ 摊薄与近似加权两种分母 }
期末净资:=FINANCE(净资产字段);
期初净资:=REF(期末净资,报告期间隔);
摊薄ROE:IF(期末净资>0,净利/期末净资,DRAWNULL);
加权ROE:IF(期末净资+期初净资>0,净利/((期末净资+期初净资)/2),DRAWNULL);
两个比值同时输出,能看出分母口径带来的差距。差距大,说明报告期内净资产变动明显,此时用哪一个要在记录里注明;差距小,两种口径可以互换使用,报哪个都不影响排序。
五、负净资产与接近零的分母
净资产为负的公司,ROE 的除法仍然能算出数,但这个数没有解释力。分母是负数,净利润为正时比值也是负的,看着像亏损;净利润为负时比值反而为正,看着像盈利。符号被分母翻转,读的人容易被误导。
分母接近零是另一处。净资产从很小的正数继续减少,分母趋近于零,比值被放大到几千甚至更大,画在副图上会把整条曲线的纵轴拉爆。这类位置要在公式里直接挡掉,不要让极端值参与后续的排序或筛选。
挡的方式是在比值外面套一层判断:分母大于零才输出比值,否则输出空值。阈值取固定数值还是取相对比例,取决于你关注的量级。固定数值写起来简单,相对比例能避开不同规模公司之间的差异。
挡掉之后,条件里还要再加一层净值方向的要求。分母为正、比值也为正,才算有效读数;分母为正、比值为负,说明本期亏损,这类公司应当单独归为一类,不参与「高 ROE」的筛选。
六、报告期与公告期:什么时候这条公式才有数
财务数据入库的时间跟着公告走,不跟着报告期走。一季报的报告期截止到三月末,公告可能落在四月中下旬;在此之前,财务函数取到的仍是上一年年报的数据。同一根 K 线上,价格是当天的,财务数是上一期的,两者的时间轴并不重合。
这个错位在回测里会变成偏差。用某一天的财务数据写条件,实际上用到的是那天已知的最新公告,而不是那天所属报告期的数据。想避免用到未来信息,就得按公告日对齐,把每个报告期的数据从公告日之后才开始使用。
通达信净资产收益率公式本身不带公告日字段,公告时点要靠外部记录或在公式里按固定日期近似。近似会带来偏差,偏差大小取决于你所选样本的公告节奏。回测记录里把这一条写明,比假装没有这层错位更诚实。
七、写成条件时的三处注意
第一处是空值传播。财务字段在部分品种上为空(例如尚未披露、已退市、非股票品种),空值参与比较会得到空结果,条件不成立。筛选前先把空值挡掉,能减少名单里的意外缺失。
第二处是除零。比值写法里已经有判断,但条件里如果直接把比值与阈值比较,空值那一支仍然会参与逻辑运算。稳妥的写法是把「分母大于零」与「比值大于阈值」写成两个条件,用 AND 连接。
第三处是阈值的方向。ROE 高不代表其他条件成立,ROE 低也不代表被排除。把阈值定在哪个数,取决于这批样本的历史分布,取一个能留下足够样本的量级,再逐步收紧。阈值写死在公式里不如提成参数,改起来不用动源码。
八、核对:手算一遍再上机
上机之前先做一次手算。取一只已披露年报的股票,从报表里抄下净利润与期末净资产,算出比值;再把它与公式输出的摊薄 ROE 对照。两者对不上,按下面的顺序查:
- 先查字段口径。归属净利润对归属净资产,合计对合计,两边不能串。
- 再查报告期。公式取到的是哪一期,与你手算的那一期是不是同一期。
- 最后查单位。财务字段的单位是元还是万元,比值不受影响,但如果中间做过缩放,结论会偏。
手算通过之后,再做一次批量核对。把条件选股的结果按 ROE 排序,取头尾各几只,逐只打开财务数据页对照。批量核对能发现单只核对发现不了的问题,比如某一批股票的字段为空、或者某个报告期的数据尚未入库。
在公式管理器里按 Ctrl+F 打开「公式管理器」,选「条件选股公式」新建,把比值与条件分开写,中间量单独输出,测试公式时能看到每一步的取值。中间量不输出,出问题时只能在结果集上猜,排查成本高得多。
通达信净资产收益率公式能做的,是把两个财务字段按指定口径相除并落到条件上。它读的是已经入库的报告期数据,改不了公告时点。把这层依赖写进注释与记录表,比反复调阈值更能让结果稳定。
站内还有 指标回测与风险验证 的条目,通达信公式编写教程 讲财务函数的取数写法,另有基本面选股与财务字段口径的条目可对照。
本文只作技术研究口径,内容是财务字段的取数与比值口径,不涉及也不构成对任何标的的判断。
