本人最近在嘗試着發表「以股票案例入門Python編程語言」系列的文章,在這些文章裏,將用Python工具繪製各類股票指標,在講述各股票指標的含義以及計算方式的同時,驗證基於各類指標的交易策略,本文是第一篇,經過K線和均線案例講述Numpy,Maplotlib等相關庫的用法,而且還用代碼案例來驗證買賣的交易策略。在本系列的後面文章中,將陸續經過python繪製成交量、KDJ、MACD、RSI和OBV等指標,並且還會用Python編寫針對這些指標的交易策略,敬請關注。python
均線也叫移動平均線(Moving Average,簡稱MA),是指某段時間內的平均股價(或指數)連成的曲線,經過它咱們能清晰地看到股價的歷史波動,從而能進一步預測將來價格的發展趨勢。編程
均線通常分短時間、中期和長期這三類。編程語言
1 一般把5天和10天移動平均線稱爲短時間均線,通常供短線投資者參照。工具
2通常把20天、30天和60天移動平均線做爲中期均線,通常供中線投資者參考。code
3 通常120天和250天(甚至更長)移動平均線稱爲長期均線,通常供長線投資者參考。對象
不過在實踐中,咱們通常須要綜合地觀察短時間中期和長期均線,從中能分析出市場的多空趨勢。好比,若是某股價格的三類均線均上漲,且短時間中期長期均線是從上到下排列,則說明該股價格趨勢向上;反之若是並列下跌,且長期中期短時間均線從上到下排列,則說明股價趨勢向下。blog
講完概念了,咱們經過rolling方法繪製均線。 索引
1 #!/usr/bin/env python 2 #coding=utf-8 3 import pandas as pd 4 import matplotlib.pyplot as plt 5 from mpl_finance import candlestick_ochl 6 #從文件裏獲得數據 7 df = pd.read_csv('D:/stockData/ch6/600895.csv',encoding='gbk') 8 #設置圖的位置 9 fig = plt.figure() 10 ax = fig.subplot(111) 11 #調用方法,繪製K線圖 12 candlestick_ochl(opens=df["Open"].values, closes=df["Close"].values, highs=df["High"].values, lows=df["Low"].values,width=0.75, colorup='red', colordown='green') 13 df['Close'].rolling(window=3).mean().plot(color="red",label='3天均線') 14 df['Close'].rolling(window=5).mean().plot(color="blue",label='5天均線') 15 df['Close'].rolling(window=10).mean().plot(color="green",label='10天均線') 16 plt.legend(loc='best') #繪製圖例 17 #設置x軸的標籤 18 plt.xticks(range(len(df.index.values)),df.index.values,rotation=30 ) 19 ax.grid(True) #帶網格線 20 plt.title("600895張江高科的K線圖") 21 plt.show()
從第13行到第15行裏,經過rolling方法,根據天天的收盤價,計算了3天、5天和10天均線,併爲每種均線設置了圖例,在第16行裏,經過legend方法設置了圖例的位置。上述代碼的運行效果以下圖所示,從中咱們不只能看到這段時間內的K線圖,還能看到3根均線。 接口
在本例中,咱們將作以下兩點改進,其中請你們着重觀察操做座標軸的ax對象。 ip
第一,爲了更靈活地獲得股市數據,這裏是根據開始時間和結束時間,先是調用get_data_yahoo接口,從yahoo的接口裏獲取股票數據,同時爲了留一份數據,因此會把從接口爬取到的數據保存到本地csv文件,作完以後再繪製圖形。
第二,在以前的案例中,x軸的刻度是每一個交易日的日期,但若是顯示的時間範圍過長,那麼時間刻度就會太密集,影響美觀效果,因此這裏將只顯示主刻度。改進後的代碼以下所示。
1 #!/usr/bin/env python 2 #coding=utf-8 3 import pandas_datareader 4 import pandas as pd 5 import matplotlib.pyplot as plt 6 from mpl_finance import candlestick2_ochl 7 from matplotlib.ticker import MultipleLocator 8 #根據指定代碼和時間範圍,獲取股票數據 9 code='600895.ss' 10 stock = pandas_datareader.get_data_yahoo(code,'2019-01-01','2019-03-31') 11 #刪除最後一行,由於get_data_yahoo會多取一天數據 12 stock.drop(stock.index[len(stock)-1],inplace=True) 13 #保存在本地 14 stock.to_csv('D:\\stockData\ch7\\600895.csv') 15 df = pd.read_csv('D:/stockData/ch7/600895.csv',encoding='gbk',index_col=0) 16 #設置窗口大小 17 fig, ax = plt.subplots(figsize=(10, 8)) 18 xmajorLocator = MultipleLocator(5) #將x軸主刻度設置爲5的倍數 19 ax.xaxis.set_major_locator(xmajorLocator) 20 #調用方法,繪製K線圖 21 candlestick2_ochl(ax = ax, 22 opens=df["Open"].values,closes=df["Close"].values, highs=df["High"].values, lows=df["Low"].values,width=0.75, colorup='red', colordown='green') 23 #以下是繪製3種均線 24 df['Close'].rolling(window=3).mean().plot(color="red",label='3天均線') 25 df['Close'].rolling(window=5).mean().plot(color="blue",label='5天均線') 26 df['Close'].rolling(window=10).mean().plot(color="green",label='10天均線') 27 plt.legend(loc='best') #繪製圖例 28 ax.grid(True) #帶網格線 29 plt.title("600895張江高科的K線圖") 30 plt.rcParams['font.sans-serif']=['SimHei'] 31 plt.setp(plt.gca().get_xticklabels(), rotation=30) 32 plt.show()
相比以前代碼,這段代碼有四個改進點。
第一,從第9行到第14行裏,咱們經過第五章分析過的get_data_yahoo方法,傳入股票代碼、開始和結束時間這三個參數,從yahoo接口裏得到股票交易的數據。
請注意該方法返回的數據會比傳入的結束時間多一天,好比咱們傳入的結束時間是2019-03-31,但它會返回後一天(即2019-04-01)的數據,因此得經過第12行的drop方法,刪除stock對象(該對象類型是dataframe)最後一行的數據。刪除的時候是經過stock.index[len(stock)-1]指定刪除長度減1的索引值,由於索引值是從0開始,並且須要指定inplace=True,不然的話,刪除的結果沒法更新到stock這個dataframe裏。
第二,在第17行裏,經過figsize方法設置了窗口的大小尺寸。
第三,經過第18行和第19行的代碼,設置了主刻度是5的倍數。之因此設置成5的倍數,是由於通常一週的交易日是5天。但這裏不能簡單地把主刻度設置成每週一,由於某些週一有多是股市休市的法定假日。
第四,因爲無需在x軸上設置天天的日期,因此這裏無需再調用plt.xticks方法,可是得調用如第31行所示的代碼,設置x軸刻度的旋轉角度,不然x軸展現的時間依然有可能會重疊。
這段代碼的運行效果以下圖所示,從中你們能看到改進後的效果,並且,因爲本次展現的股票時間段變長了(是3個月),因此相比drawKAndMA.py案例,均線的效果更爲明顯,尤爲是三日均線,更是幾乎貫穿於整個交易日範圍。
在均線實踐理論中,投資專家葛蘭碧創造的八項買賣法則可謂經典,具體的細節以下圖所示。
1 移動平均線從降低逐漸轉爲平水平,且有超上方擡頭跡象,而股價從均線下方突破時,爲買進信號,如上圖中的A點。
2 股價於移動平均線之上運行時下跌,但未跌破均線,此時股價再次上揚,此時爲買入信號,如圖中的C點。
3 股價位於均線上運行,下跌時破均線,但均線呈上升趨勢,不久股價回到均線之上時,爲買進信號,如圖中的B點。
4 股價在均線下方運行時大跌,遠離均線時向均線靠近,此時爲買進時機,如圖中的D點。
5 均線的上升趨勢逐漸變平,且有向下跡象,而股價從均線上方向下穿均線,爲賣出信號,如圖中的E點。
6 股價向上穿過均線,不過均線依然保持下跌趨勢,此後股價又下跌回均線下方,爲賣出信號,如圖中的F點。
7 股價運行在均線下方,出現上漲,但未過均線就再次下跌,此爲賣出點,如圖中的G點。
8 股價在均線的上方運行,連續上漲且繼續遠離均線,這種趨勢說明隨時會出現獲利回吐的賣盤打壓,此時是賣出的時機,如前圖中的H點。
根據上述八大買賣原則,咱們在張江高科2019年1月到3月的交易數據內,用pandas庫裏的dataframe等對象,根據5日均線計算參考買點,代碼以下所示。
1 #!/usr/bin/env python 2 #coding=utf-8 3 import pandas as pd 4 #從文件裏獲得數據 5 df = pd.read_csv('D:/stockData/ch7/600895.csv',encoding='gbk') 6 maIntervalList = [3,5,10] 7 #雖然在後文裏只用到了5日均線,但這裏演示設置3種均線 8 for maInterval in maIntervalList: 9 df['MA_' + str(maInterval)] = df['Close'].rolling(window=maInterval).mean() 10 cnt=0 11 while cnt<=len(df)-1: 12 try: 13 #規則1,收盤價連續三天上揚 14 if df.iloc[cnt]['Close']<df.iloc[cnt+1]['Close'] and df.iloc[cnt+1]['Close']<df.iloc[cnt+2]['Close']: 15 #規則2,5日均線連續三天上揚 16 if df.iloc[cnt]['MA_5']<df.iloc[cnt+1]['MA_5'] and df.iloc[cnt+1]['MA_5']<df.iloc[cnt+2]['MA_5']: 17 #規則3,第3天,收盤價上穿5日均線 18 if df.iloc[cnt+1]['MA_5']>df.iloc[cnt]['Close'] and df.iloc[cnt+2]['MA_5']<df.iloc[cnt+1]['Close']: 19 print("Buy Point on:" + df.iloc[cnt]['Date']) 20 except: #有幾天是沒5日均線的,因此用except處理異常 21 pass: 22 cnt=cnt+1
雖然在計算參考買點時,只用到了5日均價,但在第8行和第9行的for循環裏,咱們經過rolling方法,仍是計算了3日、5日和10日的均價,並把計算後的結果記錄到當前行的MA_三、MA_5和MA_10這三列中,這樣作的目的是爲了演示動態建立列的作法。
在第11行到第22行的while循環裏,咱們依次遍歷了天天的交易數據,並在第14行,第16行和第18行裏,經過三個if語句,設置了3個規則。因爲在前幾天是沒有5日均價了,且在遍歷最後2天交易數據時,在執行諸如df.iloc[cnt+2]['Close']的語句中會出現索引越界,因此在while循環裏咱們用到了try…except異常處理語句。
運行上述代碼,咱們能看到的結果是:Buy Point on:2019-03-08,結合上圖,咱們能看到3月8日以後的交易日裏,股價有必定程度的上漲,因此能證明基於均線的「買」原則,但影響股價的因素太多,你們應全面分析,切勿在實戰中只用這原則來買賣股票。
一樣地,根據5日均線計算參考買點,在以下案例中,咱們計算了張江高科2019年1月到3月內的賣點。
1 #!/usr/bin/env python 2 #coding=utf-8 3 import pandas as pd 4 #從文件裏獲得數據 5 df = pd.read_csv('D:/stockData/ch7/600895.csv',encoding='gbk') 6 maIntervalList = [3,5,10] 7 #雖然在後文裏只用到了5日均線,但這裏演示設置3種均線 8 for maInterval in maIntervalList: 9 df['MA_' + str(maInterval)] = df['Close'].rolling(window=maInterval).mean() 10 cnt=0 11 while cnt<=len(df)-1: 12 try: 13 #規則1,收盤價連續三天下跌 14 if df.iloc[cnt]['Close']>df.iloc[cnt+1]['Close'] and df.iloc[cnt+1]['Close']>df.iloc[cnt+2]['Close']: 15 #規則2,5日均線連續三天下跌 16 if df.iloc[cnt]['MA_5']>df.iloc[cnt+1]['MA_5'] and df.iloc[cnt+1]['MA_5']>df.iloc[cnt+2]['MA_5']: 17 #規則3,第3天,收盤價下穿5日均線 18 if df.iloc[cnt+1]['MA_5']<df.iloc[cnt]['Close'] and df.iloc[cnt+2]['MA_5']>df.iloc[cnt+1]['Close']: 19 print("Sell Point on:" + df.iloc[cnt]['Date']) 20 except: #有幾天是沒5日均線的,因此用except處理異常 21 pass 22 cnt=cnt+1
運行後,咱們能獲得兩個賣點:2019-01-23和2019-01-23,這一樣能在上圖描述的K線圖裏獲得驗證。
在本系列的後面文章中,將陸續經過python繪製成交量、KDJ、MACD、RSI和OBV等指標,並且還會用Python編寫針對這些指標的交易策略,敬請關注。
本文用了我將近3個小時,若是你們感受好,請幫忙推薦下。
關於轉載有以下的說明。
1 本文文字和代碼均屬原創,可轉載,但謝絕用於商業用戶。
2 轉載時請用連接的方式,給出原文出處,同時寫明原做者是hsm_computer。
3 在轉載時,請原文轉載 ,如要在轉載修改本文,請事先告知,謝絕在轉載時經過修改本文達到有利於轉載者的目的。