1. 程式人生 > >用Python的Pandas和Matplotlib繪製股票唐奇安通道,布林帶通道和鱷魚組線

用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