根據指定股票通道指標的算法,能用過去一定時間段的交易數據繪制出上下兩條通道線,即價格通道里的上下軌道。一般來說,當股價向上突破上軌時,即預測后市將漲,反之當股價向下突破下軌時,即預測后市將跌。
這里將根據若干算法,計算并繪制多種價格通道,從中大家一方面可以積累股市分析的經驗,另一方面還能進一步掌握基于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開發工程師,整理了一套最新的python系統學習教程,想要這些資料的可以關注私信小編“01”即可(免費分享哦)希望能對你有所幫助。