背景
朋友的打板策略要计算通达信中的这个“封单占流通Z”指标,但怎么算都不对,计算出来的数值比实际中的往往来的小。
如下图:
流通股本
查看通达信的说明,这个流通Z其实是自由流通股本,并不是通常行情软件界面的“流通股本”。
为什么这个“流通股本”要打引号呢?因为在这些行情软件中,这个数据并不是真的流通股本。流通股本包括两部分:无限售条件的流通股本 和 有限售条件的流通股本,而软件中这个界面显示“流通”其实是无限售条件的流通股本。
验证一下把:
从掘金数据中获取流通股本和无限售条件流通股本,看下具体的数值:
类型 | 数量 |
流通股本(circ_shr) | 5681544596 |
无限售条件流通股本(ttl_shr_unl) | 5613049012 |
是吧,截图中显示的“流通”是56.1亿,对应的就是这个无限售条件流通股本。
注:上述数据为002195在2024-12-03的数据,无限售条件流通股本在掘金中的字段名称为ttl_shr_unl,可以通过股本函数查询,例如:
stk_get_daily_basic_pt(symbols=['SZSE.000001', 'SZSE.300002'], fields='circ_shr,ttl_shr_unl',trade_date=None, df=True)
自由流通股本
但通过无限售条件流通股本计算出来的封单占流通Z与实际不符,往往偏低很多。
在网上查找相关定义,如百度百科上的定义:
可以发现,这个自由流通股实在非限售流通股本的基础上进一步剔除了5%以上持股的股本。
怪不得计算出来的结果会偏低,原来是分母算多了。
那就将5%以上持股的股本剔除掉,正好掘金数据有十大股东数据,可以找出5%持股数据:
# 自由流通市值
mv = stk_get_daily_basic_pt(symbols=code, fields='circ_shr,ttl_shr_unl', trade_date=current_date_str, df=True)
for i in range(len(mv)):
index = mv.index[i]
code = mv.loc[index,'symbol']
top_sh = stk_get_top_shareholder(symbol=code, start_date=current_date_str, end_date=current_date_str,tradable_holder=True)
if not top_sh.empty:
top_sh = top_sh[top_sh['share_ratio2']>5]
top_sh_value = sum(top_sh['share_ratio2'])*0.01
else:
top_sh_value = 0
mv.loc[index,'real_ttl_shr_unl'] = mv.loc[index,'ttl_shr_unl']*(1-top_sh_value)
我们将剔除5%比例的数据更新到上面的表格中对比下:
类型 | 数量 |
流通股本(circ_shr) | 5681544596 |
无限售条件流通股本(ttl_shr_unl) | 5613049012 |
剔除5%以上持仓的 无限售条件流通股本 | 5065804798 |
那再来计算下“封单占流通Z”,封单是680429手,680429*100/5065804798=0.013431~=1.34%。
完美! 跟通达信上的数据能够对得上!
PS:掘金研学会员/策略代写,可以找我,有优惠~