程式員不能光埋頭幹活掙死工資,也應該探索其他掙錢管道。本人将開辟“給程式員加财商”系列,用Python繪制各種股票名額,在講述各股票名額的含義以及計算方式的同時,驗證基于各種名額的交易政策,本文是第一篇,通過Numpy,Maplotlib等庫繪制K線和均線,并講述這些名額對交易的指導意義,最後用案例來驗證買賣的交易政策。
股市有風險,入市須謹慎,本人也不建議大家貿然投入股市,靠拍腦袋買賣股票,這是送錢。通過本系列的講述以及案例,大家至少能從技術面角度知道分析股票乃至預測股票的一些方式,至少不會盲人摸象,而且還能通過一些技術名額了解股市的深淺,這樣在買賣股票時能有所謹。更何況通過本系列的案例,大家還能了解目前熱門語言Python的相關用法,所謂一舉多得。
1 K線整合均線的案例
均線也叫移動平均線(Moving Average,簡稱MA),是指某段時間内的平均股價(或指數)連成的曲線,通過它我們能清晰地看到股價的曆史波動,進而能進一步預測未來價格的發展趨勢。
均線一般分短期、中期和長期這三類。
1 通常把5天和10天移動平均線稱為短期均線,一般供短線投資者參照。
2一般把20天、30天和60天移動平均線作為中期均線,一般供中線投資者參考。
3 一般120天和250天(甚至更長)移動平均線稱為長期均線,一般供長線投資者參考。
不過在實踐中,我們一般需要綜合地觀察短期中期和長期均線,從中能分析出市場的多空趨勢。比如,如果某股價格的三類均線均上漲,且短期中期長期均線是從上到下排列,則說明該股價格趨勢向上;反之如果并列下跌,且長期中期短期均線從上到下排列,則說明股價趨勢向下。
講完概念了,我們通過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根均線。

2 K線整合均線的改進版案例
在本例中,我們将做如下兩點改進。
第一,為了更靈活地得到股市資料,這裡是根據開始時間和結束時間,先是調用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案例,均線的效果更為明顯,尤其是三日均線,更是幾乎貫穿于整個交易日範圍。
3 葛蘭碧均線八大買賣法則
在均線實踐理論中,投資專家葛蘭碧創造的八項買賣法則可謂經典,具體的細節如下圖所示。
1 移動平均線從下降逐漸轉為平水準,且有超上方擡頭迹象,而股價從均線下方突破時,為買進信号,如上圖中的A點。
2 股價于移動平均線之上運作時下跌,但未跌破均線,此時股價再次上揚,此時為買入信号,如圖中的C點。
3 股價位于均線上運作,下跌時破均線,但均線呈上升趨勢,不久股價回到均線之上時,為買進信号,如圖中的B點。
4 股價在均線下方運作時大跌,遠離均線時向均線靠近,此時為買進時機,如圖中的D點。
5 均線的上升趨勢逐漸變平,且有向下迹象,而股價從均線上方向下穿均線,為賣出信号,如圖中的E點。
6 股價向上穿過均線,不過均線依然保持下跌趨勢,此後股價又下跌回均線下方,為賣出信号,如圖中的F點。
7 股價運作在均線下方,出現上漲,但未過均線就再次下跌,此為賣出點,如圖中的G點。
8 股價在均線的上方運作,連續上漲且繼續遠離均線,這種趨勢說明随時會出現獲利回吐的賣盤打壓,此時是賣出的時機,如前圖中的H點。
在上文提到的八大法則中,前四點是買進時機,如果從技術面來分析,第一法則描述了構築底部的形态,是初次買入信号;第二法則描述了股價在上升之後的回調場景,一定程度上暗示“大漲後的小幅調整“,可以加倉買進。第三法則描述了股價建構底部後的探底現象,也是買進的機會。第四法則描述了股價下跌後的反彈場景,有經驗的操盤手一般會做短線,以快進快出政策為主。
相反,後四點則是賣出時機,如果還是從技術面來分析:第五法則描述了股價構築頭部的形态,如果沒其它利好因素,此時應堅決的賣出;第六法則描述了股價下跌後回調的場景,也應堅決賣出;第七法則描述了股價下跌時的反彈場景,雖有上調,但也應賣出;第八法則描述了股價上升時過大偏離均線的場景,此時可考慮短線賣出。
4 通過DataFrame驗證均線的買點政策
根據上述八大買賣原則,我們在張江高科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_3、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 通過DataFrame驗證均線的賣點政策
同樣地,根據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線圖裡得到驗證。
6 求推薦,後文預告與版權說明
在本系列的後面文章中,将陸續通過python繪制成交量、KDJ、MACD、RSI和OBV等名額,而且還會用Python編寫針對這些名額的交易政策,敬請關注。
本文用了我将近3個小時,如果大家感覺好,請幫忙推薦下。
關于轉載有如下的說明。
1 本文文字和代碼均屬原創,可轉載,但謝絕用于商業使用者。
2 轉載時請用連結的方式,給出原文出處,同時寫明原作者是hsm_computer。
3 在轉載時,請原文轉載 ,如要在轉載修改本文,請事先告知,謝絕在轉載時通過修改本文達到有利于轉載者的目的。