1. 程式人生 > >用Python語言繪製股市OBV指標效果

用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