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

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