搜「SOBV 指标」,能拿到三份互不相同的源码:方向累加、涨跌日量差、收盘位置加权。通达信SOBV指标公式没有统一的内置实现,三份画在同一天同一只股票上,数值能差出几倍。

这不是谁抄错了。成交量累计类指标本来就没有统一算法,各家给出的定义互不相同,搬来搬去之后版本越来越多。写公式之前,先确认手上那份属于哪一类,比研究参数更靠前。

一、先确认说的是哪一份

把三份源码并排看,差别落在两个地方:平盘日怎么记,以及累加窗口是全部历史还是固定长度。

写法 每日贡献 平盘日 窗口 数值形态
方向累加型 涨记正量,跌记负量 记零 全部历史 长序列,随上市时间拉长
涨跌日量差型 上涨日与下跌日分别求和 两侧都不记 固定 N 根 围绕零轴摆动
位置加权型 收盘在当日区间的位置乘成交量 仍按位置记 全部历史 单调累加,无负值

三行的差别足够大,以至于同名指标的阈值无法通用。方向累加型的读数是累计总量,随上市年份增长;涨跌日量差型的读数在正负之间来回;位置加权型只增不减,形态上更像一条缓慢抬升的斜线。

判断手上那份是哪一类,看两处就够:源码里有没有 IF 判断收盘与前收的关系,以及 SUM 的第二个参数是 0 还是变量。有 IF 判断、SUM 第二参数为 0,是方向累加型;SUM 第二参数是 N,是涨跌日量差型;没有前收判断、直接对价格位置加权,是位置加权型。

二、写法一:按涨跌方向逐根累加

这是与 OBV 最接近的一份,也是网上流传最广的一份:

{ 写法一:方向累加型,全历史累计 }
VA:=IF(C>REF(C,1),V,IF(C<REF(C,1),-V,0));
SOBV:SUM(VA,0);

先算每天的方向量 VA:收盘高于前收记正成交量,低于前收记负成交量,持平记零。再用 SUM 的零窗口把 VA 从头累加。SUM(X,0) 在通达信里表示从第一根有效 K 线加到当前根,窗口随数据长度自动延伸。

这份写法有一个隐含前提:价格是连续的。除权日价格跳空,前收是除权前价格,当天的涨跌方向会被判成大幅上涨或大幅下跌,方向量的符号跟着错。用前复权数据能绕开这一处,用不复权数据则要在除权日前后分段看。

平盘日记零,看起来无害,实际会让曲线在这类交易日拉平。一只长期横盘的股票,方向量连续多日记零,SOBV 走成一条水平线,斜率消失,后面的读数也就无从比较。

三、写法二:上涨日量减下跌日量

通达信SOBV指标公式的第二种写法,把正负两侧拆成两个求和,再相减,窗口固定:

{ 写法二:涨跌日量差型,窗口 N 根 }
N:=20;
UPV:=SUM(IF(C>REF(C,1),V,0),N);
DNV:=SUM(IF(C<REF(C,1),V,0),N);
SOBV:UPV-DNV;

UPV 是 N 根之内所有上涨日的成交量之和,DNV 是下跌日之和,两者相减得到区间净量。这个数有明确的量纲:单位与成交量一致,正数表示区间内上涨日的量更多,负数相反。

因为窗口固定,读数不会随上市时间无限拉长,跨股票比较时至少落在同一量级上。窗口改大,覆盖的交易日变多,读数总量变大;窗口改小,读数在零轴附近来回得更快。

这份写法与成交量的关系是线性的:区间内每一手成交,要么进 UPV,要么进 DNV,要么两边都不进。平盘日两边都不进,相当于从区间总量里被剔除。用区间内成交量总额减去平盘日的量,应当等于 UPV 加 DNV,这一步可以拿来做核对。

涨跌日量差型也有符号问题。除权日被判成大涨或大跌,那一天的量会整笔进到某一侧,把区间净量拉出一段台阶。窗口长度如果是 20,这段台阶要在序列里存在 20 根才会退出,看着像一次持续的信号。

四、写法三:用收盘在当日区间的位置加权

第三份不看前收,只看当天收盘落在最高价与最低价之间的哪个位置:

{ 写法三:位置加权型,按收盘位置分配成交量 }
SOV:=IF(H=L,0,(C-L)/(H-L)*V);
SOBV:SUM(SOV,0);

收盘贴着最高价,比值接近 1,当天成交量几乎全额记入;收盘贴着最低价,比值接近 0,只记入很少一部分。这个思路把「收在什么位置」量化成了权重,比二值判断保留了更多信息。

H 等于 L 的位置要先挡住,否则分母为零。一字板当天最高价等于最低价,价格区间退化成一个点,位置无从定义。上面用 IF 把它记成零,代价是一字板的成交量被整笔丢掉;记成 0.5 或记成与前一日相同,都是可选的处理,选哪种要在注释里写清楚。

位置加权型只增不减,曲线单调向上,斜率代表加权后的量能强弱。它没有负值,也就没有「净流出」这个概念,读法与另外两份完全不同。拿它的数值去套方向累加型的阈值,得不到有意义的结果。

五、三种写法在拐点处的差别

取一段先涨后跌的行情,三份写法的反应顺序不一样。方向累加型在涨段持续抬升,跌段持续下行,拐点出现在方向反转的那一根。涨跌日量差型在涨段为正,跌段转负,穿零轴的位置比前者晚一些,因为窗口里还留着上涨日的量。位置加权型在涨段斜率变陡,跌段斜率变缓,曲线始终向上,只是速度变了。

这个差别决定了两件事。第一,方向类判断只能用前两份,位置加权型给不出方向。第二,三份的拐点时间不一致,把它们叠在同一张副图上比较「谁更准」,比较的其实是窗口与权重的差异,不是指标本身的优劣。

平盘日的处理也会在拐点附近放大。连续横盘之后突然放量上涨,方向累加型在横盘段拉平,突破当根跳起;位置加权型在横盘段仍在缓慢累加,突破当根的斜率变化没有那么突兀。同一段行情,两条曲线的形态可以完全不同。

六、缩放与均线:量纲不统一带来的麻烦

通达信SOBV指标公式里用到的成交量字段 V 以手为单位。方向累加型把全历史的量加在一起,数值很快上到百万级,副图纵轴被拉到很大,早期的波动压成一条直线。常见的处理是除以 10000 换成万手:

{ 除以一万换成万手,纵轴刻度更好读 }
VA:=IF(C>REF(C,1),V,IF(C<REF(C,1),-V,0));
SOBV:SUM(VA,0)/10000;
MASOBV:MA(SOBV,34);

缩放只改刻度,不改形状。真正的麻烦在于跨股票比较:两只上市年限不同的股票,方向累加型的读数没有可比性,只能比斜率或比区间差值。想横向排序,用涨跌日量差型更合适,因为它的窗口固定,量纲一致。

均线的周期也要跟着写法走。全历史累计的曲线本身很平滑,再叠一条长均线,两条线贴得很近,交叉信号稀疏;固定窗口的曲线波动大,均线周期取窗口的一半左右,交叉才有区分度。

七、验证:从区间成交量总额倒推

写完先做一次算术核对,不用等看盘。取一段 20 根的区间,把每天的成交量抄下来,按涨、跌、平三类分别求和,再与公式输出的区间变化量对照:

  1. 涨跌日量差型:把区间末值与区间初值相减,应当等于「上涨日量之和减下跌日量之和」。对不上,先查窗口是否真是 20,再查平盘日有没有被算进某一侧。
  2. 方向累加型:区间变化量应当等于「上涨日量之和减下跌日量之和」,与上一项相同,差别在于它的起点是第一根 K 线而不是区间初值,核对时要用差值而不是读数水平。
  3. 位置加权型:区间变化量应当等于每根 K 线的 (C-L)/(H-L)*V 之和。手算三根就能看出权重是否按预期分配。

第二步做形态核对。按 Ctrl+F 打开「公式管理器」,在「技术指标公式」下新建,粘入源码,点「测试公式」,输出区会列出 SOBV 与均线的当前值。再把软件自带的 OBV 画在同一只股票上,方向累加型与本机 OBV 的形态应当一致,位置与幅度可能不同,拐点应当对得上。

第三步确认数据长度。SUM(X,0) 从第一根有效 K 线开始累加,本地数据只下载了最近几年,起点就比别人的晚,读数自然不同。核对时用同一段区间的差值,不要用读数水平直接对读数水平。

通达信SOBV指标公式的选型,落到一句话:要比方向,用带 IF 判断的前两份;要比区间总量,用窗口固定的第二份;要看收盘位置的强弱,用第三份。选定之后把写法、窗口、缩放三行写进公式注释,下次换股票或换数据源时,对着注释核一遍,比凭印象回忆可靠。

站内还有 通达信公式编写教程 的条目,量价形态与信号拆解 讲量能条件的构造,通达信指标原理与参数 讲累计口径与窗口参数。

本文只作技术研究口径,内容是公式写法与取数口径,不涉及也不构成对任何标的的判断。

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