1. 程式人生 > >用Python的Pandas和Matplotlib繪製股票KDJ指標線

用Python的Pandas和Matplotlib繪製股票KDJ指標線

  我最近出了一本書,《基於股票大資料分析的Python入門實戰 視訊教學版》,京東連結:https://item.jd.com/69241653952.html,在其中給出了MACD,KDJ等指標圖的繪製方法。這裡將根據KDJ的演算法,計算並繪製KDJ指標線。

1  KDJ指標的計算過程

    KDJ指標也叫隨機指標,是由喬治·藍恩博士(George Lane)最早提出的。該指標集中包含了強弱指標、動量概念和移動平均線的優點,可以用來衡量股價脫離正常價格範圍的偏離程度。

    KDJ指標的計算過程是,首先獲取指定週期(一般是9天)內出現過的股票最高價、最低價和最後一個交易日的收盤價,隨後通過它們三者間的比例關係來算出未成熟隨機值RSV,並在此基礎上再用平滑移動平均線的方式來計算K、D和J值。計算完成後,把KDJ的值繪成曲線圖,以此來預判股票走勢,具體的演算法如下所示。

    第一步:計算週期內(n日、n周等,n一般是9)的RSV值,RSV也叫未成熟隨機指標值,是計算K值、D值和J值的基礎。以n日週期計算單位為例,計算公式如下所示。

    n日RSV =(Cn-Ln)/(Hn-Ln)× 100

    其中,Cn是第n日(一般是最後一日)的收盤價,Ln是n日範圍內的最低價,Hn是n日範圍內的最高價,根據上述公式可知,RSV值的取值範圍是1到100。如果要計算n周的 RSV值,則Cn還是最後一日的收盤價,但Ln和Hn則是n周內的最低價和最高價。

    第二步:根據RSV計算K和D值,方法如下。

    當日K值 = 2/3 × 前一日K值 + 1/3 × 當日的RSV值

    當日D值 = 2/3 × 前一日D值 + 1/3 × 當日K值

    在計算過程中,如果沒有前一日K 值或D值,則可以用數字50來代替。

    在實際使用過程中,一般是以9日為週期來計算KD線,根據上述公式,首先是計算出最近9日的RSV值,即未成熟隨機值,計算公式是9日RSV = (C-L9)÷(H9-L9)× 100。其中各項引數含義在步驟一中已經提到,其次再按本步驟所示計算當日的K和D值。

    需要說明的是,上式中的平滑因子2/3和1/3是可以更改的,不過在股市交易實踐中,這兩個值已經被預設設定為2/3和1/3。

    第三步:計算J值。J指標的計算公式為:J = 3×K - 2×D。從使用角度來看,J的實質是反映K值和D值的乖離程度,它的範圍上可超過100,下可低於0。

最早的KDJ指標只有K線和D線兩條線,那個時候也被稱為KD指標,隨著分析技術的發展,KD指標逐漸演變成KDJ指標,引入J指標後,能提高KDJ指標預判行情的能力。

    在按上述三個步驟計算出每天的K、D和J三個值之後,把它們連線起來,就可以看到KDJ指標線了。

2 繪製靜態的KDJ指標線

    根據上節給出的KDJ演算法,在下面的drawKDJ.py範例程式中將繪製股票“金石資源”(股票程式碼為603505)從2018年9月到2019年5月這段時間內的KDJ走勢圖。    

 !/usr/bin/env python
2    # coding=utf-8
3    import matplotlib.pyplot as plt
4    import pandas as pd
5    # 計算KDJ
6    def calKDJ(df):
7        df['MinLow'] = df['Low'].rolling(9, min_periods=9).min()
8        # 填充NaN資料
9        df['MinLow'].fillna(value = df['Low'].expanding().min(), inplace = True)
10        df['MaxHigh'] = df['High'].rolling(9, min_periods=9).max()
11        df['MaxHigh'].fillna(value = df['High'].expanding().max(), inplace = True)
12        df['RSV'] = (df['Close'] - df['MinLow']) / (df['MaxHigh'] - df['MinLow']) * 100
13        # 通過for迴圈依次計算每個交易日的KDJ值
14        for i in range(len(df)):
15            if i==0:     # 第一天
16                df.ix[i,'K']=50
17                df.ix[i,'D']=50
18            if i>0:
19                df.ix[i,'K']=df.ix[i-1,'K']*2/3 + 1/3*df.ix[i,'RSV']
20                df.ix[i,'D']=df.ix[i-1,'D']*2/3 + 1/3*df.ix[i,'K']
21            df.ix[i,'J']=3*df.ix[i,'K']-2*df.ix[i,'D']
22        return df

    從第6行到第22行程式語句定義的calKDJ方法中,將根據輸入引數df,計算指定時間範圍內的KDJ值。

    具體的計算步驟是,在第8行中通過df['Low'].rolling(9, min_periods=9).min(),把每一行(即每個交易日)的 'MinLow' 屬性值設定為9天內收盤價(Low)的最小值。

    如果只執行這句,第1到第8個交易日的MinLow屬性值將會是NaN,所以要通過第9行的程式程式碼,把這些交易日的MinLow屬性值設定為9天內收盤價(Low)的最小值。同理,通過第10行的程式程式碼,把每個交易日的 'MaxHigh' 屬性值設定為9天內的最高價,同樣通過第11行的fillna方法,填充前8天的 'MaxHigh' 屬性值。隨後在第12行中根據演算法計算每個交易日的RSV值。

    在算完RSV值後,通過第14行的for迴圈,依次遍歷每個交易日,在遍歷時根據KDJ的演算法分別計算出每個交易日對應的KDJ值。

    請注意,如果是第1個交易日,則在第16行和第17行的程式程式碼中把 K值和D值設定為預設的50,如果不是第1交易日,則通過第19行和第20行的演算法計算K值和D值。計算完K和D的值以後,再通過第21行的程式程式碼計算出每個交易日的J值。

    從上述程式碼中,可以看到關於DataFrame物件的三個操作技巧:

    第一,如第9行所示,如果要把修改後的資料寫回到DataFrame中,必須加上inplace = True的引數;

    第二,在第12行中,df['Close']等變數值是以列為單位,也就是說,在DataFrame中,可以直接以列為單位進行操作;

    第三,在第16行的程式碼df.ix[i,'K']=50,這裡用到的是ix通過索引值和標籤值來訪問物件,而實現類似功能的loc和iloc方法只能通過索引值來訪問。    

 繪製KDJ線
24    def drawKDJ():
25        df = pd.read_csv('D:/stockData/ch8/6035052018-09-012019-05-31.csv',encoding='gbk')
26        stockDataFrame = calKDJ(df)
27        print(stockDataFrame)
28        # 開始繪圖
29        plt.figure()
30        stockDataFrame['K'].plot(color="blue",label='K')
31        stockDataFrame['D'].plot(color="green",label='D')
32        stockDataFrame['J'].plot(color="purple",label='J')
33        plt.legend(loc='best')         # 繪製圖例
34        # 設定x軸座標的標籤和旋轉角度    major_index=stockDataFrame.index[stockDataFrame.index%10==0]
35    major_xtics=stockDataFrame['Date'][stockDataFrame.index%10==0]
36        plt.xticks(major_index,major_xtics)
37        plt.setp(plt.gca().get_xticklabels(), rotation=30)
38        # 帶網格線,且設定了網格樣式
39        plt.grid(linestyle='-.')
40        plt.title("金石資源的KDJ圖")
41        plt.rcParams['font.sans-serif']=['SimHei']
42        plt.show()
43    # 呼叫方法
44    drawKDJ()

    在第24行的drawKDJ方法中實現了繪製KDJ的操作。其中的關鍵步驟是,通過第25行的程式程式碼從指定的csv檔案中讀取股票交易資料,隨後在第30行到第32行的程式程式碼中,呼叫plot方法分別用三種不同的顏色繪製了KDJ線,因為在繪製時通過label引數設定了標籤,所以可以執行第33行的程式程式碼來繪製圖例。

    在第34行到第37行的程式碼中設定了x軸的文字標籤和旋轉角度,這部分程式碼與之前繪製MACD指標線的程式碼很相似,為了不在x軸上過多地顯示日期,於是用stockDataFrame.index%10 == 0的方式,只顯示索引值是10的倍數的日期。

    在第44行呼叫了drawKDJ方法將KDJ繪製出來。執行這個範例程式之後,即可看到如圖所示的結果,其中KDJ三根曲線分別用藍色、綠色和紫色繪製出來(因為本書採用黑白印刷而看不出彩色,請讀者在自己的計算機上執行這個範例程式)。

 

    下圖是從股票軟體中得到的股票“金石資源”在同時間段內的KDJ走勢圖,兩者的變化趨勢基本一致。

    

 

 本文可以轉載,轉載時請全文轉載,別有刪節,並用連結的形式給出原文連結。否則的話,可能會遇到出版社的維權。

 

 

     文字相關連結:

用Python的Pandas和Matplotlib繪製股票唐奇安通道,布林帶通道和鱷魚組線 
  用Python爬取股票資料,繪製K線和均線並用機器學習預測股價(來自我出的書) 
  用Python語言繪製股市OBV指標效果     程式設計師如何高效學Python,如何高效用Python掙錢 
  用matplotlib和pandas繪製股票MACD指標圖,並驗證化交易策略 
  向大家介紹我的新書:《基於股票大資料分析的Python入門實戰》   通過機器學習的線性迴歸演算法預測股票走勢(用Python實現)     在我的新書裡,嘗試著用股票案例講述Python爬蟲大資料視覺化等知識 
  以股票RSI指標為例,學習Python傳送郵件功能(含RSI指標確定賣點策略) 
  以預測股票漲跌案例入門基於SVM的機器學習 
  用python的matplotlib和numpy庫繪製股票K線均線和成交量的整合效果(含量化驗證交易策略程式碼) 
  用python的matplotlib和numpy庫繪製股票K線均線的整合效果(含從網路介面爬取資料和驗證交易策略程式碼)