用Python語言繪製股市OBV指標效果
我的新書《基於股票大資料分析的Python入門實戰》於近日上架,在這篇博文向大家介紹我的新書:《基於股票大資料分析的Python入門實戰》裡,介紹了這本書的內容。這裡將摘錄出部分內容,用以推廣本書,請大家多多支援。
《基於股票大資料分析的Python入門實戰 視訊教學版》,京東連結:https://item.jd.com/69241653952.html。在這篇博文裡,將摘錄部分內容。
1 OBV指標的原理以及演算法
形象地講,OBV指標是將成交量與股價的關係數字化,並根據股市的成交量變化情況來衡量股市的上漲或下跌支援力,以此來研判股價的走勢。OBV指標的設計是基於如下的原理。
第一,如果投資者對當前股價的看法越有分歧,那麼成交量就越大,反之成交量就越小,所以可以用成交量來衡量多空雙方的力量。
第二,股價在上升時,尤其是在上升初期,必須要較大的成交量相配合,相反股價在下跌時,無需耗費很大的動量,因此成交量未必放大,甚至下跌階段成交量會有萎縮趨勢。
第三,受關注的股票在一段時間內成交量和股價波動會很大,相反冷門股票成交量和價格波動會比較小。
根據上述原則,OBV的演算法如下,主要是以日為單位累積成交量。
當日OBV值 = 本日值 + 前日OBV值
如果本日收盤價高於前一日的收盤價,本日的值為正,反之為負,如果本日收盤價和前一日的收盤價相同,則本日值不參與計算,按照這種規則累積計算成交量。成交量可以選擇多種計算單位,OBV用到的是成交手數。參考表12-3,通過範例來了解一下OBV的演算法。
表 OBV指標演算法的例項表
日期 |
收盤價(元) |
成交量(手) |
當日OBV累計值 |
第1天 |
10 |
10000 |
不計算 |
第2天 |
10.2 |
+11000 |
+11000 |
第3天 |
10.3 |
+12000 |
+23000 |
第4天 |
10.2 |
-10000 |
+13000 |
第5天 |
10.1 |
-5000 |
+8000 |
其中,第一天不計算,第2天的收盤價高於第1天,所以當日OBV是當日成交量(為正數)。第3天收盤價也高於第2天,所以該日的OBV是第2天的值(+11000)加上該日成交量(+12000)。
第4天股票下跌,所以當日的OBV累計值是前日的23000減去當日的成交量,結果是+13000,同理第5天也是下跌,當日的OBV是前日值13000減去當日成交量5000,結果是8000。
之後的OBV值按同理計算,將每日算得的OBV值作為縱座標,交易的日期作為橫座標,將這些點連線起來就是OBV指標線了。
2 繪製K線、均線和OBV指標圖的整合效果圖
在繪製K線、均線與OBV指標圖時,是從csv檔案(其實源於網站爬取的股票交易資料)中的Volume欄位獲得的成交量,它的單位是“股數”,而計算OBV時成交量的單位是“手”,兩者的對應關係是1手等於100股。
在DrawKwithOBV.py範例程式中,將繪製整合的效果圖,該範例程式存放在MyDjangoDBProj專案中,與DBUtil.py處於同一目錄。為了突出OBV演算法,範例程式不匯入資料庫相關的操作,也不輸出日誌。
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 candlestick2_ochl 6 # 計算OBV的方法 7 def calOBV(df): 8 # 把成交量換算成萬手 9 df['VolByHand'] = df['Volume']/1000000 10 # 建立OBV列,先全填充為0 11 df['OBV'] =0 12 cnt=1 # 索引從1開始,即從第2天算起 13 while cnt<=len(df)-1: 14 if(df.iloc[cnt]['Close']>df.iloc[cnt-1]['Close']): 15 df.ix[cnt,'OBV'] = df.ix[cnt-1,'OBV'] + df.ix[cnt,'VolByHand'] 16 if(df.iloc[cnt]['Close']<df.iloc[cnt-1]['Close']): 17 df.ix[cnt,'OBV'] = df.ix[cnt-1,'OBV'] - df.ix[cnt,'VolByHand'] 18 cnt=cnt+1 19 return df
在第7行的calOBV方法中封裝了計算OBV指標的程式邏輯。具體執行步驟是,在第9行中為df物件新增VolByHand列,把成交量轉換成“萬手”,雖然OBV的計算單位是手,但以此繪製出來的指標圖上y軸的OBV數值還是過大,所以這裡在除以100的基礎上再除以10000,轉換成“萬手”。
隨後在第11行新增OBV列,該列的初始值是0。之後在第13行的while迴圈中,從第2天開始依次遍歷df物件,根據OBV的計算規則給每天的OBV列賦值,比如通過第14行的if語句處理當天收盤價上漲的情況,從第15行的程式程式碼中可以看到,在上漲情況下,當日的OBV值是前日OBV值加上當日的成交量,在第17行中處理了當日下跌的情況,當日的OBV值是前日值減去當日的成交量。
20 filename='D:\\stockData\ch12\\6004602019-01-012019-05-31.csv' 21 df = pd.read_csv(filename,encoding='gbk') 22 # 呼叫方法計算OBV 23 df = calOBV(df) 24 # print(df) # 可以去除這段註釋以檢視結果
在第21行從指定的csv檔案中讀到600460(士蘭微)從20190101到20190531的交易資料,並在第23行呼叫calOBV方法計算OBV值,在該方法的返回結果存放到df物件中,其中OBV值包含在df['OBV']這一列種。如果要檢驗計算的OBV結果,可以去掉第24行的註釋,使得列印語句生效。
25 figure = plt.figure() 26 # 建立子圖 27 (axPrice, axOBV) = figure.subplots(2, sharex=True) 28 # 呼叫方法,在axPrice子圖中繪製K線圖 29 candlestick2_ochl(ax = axPrice, 30 opens=df["Open"].values, closes=df["Close"].values, 31 highs=df["High"].values, lows=df["Low"].values, 32 width=0.75, colorup='red', colordown='green') 33 axPrice.set_title("K線圖和均線圖") # 設定子圖示題 34 df['Close'].rolling(window=3).mean().plot(ax=axPrice,color="red",label='3日均線') 35 df['Close'].rolling(window=5).mean().plot(ax=axPrice,color="blue",label='5日均線') 36 df['Close'].rolling(window=10).mean().plot(ax=axPrice,color="green",label='10日均線') 37 axPrice.legend(loc='best') # 繪製圖例 38 axPrice.set_ylabel("價格(單位:元)") 39 axPrice.grid(linestyle='-.') # 帶網格線 40 # 在axOBV子圖中繪製OBV圖形 41 df['OBV'].plot(ax=axOBV,color="blue",label='OBV') 42 plt.legend(loc='best') # 繪製圖例 43 plt.rcParams['font.sans-serif']=['SimHei'] 44 # 在OBV子圖上加上負值效果 45 plt.rcParams['axes.unicode_minus'] = False 46 axOBV.set_ylabel("單位:萬手") 47 axOBV.set_title("OBV指標圖") # 設定子圖的標題 48 axOBV.grid(linestyle='-.') # 帶網格線 49 # 設定x軸座標的標籤和旋轉角度 50 major_index=df.index[df.index%5==0] 51 major_xtics=df['Date'][df.index%5==0] 52 plt.xticks(major_index,major_xtics) 53 plt.setp(plt.gca().get_xticklabels(), rotation=30) 54 plt.show()
在第27行的程式語句設定了兩個子圖,其中axPrice用於繪製K線和均線,而axOBV則用於繪製OBV指標圖。
從第29行到第39行的程式語句用於繪製K線以及三條均線,這部分程式碼在之前幾章中的範例程式中都講過,所以不再重複說明。在第41行中通過呼叫df['OBV'].plot方法繪製OBV指標圖。
在繪製OBV子圖時請注意兩個細節:
第一,在第46行中,在axOBV子圖內通過呼叫set_ylabel方法設定了OBV子圖的y座標標籤為“萬手”;
第二,通過第45行的程式程式碼,讓OBV子圖上的y座標數字有正有負,如果去掉這行語句,OBV子圖上y座標的數字均為正數。
執行這個範例程式,即可看到如圖所示的執行結果。
本書的其它內容,大家可以參考如下的博文,
程式設計師如何高效學Python,如何高效用Python掙錢 用matplotlib和pandas繪製股票MACD指標圖,並驗證化交易策略 向大家介紹我的新書:《基於股票大資料分析的Python入門實戰》 通過機器學習的線性迴歸演算法預測股票走勢(用Python實現) 在我的新書裡,嘗試著用股票案例講述Python爬蟲大資料視覺化等知識 以股票RSI指標為例,學習Python傳送郵件功能(含RSI指標確定賣點策略) 以預測股票漲跌案例入門基於SVM的機器學習 用python的matplotlib和numpy庫繪製股票K線均線和成交量的整合效果(含量化驗證交易策略程式碼)用python的matplotlib和numpy庫繪製股票K線均線的整合效果(含從網路介面爬取資料和驗證交易策略程式碼)
&n