杜香和,吴春祥
(1.时代出版传媒股份有限公司,合肥 230000;2.广州工程技术职业学院,广州510075)
筹码分布表示的是全部流通盘持仓成本的分布状态,与股价在同一个坐标系上,反映了在不同价位上投资者的持仓数量[1]。通过筹码分布的密集与发散来表现市场筹码的转移状态,为投资者进行证券市场分析提供更为直观的帮助。
使用交易软件的传统投资者对筹码并不陌生,诸如指南针、大智慧和通达信等主流交易软件都提供了筹码指标,但筹码的核心算法一直处于保密状态,在量化平台上也缺少筹码指标,对由传统投资转到量化平台投资的用户来说,是一个弊端。
基于行为金融学[2-3]的股票筹码移动算法是在传统筹码算法的基础上,将交易行为特性引入筹码移出算法,以五边形算法和成交平均价代替最高最低平均价计算移入筹码,使得计算模拟值更接近真实交易。在完善核心算法的基础上,通过建立起完整的筹码计算分析系统,为量化平台提供筹码量化分析指标,为量化提供更多选股因子和筛选条件。
假定流通筹码总量不变,某交易日N 的筹码分布已知,下个交易日N+1 的筹码分布计算共2 步:
(1)依据N+1 日的成交量,从原筹码分布中移出当日的成交量;
(2)依据N+1 日的成交价,将移出的筹码移入到成交价的相应位置。
股票上市的首个交易日,可以认为所有筹码均位于发行价上,从上市第一日开始按上述步骤循环计算,就可以得到当前日期的筹码分布。在某一价位筹码堆积数量大,则说明在该价位持仓数量多[4];在某一区间价位筹码堆积数量少,则说明持仓投资者股票已陆续售出。
图1 筹码移动示意图
通过上述步骤可以看出筹码算法有3 个输入数据和1 个输出数据。输入数据分别为交易日N 的筹码分布、下个交易日N+1 的成交量及N+1 日的成交价;输出数据为N+1 日的筹码分布。其中,成交量使用当日成交量除以流通筹码总量(即换手率)。
基于行为金融学的股票筹码移动算法在计算移出筹码时引入了行为金融学观点,对交易日N 及历史筹码分布进行切片分析,在计算移入筹码时采用更为精确的五边形算法,并使用成交平均价作为五边形顶点。而市场上的主流软件在计算移入筹码时多采用三角形算法,以最高成交价和最低成交价的算数平均数作为三角形的顶点。经不完全测试,基于行为金融学的股票筹码移动算法计算的数据对支撑点位和阻力位的判断比传统筹码算法要更加精确。
传统算法在计算移出筹码时主要有2 种方法:①平均法,认为每个持仓价位卖出股票的机会均等,计算时按N 日持仓价格均等移出筹码;②比例法,认为筹码堆积数量多的价位卖出的机会较大,相反,筹码堆积数量少的价位卖出的机会较小。市场上主流的筹码计算方法基于比例法,因此,传统筹码移动算法只是一种对持仓情况的模拟推演,与真实交易情况可能存在较大差异。
行为金融学认为,投资者在市场上并不具有完全理性[5-6],投资过程中很多变化和过程是由人的心理决定的[7]。其中,时间对投资者心理的影响非常大[8],在股票投资中,有很多关于时间的术语,如:短线投资、长线投资、时间换空间等。巴菲特擅长于价值投资[9],价值投资周期较长,属于长线投资;个人投资者资金量少,购买与出售灵活方便,以中短线投资居多[10]。不难看出,时间周期对于投资者决定是否出售手中股票有较大关系[11-12],即移出筹码的计算若综合考虑时间因素,则更能反映持仓价格变化,更接近真实交易情况。
基于以上思考,不同持仓时间出售股票的概率不同,设持仓时间T 继续持有股票的概率为H,Ti(i=1…n)为抽样选择的时间切片[13],对应持有率为Hi(i=1…n)(算法中以5 个时间切片:5、10、20、60、100,对应持有率:90%、80%、60%、20%、8%为例。时间切片点、切片数量及持有率可依据不同股票及走势进行调整),依据某交易日N 及N 时间切片之前筹码分布情况作为依据,计算下个交易日N+1 筹码的移出位置及移出数量[14]。
表1 时间切片及持有率示例
表2 不同切片时间段的持仓价格
K 为持仓价格,Ki(i=1…n)为间隔相等的连续价格,Cm-n表示在Tm时间切片Kn价格上的筹码堆积量,流通筹码总量C 不变。
表3 通过移出率计算N+1 日持仓量
CN-n表示在交易日N 在Kn价格上筹码堆积量,Rn为交易日N+1 在Kn价格的筹码移出率,Cin-n为交易日N+1 在Kn价格的筹码移入量,C(N+1)-n为交易日N+1 在Kn价格上的筹码堆积量。其中:
相对于移出筹码的计算,移入筹码是有据可寻的。在对移入的筹码进行累加时,有明确的最高价和最低价,移入价格区间一定发生在最高价和最低价之间。较准确的方法是通过较小的时间颗粒度累加成交量求出价格区间内的筹码移入量,例如通过累加发生在某价格位置分钟行情的成交量计算在该价格的筹码移入量,该方法需要较多的低级别数据,计算量较大。
图2 美的集团(000333)3日分钟级别成交量-价格分布图
简易做法是利用最高价、最低价和成交平均价,构造一个三角形或由长方形加三角形构成的五边形作为近似值,来替代真实筹码移入情况。其中,成交平均价是市场成交价的统计计算值。主流的筹码移入算法构建的是等腰三角形,即利用最高价和最低价的算数平均价计算,而事实上算数平均价与成交平均价相等的机会很小[15]。
图2 是美的集团(000333)在2018 年5 月31 日、7月24 日、8 月17 日的分钟行情数据累计的成交量-价格分布图[16],横坐标为成交价格,纵坐标为以0.1 元为计算单位累计的成交量,图中细线为成交平均价。可以看出,成交量-价格分布图并非呈等腰三角形,图中,成交平均价与成交量最大的价格区域有紧密的联系,即成交量越大的价格区域越接近成交平均价,因此,使用成交平均价较算数平均价更接近真实行情。
从图2 可以看出,使用平均价构造等腰三角形与真实筹码移入情况差异较大。本算法使用成交平均价构造五边形作为近似值来替代真实筹码移入。构造的五边形如图3 右侧五边形图案。
图3 简易的移入筹码构造分布
Python 语言在金融领域有着广泛的应用[17-18],尤其是在数值计算处理方面有众多可扩展包可以灵活调用。筹码移动算法使用Python 语言实现,交易行情数据通过互联网量化平台标准API 接口获取,筹码计算结果数据使用.csv 文本格式保存,行索引为K,列标题为交易日期,每只股票的筹码数据使用独立.csv 文件保存。
考虑到筹码交换时使用的是换手率,流通筹码总量在算法中使用固定值代替可以简化程序计算,且不影响输出结果;持仓价格K 使用0.1 元作为间隔单位,若使用0.01 元则会增加10 倍以上的计算量及存储量,0.1 元可以满足对市场行情方向的判断和分析应用。
算法开始是读取已计算的筹码数据文件C,检查持仓价格K 的范围,LChip 为最低持仓价位,HChip 为最高持仓价位,T 用于存放时间切片,H 为Series 类型,其索引是时间切片,值为持有率,ChipM 使用支持列运算pandas.DataFrame 结构类型,用于存放移出筹码的中间结果。
计算移出筹码率的伪代码如下:
def CalcR:
1 ChipM(N+1)=CN
2 for Tiin T:
3 ChipMTi= CTi*(1-Hi)
4 for(n=0;n<=HChip-LChip;n++):
5 for Tiin T:
6 ChipM(N+)1-n= ChipM(N+)1-n-ChipMTi-n
7 R= ChipM(N+1)/C
8 return R
有了移出筹码率,就可以方便的计算出移出的筹码量。
在计算移入筹码量时,需要用到最高价Hprice、最低价Lprice 和成交平均价Aprice,CLen 为以0.1 元为间隔单位时一共占用的记录行数:
构建移入筹码五边形时需要设定长方形和三角形占用的面积比,经对分钟行情成交数据累加计算得知,分配比例变化波动范围集中在1:4~1:2,算法使用3:7比例执行,iRate 为N+1 日的成交量,AvC_R 为长方形部分单位价格移入筹码量,计算公式为:
AvC_T 为三角形部分单位价格平均移入筹码量,计算公式为:
step_L 为三角形对应的最低价一侧的上涨梯步,计算公式为:
step_H 为三角形对应的最高价一侧的上涨梯步,计算公式为:算法伪代码如下:
通过移出筹码量和移入筹码量,就可以算出N+1日的筹码分布情况。引入行为金融学理论观点,结合时间对投资者心理的影响,可以更准确地模拟真实筹码移出过程。与传统筹码移出算法相比,通过灵活的时间切片和持有率控制,更能反映持仓价格变化,更接近真实交易情况。
从筹码分布算法原理可知,筹码数据应从股票上市首个交易日起开始计算。经笔者测试,若从任意交易日开始,计算约300 组交易日数据(影响数据组大小的主要因素是换手率,换手率越高需要的数据组数越少,换手率越低需要的数据组数越多)后的筹码数据开始与从股票上市首个交易日开始计算的数据接近。
为了满足应用[19-21],本文对算法进行了扩展:
(1)连续计算,即给定某只股票连续交易数据,计算其筹码数据;
(2)按交易日计算,给定下个交易日N+1 所有A股交易数据,通过历史筹码计算N+1 日筹码数据;
(3)复权计算,股票复权后按后复权价更新已计算筹码数据;
(4)多线程运算,各股数据相互独立,适合使用多线程同时计算,提高运算效率;
(5)自动计算,设定程序定时访问API 自动计算,数据自动存档回传至量化平台。
通过量化平台API 接口取自2013 年至今所有A股日交易数据[22],用本算法进行运算得到2015 年后至今所有A 股的筹码分布数据。例如,图4 是方大集团(000055)在2018 年5 月22 日、6 月8 日的筹码分布图;图5 是深康佳A(000016)在2019 年1 月4 日、1 月24 日的筹码分布图。
图4 方大集团(000055)2日的筹码分布图
图5 深康佳A(000016)2日的筹码分布图
通过筹码分布数据,可以计算筹码是否集中于某一价格位置,即筹码密集度,并可以据此推断股价的支撑点和阻力位。图6 是深康佳A(000016)在2017 年6月14 日某交易软件上的筹码图,图7 深康佳A(000016)在2017 年6 月14 日使用本筹码算法计算的筹码图。
图6 深康佳A(000016)在2017年6月14日某交易软件上的筹码图
图7 深康佳A(000016)在2017年6月14日使用本算法的筹码图
从行情数据上可以看到,深康佳A(000016)在2017年6 月15 日的成交最高价为4.68 元,遇阻力位后向下回调,阻力位一般发生在筹码密集区域的边缘[23]。对比交易软件上的筹码图和本算法的筹码图发现,交易软件的筹码密集区域边缘为4.50 元位置,而本算法的筹码密集区域边缘为4.70 元位置,与6 月15 日的成交最高价4.68 元更接近。
基于行为金融学的观点,将交易行为特性引入筹码移出算法,以五边形算法和成交平均价代替最高价和最低价的平均值计算移入筹码,使得计算模拟值更接近真实交易。经测试,基于行为金融学的股票筹码移动算法计算的数据比传统筹码算法对支撑点位和阻力位的判断更准确,原因一是在计算移出筹码时引入了行为金融学观点;二是在计算移入筹码时使用更为接近的成交平均价及五边形算法。
进一步研究将依据个股股性动态调整时间切片方向开展,提供筹码算法的准确性,并尝试开发有效性测试平台。