用Python的Pandas和Matplotlib繪製股票唐奇安通道,布林帶通道和鱷魚組線
我最近出了一本書,《基於股票大資料分析的Python入門實戰 視訊教學版》,京東連結:https://item.jd.com/69241653952.html,在其中給出了MACD,KDJ等指標圖的繪製方法。此外,還可以用價格通道來分析。根據指定股票通道指標的演算法,能用過去一定時間段的交易資料繪製出上下兩條通道線,即價格通道里的上下軌道。一般來說,當股價向上突破上軌時,即預測後市將漲,反之當股價向下突破下軌時,即預測後市將跌。
這裡將根據若干演算法,計算並繪製多種價格通道,從中大家一方面可以積累股市分析的經驗,另一方面還能進一步掌握基於pandas的資料分析方法,以及基於matplotlib的視覺化技巧。
1 計算並繪製唐奇安通道
唐奇安通道是由上阻力線、下支撐線和中心線這三條線組成。
上阻力線 = 過去N天的最高價
下支撐線 = 過去N天的最低價
中心線 =(上線 + 下線)除以 2
在實際的分析場景裡,N的取值一般是20,在如下的DisplayDonChannel.py範例中,就用20天為週期,來計算並繪製唐奇安通道。
01 # coding=utf-8 02 import pandas as pd 03 import matplotlib.pyplot as plt 04 from mpl_finance import candlestick2_ochl 05 # 讀資料 06 stockDf = pd.read_csv('D:/work/data/ch11/600530.ss.csv') 07 fig, ax = plt.subplots() 08 candlestick2_ochl(ax = ax, opens=stockDf["Open"].values, closes=stockDf["Close"].values, highs=stockDf["High"].values, lows=stockDf["Low"].values, width=0.75, colorup='red', colordown='green') 09 stockDf['up'] = stockDf['High'].rolling(window=20).max() 10 stockDf['up'].plot(color="green",label='上阻力線') 11 stockDf['down'] = stockDf['Low'].rolling(window=20).min() 12 stockDf['down'].plot(color="navy",label='下支撐線') 13 stockDf['mid'] = (stockDf['up']+stockDf['down'])/2 14 stockDf['mid'].plot(color="red",label='中心線') 15 ax.set_ylabel("收盤價(元)") 16 ax.grid() # 帶網格線 17 ax.legend() # 繪製圖例 18 #設定x軸文字間隔和旋轉角度 19 index=stockDf.index[stockDf.index%7==0] 20 xtics=stockDf['Date'][stockDf.index%7==0] 21 plt.xticks(index,xtics) 22 plt.setp(plt.gca().get_xticklabels(), rotation=30) 23 plt.rcParams['font.sans-serif']=['SimHei'] 24 plt.title("600530交大昂立20天唐奇安通道效果圖") 25 plt.show()
在第5行到第8行的程式碼裡,從csv檔案裡讀到了股票交易資料,並通過呼叫candlestick2_ochl方法繪製了k線圖。在第9行裡,通過rolling(window=20)方法得到了過去20天的最高價集合,在此基礎上通過max()方法得到了過去20天的最高價,隨後用第10行的plot方法繪製了上阻力線。
隨後用同樣的方法,用第11行和第12行的程式碼計算並繪製了下支撐線。在第13行裡,設定了中心線為上阻力線和下支撐線的均值,並在第14行繪製了中心線。
由於在繪製上阻力線、下支撐線和中心線的時候都通過label引數設定了圖例,隨後在第17行用legend方法繪製了圖例效果。為了能更直觀地對比資料,所以在第16行裡用grid方法設定了網格效果。
這裡同樣是通過第19行到第22行的程式碼,設定了x軸文字的間隔以及旋轉角度,並在第24行裡用title方法設定了標題。為了能顯示中文標題,所以還需要加上第23行的語句。執行本範例,能看到如下圖所示的效果,由於計算週期是20日,所以之前19日看不到對應的價格通道。而且從圖上看,股價均在通道內運動,並沒有向上和向下突破的動作,也就是說,從這些天的交易資料裡,看不到基於20日唐奇安通道的買賣訊號。
2 計算並繪製布林帶通道
和上文描述的唐奇安通道類似,布林帶通道也是通過上阻力線、下支撐線和中心線來繪製價格通道,這裡的三條線演算法如下所示。
中心線 = N日移動均線
上阻力線 = 中心線+兩倍過去N天收盤價的標準差
下支撐線 = 中心線-兩倍過去N天收盤價的標準差
而N的取值一般也是20。在如下的DisplayBollingerBands.py範例中,將演示計算並繪製20日週期布林帶通道的做法。
01 # coding=utf-8 02 import pandas as pd 03 import matplotlib.pyplot as plt 04 from mpl_finance import candlestick2_ochl 05 # 讀資料 06 stockDf = pd.read_csv('D:/work/data/ch11/600530.ss.csv') 07 fig, ax = plt.subplots() 08 candlestick2_ochl(ax = ax, opens=stockDf["Open"].values, closes=stockDf["Close"].values, highs=stockDf["High"].values, lows=stockDf["Low"].values, width=0.75, colorup='red', colordown='green') 09 stockDf['mid'] = stockDf['Close'].rolling(window=20).mean() 10 stockDf['std'] = stockDf['Close'].rolling(window=20).std() 11 stockDf['up'] = stockDf['mid'] + 2*stockDf['std'] 12 stockDf['down'] = stockDf['mid'] - 2*stockDf['std'] 13 stockDf['up'].plot(color="green",label='上阻力線') 14 stockDf['down'].plot(color="navy",label='下支撐線') 15 stockDf['mid'].plot(color="red",label='中心線') 16 ax.set_ylabel("收盤價(元)") 17 ax.grid() # 帶網格線 18 ax.legend() # 繪製圖例 19 #設定x軸文字間隔和旋轉角度 20 index=stockDf.index[stockDf.index%7==0] 21 xtics=stockDf['Date'][stockDf.index%7==0] 22 plt.xticks(index,xtics) 23 plt.setp(plt.gca().get_xticklabels(), rotation=30) 24 plt.rcParams['font.sans-serif']=['SimHei'] 25 plt.title("600530交大昂立20天布林帶通道效果圖") 26 plt.show()
本範例和之前的唐奇安通道的範例很相似,區別主要集中在第9行到第15行。在第9行裡,先用rolloing和 mean方法計算過去20天的均值,以此作為中心線,再通過第10行的rolling和std方法,計算過去20天收盤價的標準差,在此基礎上再通過第11行和第12行的程式碼計算上阻力線和下支撐線。
完成計算後,是通過第13行到第15行的plot方法繪製三條線,同時用label引數設定了圖例。執行本範例,能看到如下圖所示的效果。其中布林帶通道的寬度是由過去20天收盤價的標準差決定,也就是說,如果過去20天收盤價波動比較大,那麼布林帶通道就比較寬,反之就比較狹窄。而且,雖然有個別價格向上或向下突破通道,但未形成“有效突破”,所以後期價格依然在通道內波動,由此大家能感受到“上阻力線”和“下支撐線”的“阻力”和“支撐”效果。
3 計算並繪製鱷魚組線
鱷魚組線其實不屬於價格通道指標,但也是通過三條線來研判股價的走勢,在鱷魚組線裡,三條線分別叫上脣、牙齒和下顎,具體演算法如下所述。
上脣線是5天週期的價格平滑移動平均線( SMMA ),向未來延後3天,也就是說第8天才會開始展示上脣線,上脣線一般用綠線繪製。
牙齒線是由8天週期的價格平滑移動平均線,向未來延後5天,一般用紅線繪製。
下顎線由13天週期的價格平滑移動平均線向未來延後8天,一般用藍色繪製。
這裡的平滑移動平均線SMMA也叫流暢移動平均線,這裡以5天週期為例,講下具體的演算法。
第1個SMMA值(即第5天的平滑平均值) = 前五天收盤價的均價
第6天的值 = (該週期內收盤價的和 –第1個SMMA值 + 第6天的收盤價)/5
第7天的值 = (該週期內收盤價的和 – 第2個SMMA值 + 第7天的收盤價)/5
依次類推,第n天的值 = (該週期內收盤價的和 –上個SMMA值 + 第n日收盤價)/5
這裡的演算法涉及到計算平滑移動平均線,在如下的DisplayCrocodileLines.py範例中,就將演示用pandas庫計算相關數值,並用matplotlib繪製鱷魚組線的做法。
01 # coding=utf-8 02 import pandas as pd 03 import matplotlib.pyplot as plt 04 from mpl_finance import candlestick2_ochl 05 #計算各種SMMA值 06 def setSMMAVal(df, period): 07 for i in range(len(df)): 08 if i<period: 09 df['SMMA' + str(period)] = df.ix[i,'MA'+ str(period)] 10 else: #按演算法計算SMMA值 11 df.ix[i,'SMMA'+ str(period)]=df.ix[i,'MA'+ str(period)] + (df.ix[i,'Close'] - df.ix[i-1,'SMMA'+ str(period)])/period 12 return df
在第6行的setSMMAVal方法裡,是根據引數period指定的週期,計算各種SMMA值。具體而言,在第7行的for迴圈裡,如果當前遍歷的索引號小於週期值,則設定SMMA值為當天的MA均值,否則的話,則通過第11行的程式碼,按SMMA的演算法,計算當天的值。
請注意這裡的列名是動態拼接的,比如在第9行,如果當前引數是5,那麼其實是用df['MA5'] 的值來填充df['SMMA' + str(period)]值。
13 #計算三條鱷魚組線 14 def setCrocodileVal(df): 15 # 用shift方法,把資料順延 16 df['up'] = df['SMMA5'].shift(3) 17 df['mid'] = df['SMMA8'].shift(5) 18 df['down'] = df['SMMA13'].shift(8) 19 return df
在得到SMMA的值以後,可以通過第14行的setCrocodileVal方法來計算3條鱷魚組線的值,這裡的技巧是shift方法,比如在第16行裡,是用df['SMMA5'].shift(3)程式碼,把當天的SMMA5值向後順延3天,以此設定上脣線的值。在第17行和第18行裡,也是用shift方法,順延對應的SMMA值,得到牙齒線和下顎線的值。
20 # 讀資料 21 stockDf = pd.read_csv('D:/work/data/ch11/600530.ss.csv') 22 #算均值 23 stockDf['MA5'] = stockDf['Close'].rolling(window=5).mean() 24 stockDf['MA8'] = stockDf['Close'].rolling(window=8).mean() 25 stockDf['MA13'] = stockDf['Close'].rolling(window=13).mean() 26 #算三個SMMA值 27 stockDf = setSMMAVal(stockDf, 5) 28 stockDf = setSMMAVal(stockDf, 8) 29 stockDf = setSMMAVal(stockDf, 13) 30 #計算三個鱷魚組線的值 31 stockDf = setCrocodileVal(stockDf)
通過第21行的程式碼得到csv裡股票資料後,先通過第23行到第25行的程式碼,計算5天、8天和13天的均價,並通過第27行到第29行的程式碼計算三個SMMA值,隨後再通過第31行的程式碼計算三個鱷魚組線的值,至此完成計算,在後文裡開始繪圖。
32 fig, ax = plt.subplots() 33 #為了突出三條組線,設定了透明度為0.5 34 candlestick2_ochl(ax = ax, opens=stockDf["Open"].values, closes=stockDf["Close"].values, highs=stockDf["High"].values, lows=stockDf["Low"].values, width=0.75, colorup='red',alpha=0.5, colordown='green') 35 #繪製三條組線 36 stockDf['up'].plot(color="green",label='上脣線') 37 stockDf['down'].plot(color="red",label='牙齒線') 38 stockDf['mid'].plot(color="blue",label='下顎線') 39 ax.set_ylabel("收盤價(元)") 40 ax.grid() # 帶網格線 41 ax.legend() # 繪製圖例 42 #設定x軸文字間隔和旋轉角度 43 index=stockDf.index[stockDf.index%7==0] 44 xtics=stockDf['Date'][stockDf.index%7==0] 45 plt.xticks(index,xtics) 46 plt.setp(plt.gca().get_xticklabels(), rotation=30) 47 plt.rcParams['font.sans-serif']=['SimHei'] 48 plt.title("600530交大昂立鱷魚組線效果圖") 49 plt.show()
在第36行到第38行的程式碼裡,是通過plot方法繪製了三條鱷魚組線,同時通過color引數分別設定了顏色,通過label引數設定了圖例。其他的視覺化程式碼之前都已經分析過,這裡就不再講述了。執行本範例,能看到如下圖所示的效果。
由於在繪製K線圖時通過alpha引數設定了透明度,所以這裡三條鱷魚組線更加明顯。
按照股市分析理論,如果上脣線在牙齒線之上,同時牙齒線在下顎線之上,說明當前進入股價上升階段。如果相反,上脣線在牙齒線之下,而牙齒線在下顎線之下,則說明股價進入下跌階段。如果上圖那樣三條線相互交錯纏繞,則通過該指標說明當前市場沒有發出明確的買賣交易訊號。不過本範例的主題是資料分析,所以請更關注計算三條線時用到的相關python方法。
本文可以轉載,轉載時請全文轉載,別有刪節,並用連結的形式給出原文連結。否則的話,可能會遇到出版社的維權。
文字相關連結:
用Python爬取股票資料,繪製K線和均線並用機器學習預測股價(來自我出的書) 用Python語言繪製股市OBV指標效果程式設計師如何高效學Python,如何高效用Python掙錢 用matplotlib和pandas繪製股票MACD指標圖,並驗證化交易策略
向大家介紹我的新書:《基於股票大資料分析的Python入門實戰》 通過機器學習的線性迴歸演算法預測股票走勢(用Python實現) 在我的新書裡,嘗試著用股票案例講述Python爬蟲大資料視覺化等知識
以股票RSI指標為例,學習Python傳送郵件功能(含RSI指標確定賣點策略) 以預測股票漲跌案例入門基於SVM的機器學習 用python的matplotlib和numpy庫繪製股票K線均線和成交量的整合效果(含量化驗證交易策略程式碼) 用python的matplotlib和numpy庫繪製股票K線均線的整合效果(含從網路介面爬取資料和驗證交易策略程式碼)
&n