杜香和,吳春祥
(1.時代出版?zhèn)髅焦煞萦邢薰?,合?230000;2.廣州工程技術職業(yè)學院,廣州510075)
籌碼分布表示的是全部流通盤持倉成本的分布狀態(tài),與股價在同一個坐標系上,反映了在不同價位上投資者的持倉數量[1]。通過籌碼分布的密集與發(fā)散來表現市場籌碼的轉移狀態(tài),為投資者進行證券市場分析提供更為直觀的幫助。
使用交易軟件的傳統投資者對籌碼并不陌生,諸如指南針、大智慧和通達信等主流交易軟件都提供了籌碼指標,但籌碼的核心算法一直處于保密狀態(tài),在量化平臺上也缺少籌碼指標,對由傳統投資轉到量化平臺投資的用戶來說,是一個弊端。
基于行為金融學[2-3]的股票籌碼移動算法是在傳統籌碼算法的基礎上,將交易行為特性引入籌碼移出算法,以五邊形算法和成交平均價代替最高最低平均價計算移入籌碼,使得計算模擬值更接近真實交易。在完善核心算法的基礎上,通過建立起完整的籌碼計算分析系統,為量化平臺提供籌碼量化分析指標,為量化提供更多選股因子和篩選條件。
假定流通籌碼總量不變,某交易日N 的籌碼分布已知,下個交易日N+1 的籌碼分布計算共2 步:
(1)依據N+1 日的成交量,從原籌碼分布中移出當日的成交量;
(2)依據N+1 日的成交價,將移出的籌碼移入到成交價的相應位置。
股票上市的首個交易日,可以認為所有籌碼均位于發(fā)行價上,從上市第一日開始按上述步驟循環(huán)計算,就可以得到當前日期的籌碼分布。在某一價位籌碼堆積數量大,則說明在該價位持倉數量多[4];在某一區(qū)間價位籌碼堆積數量少,則說明持倉投資者股票已陸續(xù)售出。
圖1 籌碼移動示意圖
通過上述步驟可以看出籌碼算法有3 個輸入數據和1 個輸出數據。輸入數據分別為交易日N 的籌碼分布、下個交易日N+1 的成交量及N+1 日的成交價;輸出數據為N+1 日的籌碼分布。其中,成交量使用當日成交量除以流通籌碼總量(即換手率)。
基于行為金融學的股票籌碼移動算法在計算移出籌碼時引入了行為金融學觀點,對交易日N 及歷史籌碼分布進行切片分析,在計算移入籌碼時采用更為精確的五邊形算法,并使用成交平均價作為五邊形頂點。而市場上的主流軟件在計算移入籌碼時多采用三角形算法,以最高成交價和最低成交價的算數平均數作為三角形的頂點。經不完全測試,基于行為金融學的股票籌碼移動算法計算的數據對支撐點位和阻力位的判斷比傳統籌碼算法要更加精確。
傳統算法在計算移出籌碼時主要有2 種方法:①平均法,認為每個持倉價位賣出股票的機會均等,計算時按N 日持倉價格均等移出籌碼;②比例法,認為籌碼堆積數量多的價位賣出的機會較大,相反,籌碼堆積數量少的價位賣出的機會較小。市場上主流的籌碼計算方法基于比例法,因此,傳統籌碼移動算法只是一種對持倉情況的模擬推演,與真實交易情況可能存在較大差異。
行為金融學認為,投資者在市場上并不具有完全理性[5-6],投資過程中很多變化和過程是由人的心理決定的[7]。其中,時間對投資者心理的影響非常大[8],在股票投資中,有很多關于時間的術語,如:短線投資、長線投資、時間換空間等。巴菲特擅長于價值投資[9],價值投資周期較長,屬于長線投資;個人投資者資金量少,購買與出售靈活方便,以中短線投資居多[10]。不難看出,時間周期對于投資者決定是否出售手中股票有較大關系[11-12],即移出籌碼的計算若綜合考慮時間因素,則更能反映持倉價格變化,更接近真實交易情況。
基于以上思考,不同持倉時間出售股票的概率不同,設持倉時間T 繼續(xù)持有股票的概率為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)為間隔相等的連續(xù)價格,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價格上的籌碼堆積量。其中:
相對于移出籌碼的計算,移入籌碼是有據可尋的。在對移入的籌碼進行累加時,有明確的最高價和最低價,移入價格區(qū)間一定發(fā)生在最高價和最低價之間。較準確的方法是通過較小的時間顆粒度累加成交量求出價格區(qū)間內的籌碼移入量,例如通過累加發(fā)生在某價格位置分鐘行情的成交量計算在該價格的籌碼移入量,該方法需要較多的低級別數據,計算量較大。
圖2 美的集團(000333)3日分鐘級別成交量-價格分布圖
簡易做法是利用最高價、最低價和成交平均價,構造一個三角形或由長方形加三角形構成的五邊形作為近似值,來替代真實籌碼移入情況。其中,成交平均價是市場成交價的統計計算值。主流的籌碼移入算法構建的是等腰三角形,即利用最高價和最低價的算數平均價計算,而事實上算數平均價與成交平均價相等的機會很小[15]。
圖2 是美的集團(000333)在2018 年5 月31 日、7月24 日、8 月17 日的分鐘行情數據累計的成交量-價格分布圖[16],橫坐標為成交價格,縱坐標為以0.1 元為計算單位累計的成交量,圖中細線為成交平均價??梢钥闯?,成交量-價格分布圖并非呈等腰三角形,圖中,成交平均價與成交量最大的價格區(qū)域有緊密的聯系,即成交量越大的價格區(qū)域越接近成交平均價,因此,使用成交平均價較算數平均價更接近真實行情。
從圖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比例執(zhí)行,iRate 為N+1 日的成交量,AvC_R 為長方形部分單位價格移入籌碼量,計算公式為:
AvC_T 為三角形部分單位價格平均移入籌碼量,計算公式為:
step_L 為三角形對應的最低價一側的上漲梯步,計算公式為:
step_H 為三角形對應的最高價一側的上漲梯步,計算公式為:算法偽代碼如下:
通過移出籌碼量和移入籌碼量,就可以算出N+1日的籌碼分布情況。引入行為金融學理論觀點,結合時間對投資者心理的影響,可以更準確地模擬真實籌碼移出過程。與傳統籌碼移出算法相比,通過靈活的時間切片和持有率控制,更能反映持倉價格變化,更接近真實交易情況。
從籌碼分布算法原理可知,籌碼數據應從股票上市首個交易日起開始計算。經筆者測試,若從任意交易日開始,計算約300 組交易日數據(影響數據組大小的主要因素是換手率,換手率越高需要的數據組數越少,換手率越低需要的數據組數越多)后的籌碼數據開始與從股票上市首個交易日開始計算的數據接近。
為了滿足應用[19-21],本文對算法進行了擴展:
(1)連續(xù)計算,即給定某只股票連續(xù)交易數據,計算其籌碼數據;
(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 元,遇阻力位后向下回調,阻力位一般發(fā)生在籌碼密集區(qū)域的邊緣[23]。對比交易軟件上的籌碼圖和本算法的籌碼圖發(fā)現,交易軟件的籌碼密集區(qū)域邊緣為4.50 元位置,而本算法的籌碼密集區(qū)域邊緣為4.70 元位置,與6 月15 日的成交最高價4.68 元更接近。
基于行為金融學的觀點,將交易行為特性引入籌碼移出算法,以五邊形算法和成交平均價代替最高價和最低價的平均值計算移入籌碼,使得計算模擬值更接近真實交易。經測試,基于行為金融學的股票籌碼移動算法計算的數據比傳統籌碼算法對支撐點位和阻力位的判斷更準確,原因一是在計算移出籌碼時引入了行為金融學觀點;二是在計算移入籌碼時使用更為接近的成交平均價及五邊形算法。
進一步研究將依據個股股性動態(tài)調整時間切片方向開展,提供籌碼算法的準確性,并嘗試開發(fā)有效性測試平臺。