收盘之后想把当天「动静明显大于自身平常水平」的票挑出来放进观察清单,第一件事是把「动静」写成一个数。写不出来,筛选就只能靠翻涨幅榜,翻完也说不清挑的标准是什么。
通达信异动选股公式要解决的就是这一步:把口语里的异动拆成几个能逐日复算的量,再给每个量定一个相对自身的基准。下面按三个量的拆法、阈值的定法、盘中与盘后两条链路的差别讲,最后给一份能直接粘进公式管理器的写法。
一、异动在公式里落成三个可算的量
价格与成交的变化,可以用三个角度描述:变化得快不快、当天摆得宽不宽、量能比平常放大多少。对应的三个量是涨速、振幅、量能比。三个量各自独立,互不替代,一个票可以在振幅很小的情况下量能突然放大,也可以在量能平常的情况下价格短时拉开。
| 量 | 算式骨架 | 回答的问题 | 依赖的数据 |
|---|---|---|---|
| 涨速 | 现价 ÷ N 根前收盘 − 1 | 价格在短窗口里移动了多少 | 分钟序列 |
| 振幅 | (最高 − 最低) ÷ 昨收 | 当天价格摆动的宽度 | 当日高低价 |
| 量能比 | 成交量 ÷ 近 N 日均量 | 成交相对自身平常水平放大了多少 | 日线成交量 |
三个量都可以在日线上算,只有涨速必须落到分钟序列上。一条通达信异动选股公式写出来是长是短,取决于你打算把几个量纳入判断,而不是取决于代码的排版。原因很简单:日线一根 K 线已经把一天的波动压成一个收盘价,短窗口的价格移动在日线上被抹掉了。
二、涨速:分子和分母要取同一时点
在 5 分钟周期上写,REF(C,1) 是上一根 5 分钟 K 线的收盘价,也就是 5 分钟前的价格;C 是当前这根已完成 K 线的收盘价。两者相除减一,得到的是 5 分钟窗口的涨速。
{ 5 分钟周期下的短窗口涨速,单位:百分数 }
SPD:=(C/REF(C,1)-1)*100;
窗口拉长就把 REF(C,1) 换成 REF(C,3),得到 15 分钟窗口。这里有一处对称性要守住:分子用已完成 K 线的收盘,分母也用已完成 K 线的收盘。分子改成现价 DYNAINFO(7)、分母仍用上一根收盘,这根 K 线还在走,两次数值就不在同一时点上,算出来的涨速会随刷新跳动。
另一种写法是用行情函数直接取现价与昨收:
{ 以昨收为基准的当日涨速,仅对当日有效 }
SPD2:=(DYNAINFO(7)/DYNAINFO(3)-1)*100;
这一版只在当天有意义,用 DYNAINFO 取的是最新一笔快照,历史 K 线上回看时它返回的是最后一个交易日的值,把序列拉出来看会是一条水平线。做当天盘中筛选可以用,做历史回看不能。
三、振幅:日内高低幅与「相对昨收」是两回事
振幅的常见写法是把当日最高价与最低价相减,再除以昨收:
{ 振幅:日内高低幅相对昨收 }
AMP:(H-L)/REF(C,1)*100;
分母用昨收而不是今开,这一点在跳空开盘的日子差别明显。今天低开 3 个点之后全天在低位窄幅横走,用昨收作分母算出的振幅会把那 3 个点的缺口算进去;用今开作分母,算出来的只是盘中摆动的宽度。两种口径都有人用,混着比较就会得出相反的结论。
还有一种把振幅写成「相对近 N 日均振幅的倍数」,用来描述「今天比平常摆得宽」这件事:
{ 振幅相对近期均值的倍数 }
AMP2:=(H-L)/REF(C,1);
RATIO:AMP2/MA(AMP2,20);
这一版的阈值不能照搬前一种。前一种的数在个位数到十几个点之间浮动,后一种的比值围绕 1 上下摆动,同一个数字放在两套口径里含义完全不同。定阈值之前先把自己用的是哪一版写在公式注释里。
四、量能比:基准日的选择决定结果
成交量放大与否,只有跟自己的过去比才有意义。基准取近 5 日、10 日还是 20 日均量,筛出来的名单能差出几倍。
{ 量能比:当日成交量相对近 N 日均量 }
VR:=V/MA(V,20);
基准窗口短,对突发放量更敏感,也更容易被前几天的异常放量带偏;窗口长,基准更平稳,反应更钝。折中的做法是同时看两个窗口,短窗口放大而长窗口没动,说明这是一次独立的量能变化;两个窗口一起抬起来,说明量能水平整体上了一个台阶,那已经不是单日的异动。
另有一处细节:MA(V,20) 里包含当日。当日放量会把均值本身抬高,量能比被压小一档。想排除当日的影响,把均值改成 REF(MA(V,20),1),用截至昨日的 20 日均量作分母。
五、把三条并成一组条件
下面这段放在条件选股公式里用,日线周期,三条里满足任意一条就进结果集。它是通达信异动选股公式的一个最小可用版本,只含筛选口径,不含方向判断,也不对结果做排序之外的加工。
{ 异动筛选:振幅、量能、价格移动三条取并集 }
N:=20;
AMP:=(H-L)/REF(C,1)*100;
VR:=V/REF(MA(V,N),1);
SPD:=(C/REF(C,1)-1)*100;
COND:AMP>4 OR VR>2 OR SPD>5;
三处写法值得说明。中间量全部用 :=,不进输出区,选股器只认最后那条 COND。三条之间用 OR 取并集,改成 AND 就变成「同时满足」,筛出的数量会掉一个量级。阈值 4、2、5 是示例值,AMP 与 SPD 的单位是百分数,VR 是无量纲倍数,三类数字不能互换位置。
想按强度排序而不是只取并集,可以把三条换成加权求和,输出一个综合分:
{ 综合异动分:三项各自归一后相加 }
SC:=AMP/4+VR/2+ABS(SPD)/5;
COND:SC>1;
归一化的分母就是各自的阈值,这样三项在「刚好触线」时都贡献 1 分。这种写法的好处是能排序,代价是权重是人定的,换一组分母就是另一套排序,别把分数当成客观刻度。
六、盘中链路与盘后链路
盘中使用,数据源是实时快照加当日已生成的分钟线,DYNAINFO 系列可用,涨速那一条能取到最新的;盘后使用,实时快照停在收盘那一刻,DYNAINFO 返回的就是收盘值,这时用日线字段算更稳。
盘后复盘的落地方式是这样:收盘后跑一遍条件,把结果导成一份名单,与前一日的名单并排,看新进与退出。条件选股 结果窗口支持把结果送到板块或导出,具体入口在不同版本里位置不完全一样,找一个能落地成文件的方式即可。名单进观察清单之后,第二天用同一套条件再跑一遍,观察的是名单的留存,不是单只票的涨跌。
站内 复盘方法与数据工具 里讲名单维护的节奏,通达信选股公式与预警 讲条件选股器的调用与结果落地,两篇与本篇是前后关系。
七、失效场景与边界
停牌复牌的当日。停牌期间没有 K 线,复牌首日的 REF(C,1) 取到的是停牌前最后一个交易日的收盘,中间隔了多久不影响取值。算出来的振幅与涨速会把整段停牌期间的累积变化压进一天,这个数字描述的不是一天的波动。
除权除息日。不复权数据下,除权当日的昨收还是除权前的价格,价格被折算下来,涨速会算成一个很大的负数;振幅与量能比不受这一项影响。做历史回看时把除权日标出来,或者统一切到前复权序列再算。
新股与次新股。上市初期没有 20 日均量,MA(V,20) 在数据不足时返回无效值,量能比那条恒不成立,只剩振幅在起作用。结果集里会混进一批只靠振幅进来的票。
阈值随市场状态漂移。同一组阈值在成交整体萎缩的区间会把结果集缩得很小,在成交放大的区间会膨胀。这不是公式的问题,是固定阈值本身的局限。要缓解,把阈值改成相对全市场同日分布的分位数,代价是公式复杂度上一个台阶。
通达信异动选股公式给出的是「按你定的口径,今天哪些票偏离了自身基准」。它不解释偏离的原因,也不判断偏离之后会怎样。把三个量的口径与基准写进注释,隔一个月回头看还能复算出同样的名单,这套条件才算站住了。
延伸阅读:量价形态与信号拆解 讲量价关系的分解方式,通达信公式编写教程 讲中间量输出与参数化的写法。
本文只作技术研究口径,内容是指标字段的取数与条件写法,不涉及也不构成对任何标的的判断。
