? ? ?在用python的matplotlib和numpy庫繪制股票K線均線的整合效果(含從網絡接口爬取數據和驗證交易策略代碼)一文里,我講述了通過爬蟲接口得到股票數據并繪制出K線均線圖形的方式,在本文里,將在此基礎上再引入成交量效果圖,并結合量價理論,給出并驗證一些交易策略。
1?成交量對量化分析的意義
? ? 美國的股市分析家葛蘭碧(Joe Granville)在他所著的《股票市場指標》一書里提出著名的“量價理論”。“量價理論”的核心思想是,任何對股價的分析,如果離開了對成交量的分析,都將是無本之木,無水之源,因為成交量的增加或萎縮都表現出一定的股價趨勢。
? ? 成交量是指時間單位內已經成交的股數或總手數。成交量能反應出股市交易中的供求關系,其中道理是比較淺顯易懂的,當股票供不應求時,大家爭相購買,成交量就很大了,反之當供過于求時,則說明市場交易冷淡,成交量必然萎縮。
? ? 廣義的成交量包括成交股數(Volumn或Vol)、成交金額(AMOUNT,時間單位內已經成交的總金額數)和換手率(TUN,股票每天成交量除以股票的流通總股本所得的比率),而狹義則是指成交股數。我們用yahoo接口得到的數據里,有表示成交股數的Volumn列,其中的單位是“手”,一手為100股,在本部分里,我們是通過Volumn列數據繪制股票的成交量信息。
2?引入成交量
? ? 在K線和均線整合成交量的效果圖里,出于美觀的考慮,我們對整合的效果提出了如下三點要求。
? ? 第一,繪制上下兩個子圖,上圖放K線和均線,下圖放成交量效果。
? ? 第二,上下兩個子圖共享x軸,也就是說,兩者x軸的刻度標簽和間隔應該是一樣的。
? ? 第三,通過柱狀圖來繪制成交量圖,如果當天股票上漲,成交量圖是紅色,下跌則是綠色。? ?
? ? 在如下的drawKMAAndVol.py案例,我們將實現增加成交量圖的效果。
1 # !/usr/bin/env python 2 # coding=utf-8 3 import pandas as pd 4 import matplotlib.pyplot as plt 5 from mpl import candlestick_ochl 6 from matplotlib import MultipleLocator 7 # 根據指定代碼和時間范圍,獲取股票數據 8 df = pd.read_csv( ' D:/stockData/ch7/600895.csv ' ,encoding= ' gbk ' ) 9 # 設置大小,共享x坐標軸 10 figure,(axPrice, axVol) = plt.subplots(2, sharex=True, figsize=(15,8 )) 11 # 調用方法,繪制K線圖 12 candlestick_ochl(ax = axPrice, opens=df[ " Open " ].values, closes=df[ " Close " ].values, highs=df[ " High " ].values, lows=df[ " Low " ].values, 13 width=0.75, colorup= ' red ' , colordown= ' green ' ) 14 axPrice.set_title( " 600895張江高科K線圖和均線圖 " ) # 設置子圖標題 15 df[ ' Close ' ].rolling(window=3).plot(ax=axPrice,color= " red " ,label= ' 3天均線 ' ) 16 df[ ' Close ' ].rolling(window=5).plot(ax=axPrice,color= " blue " ,label= ' 5天均線 ' ) 17 df[ ' Close ' ].rolling(window=10).plot(ax=axPrice,color= " green " ,label= ' 10天均線 ' ) 18 axPrice.legend(loc= ' best ' ) # 繪制圖例 19 axPrice.set_ylabel( " 價格(單位:元) " ) 20 axPrice.grid(True) # 帶網格線 21 # 如下繪制成交量子圖 22 # 直方圖表示成交量,用for循環處理不同的顏色 23 for index, row in df.iterrows(): 24 if (row[ ' Close ' ] >= row[ ' Open ' ]): 25 axVol.bar(row[ ' Date ' ],row[ ' Volume ' ]/1000000,width = 0.5,color= ' red ' ) 26 else : 27 axVol.bar(row[ ' Date ' ],row[ ' Volume ' ]/1000000,width = 0.5,color= ' green ' ) 28 axVol.set_ylabel( " 成交量(單位:億手) " ) # 設置y軸標題 29 axVol.set_title( " 600895張江高科成交量 " ) # 設置子圖的標題 30 axVol.set_ylim(0,df[ ' Volume ' ].max()/100000000*1.2) # 設置y軸范圍 31 xmajorLocator = MultipleLocator(5) # 將x軸主刻度設置為5的倍數 32 axVol.xaxis.set_major_locator(xmajorLocator) 33 axVol.grid(True) # 帶網格線 34 # 旋轉x軸的展示文字角度 35 for xtick in axVol.get_xticklabels(): 36 xtick.set_rotation(15 ) 37 plt.rcParams[ ' font.sans-serif ' ]=[ ' SimHei ' ] 38 plt.show()
? ? 從第8行到第20行,我們一方面是從csv文件里讀取數據,另一方面在第一個子圖里繪制了K線和均線圖。這部分的代碼和之前很相似,不過請大家注意兩個點。
? ? 第一,在第10行里,不僅設置了繪圖區域的大小,更通過sharex=True語句,設置了axPrice和axVol這兩個子圖共享x軸。
? ? 第二,第二,在第14、18、19和第20行,由于是在K線圖和均線圖的axPrice子圖里操作,所以若干方法的調用主體是axPrice對象,而不是之前的pyplot.plt對象。
? ? 從第23行到第36行里,我們在axVol子圖里繪制了成交量圖的效果。請大家注意第23行到第27行的for循環,在其中,我們通過第24行的if語句,比較收盤價和開盤價,以判斷當天股票是漲是跌,在此基礎上,通過第25行或第27行的bar方法,設置當日成交量圖的填充顏色。從上述代碼能看出,成交量是在自于csv文件里的Volume列。
? ? 在繪制成交量圖的時候有兩個細節請大家注意一下。
? ? 第一,在第25行、第27行和第30行里,當我們設置y軸的刻度值和范圍時,我們除以了一個相同的數,這是因為在第28行我們設置y軸文字時,指定了y軸成交量的單位是“億手“。
? ? 第二, 本次是通過第35行和第36行的for循環,設置了“x軸文字旋轉”的效果,從代碼里我們能看到,本案例中的旋轉角度是15度。
? ? 上述代碼的運行效果如下圖所示,從中大家能看兩個x軸刻度一致的子圖,且在成交量子圖里,上漲日和下跌日的成交量填充色分別是紅色和綠色。
3 成交量與股價的關系
? ??成交量和股價間也存在著八大規律,通過下圖,我們能感受到這些規律,其中縱坐標表示價(即股價),橫坐標表示量(即成交量)。
? ? 我們能看出量價之間的八種關系,即量增價平、量增價升、量平價升、量縮價升、量減價平、量縮價跌、量平價跌、量跌價升,隨著上述周期過程,股價也完成了一個從漲到跌的完整循環,下面我們來具體解釋一下。
? ? 1.量增價平:股價經過持續下跌進入到低位狀態,出現了成交量增加但股價平穩的現象,此時不同天的成交量高度落差可能比較明顯,這說明該股在底部積聚上漲動力。
? ? 2.量增價升:成交量在低價位區持續上升,同時伴隨著股價上漲趨勢,這說明股價上升得到了成交量的支撐,后市將繼續看好,這是中短線的買入信號。
? ? 3.量平價升:在股價持續上漲的過程中,如果多日的成交量保持等量水平,建議在這一階段中可以適當增加倉位。
? ? 4.量縮價升:成交量開始減少,但股價依然在上升,此時應該視情況繼續持股。但如果還沒有買入的投資者就不宜再重倉介入,因為股價已經有了一定的漲幅,價位開始接近上限。
? ? 5.量減價平:股價經長期大幅度上漲后,成交量顯著減少,股價也開始橫向調整不再上升,這是高位預警的信號。這個階段里一旦有風吹草動,比如突然拉出大陽線和大陰線,建議應出貨離場,做到落袋為安。
? ?6.量縮價跌:成交量在高位繼續減少,股價也開始進入下降通道,這是明確的賣出信號。如果還出現縮量陰跌,這說明股價底部尚遠,不會輕易止跌。
? ? 7.量平價跌:成交量停止減少,但股價卻出現急速下滑現象,這說明市場并沒有形成一致看空的共識。股諺有“多頭不死,跌勢不止“的說法,出現“量平價跌”的情況,說明主力開始逐漸退出市場,這個階段里,應繼續觀望或者出貨,別輕易去買入以所謂的“搶反彈”。
? ? 8. 量增價跌:股價經長期大幅下跌之后,有可能出現成交量增加的情況,此時的操作原則是建議賣出,或者空倉觀望。如果低價區成交量有增加,則說明有資金在此價位區間接盤,預示后期有望形成底部并出現反彈。但如果出現量增價跌,則建議應清倉出局。
? ? 在下文里,我們將通過Python語言驗證量價理論中的兩個規則。
4 驗證“量增價平“的買點
? ??在如下的calBuyPointByVol.py案例中,我們將驗證“量增價平“的買點。在這段代碼里我們做了三件事,第一是通過yahoo接口得到了指定股票指定范圍內的交易數據,第二通過pandas接口保存得到的數據,以便日后驗證,第三通過遍歷dataframe對象,計算量和價的關系,從而獲得買點日期。? ??
1 # !/usr/bin/env python 2 # coding=utf-8 3 import pandas_datareader 4 import pandas as pd 5 import numpy as np 6 # 漲幅是否大于指定比率 7 def isMoreThanPer(lessVal,highVal,per): 8 if np.abs(highVal-lessVal)/lessVal>per/100 : 9 return True 10 else : 11 return False 12 # 漲幅是否小于指定比率 13 def isLessThanPer(lessVal,highVal,per): 14 if np.abs(highVal-lessVal)/lessVal: 15 return True 16 else : 17 return False 18 code= ' 600895.ss ' 19 stock = pandas_datareader.get_data_yahoo(code, ' 2018-09-01 ' , ' 2018-12-31 ' ) 20 # 刪除最后一行,因為get_data_yahoo會多取一天數據 21 stock.drop(stock.index[len(stock)-1],inplace= True) 22 # 保存在本地 23 stock.to_csv( ' D:\\stockData\ch7\\60089520181231.csv ' ) 24 # 從文件里得到數據 25 df = pd.read_csv( ' D:/stockData/ch7/60089520181231.csv ' ,encoding= ' gbk ' ) 26 cnt= 0 27 while cnt<=len(df)-1 : 28 try : 29 # 規則1,連續三天收盤價變動不超過3% 30 if isLessThanPer(df.iloc[cnt][ ' Close ' ],df.iloc[cnt+1][ ' Close ' ],3) and isLessThanPer(df.iloc[cnt][ ' close ' ],df.iloc[cnt+2][ ' Close ' ],3 ) : 31 # 規則2,連續三天成交量漲幅超過75% 32 if isMoreThanPer(df.iloc[cnt][ ' Volume ' ],df.iloc[cnt+1][ ' volume ' ],75) and isMoreThanPer(df.iloc[cnt][ ' Volume ' ],df.iloc[cnt+2][ ' Volume ' ],75 ) : 33 print ( " Buy Point on: " + df.iloc[cnt][ ' Date ' ]) 34 except : 35 pass 36 cnt=cnt+1
? ??在第7行定義的isMoreThanPer方法里,我們比較了高價和低價,以判斷是否超過由參數per指定的漲幅。在第13行的isLessThanPer方法里,我們判斷了跌幅是否超過per指定的范圍。由于這兩個功能經常會用到,所以我們把它們封裝成函數。
? ? 從第18行到第25行,我們完成了獲取并保存數據的動作,并用df對象保存了待遍歷的股票數據(即張江高科2018-09-01到2018-12-31的數據)。
? ? 在第27行到第36行按日期遍歷股票數據時,我們制定了如下規則,連續三天股票的收盤價變動范圍不超過5%(即價平)且3天成交量的漲幅過75%(即量增),把滿足條件的日期打印出來。 運行后,我們能看到11月2日這個買點。
? ? 在之前代碼基礎上改寫下,把時間范圍改成2018-09-01到2018-12-31,再運行下,能看到如下圖所示的效果。? ??
? ? 從中我們能看到驗證后的結果:在11月2日之后,股票的漲幅比較明顯,確實是個合適的買點,從中我們能看出 “量增價平”的指導意義。
5 驗證“量減價平“的賣點
? ??在如下calSellPointByVol.py案例中,我們同樣是分析張江高科2018-09-01到2018-12-31的交易數據,本次我們制定的策略是,第一,還是連續三天股票的收盤價變動范圍不超過5%(即價平),第二,較第一日相比,第二日和第三日的成交量下降幅度超過75%(即量減)。? ??
1 # !/usr/bin/env python 2 # coding=utf-8 3 import pandas_datareader 4 import pandas as pd 5 import numpy as np 6 # 漲幅是否大于指定比率 7 def isMoreThanPer(lessVal,highVal,per): 8 if np.abs(highVal-lessVal)/lessVal>per/100 : 9 return True 10 else : 11 return False 12 # 漲幅是否小于指定比率 13 def isLessThanPer(lessVal,highVal,per): 14 if np.abs(highVal-lessVal)/lessVal: 15 return True 16 else : 17 return False 18 # 本次直接從文件里得到數據 19 df = pd.read_csv( ' D:/stockData/ch7/60089520181231.csv ' ,encoding= ' gbk ' ) 20 cnt= 0 21 while cnt<=len(df)-1 : 22 try : 23 # 規則1,連續三天收盤價變動不超過3% 24 if isLessThanPer(df.iloc[cnt][ ' Close ' ],df.iloc[cnt+1][ ' Close ' ],3) and isLessThanPer(df.iloc[cnt][ ' Close ' ],df.iloc[cnt+2][ ' close ' ],3 ) : 25 # 規則2,連續三天成交量跌幅超過75% 26 if isMoreThanPer(df.iloc[cnt+1][ ' Volume ' ],df.iloc[cnt][ ' Volume ' ],75) and isMoreThanPer(df.iloc[cnt+2][ ' Volume ' ],df.loc[cnt][ ' Volume ' ],75 ) : 27 print ( " Sell Point on: " + df.iloc[cnt][ ' Date ' ]) 28 except : 29 pass 30 cnt=cnt+1
? ? 上述代碼和之前calBuyPointByVol.py案例很相似,只不過我們適當變更了第26行判斷“成交量”的if條件。上述代碼運行后,我們能得到的賣點是2018-12-05,從上圖里我們能看出,在這段時間之后的若干交易日里,張江高科的股價確實有下跌現象。
6 求推薦,后文預告與版權說明
? ? 在本系列的后面文章中,將陸續通過python繪制成交量、KDJ、MACD、RSI,BIAS和OBV等指標,而且還會用Python編寫針對這些指標的交易策略,敬請關注。
? ? 本文用了我將近2個小時,如果大家感覺好,請幫忙推薦下。
? ??關于轉載有如下的說明。
? ? 1 本文文字和代碼均屬原創,可轉載,但謝絕用于商業用戶。
? ? 2 轉載時請用 鏈接 的方式,給出原文出處,同時寫明原作者是hsm_computer。
? ? 3 在轉載時,請原文轉載 ,如要 在轉載修改本文,請事先告知,謝絕在轉載時通過修改本文達到有利于轉載者的目的。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
