Python量化:獲取歷史行情資料並計算KDJ指標
KDJ指標又叫隨機指標,是一種相當新穎、實用的技術分析指標,它起先用於期貨市場的分析,後被廣泛用於股市的中短期趨勢分析,是期貨和股票市場上最常用的技術分析工具。
隨機指標KDJ一般是用於股票分析的統計體系,根據統計學原理,通過一個特定的週期(常為9日、9周等)內出現過的最高價、最低價及最後一個計算週期的收盤價及這三者之間的比例關係,來計算最後一個計算週期的未成熟隨機值RSV,然後根據平滑移動平均線的方法來計算K值、D值與J值,並繪成曲線圖來研判股票走勢。
KDJ指標在應用時需要考慮的幾大方面:
1.K與D的取值,範圍是0-100,80以上行情呈現超買現象,20以下呈現超賣現象。2.買進訊號:K值在上漲趨勢中﹤D值,K線向上突破D線時;賣出訊號:K值在下跌趨勢中﹥D值,K線向下跌破D線。
3.交易不活躍、發行量小的股票並不適用KD指標,而對大盤和熱門大盤的準確性卻很高。
4.在KD處在高位或低位,如果出現與股價走向的背離,則是採取行動的訊號。
5.J的取值﹥100為超買,﹤0為超賣,都屬於價格的非正常區域。
6.短期轉勢預警訊號:K值和D值上升或者下跌的速度減弱,傾斜度趨於平緩,通常K、D、J三值在20-80之間為徘徊區,宜觀望.
就敏感度而言,最強的是J值,其次是K,最慢的則是D了,而從安全性來講,就剛剛相反。
一般的股票行情軟體都提供了KDJ的值,以及引數自定義的功能,在程式和交易中,需要自己去計算KDJ的值。好在現在有類庫提供各種指標的計算,尤其是python。很多人都聽過一個叫做TA-lib的python包,可以計算多種的技術指標。另外就是需要下載歷史行情資料,我們使用另一個免費開源的python股票資料介面BaoStock,來下載想要的資料,計算出這隻股票的KDJ。
首先預設已經安裝python,且版本是3.5或者以上。
安裝pandas: pip insall pandas
安裝numpy: pip install numpy
安裝baostock資料介面包:pip installbaostock。
baostock提供免費歷史k線的下載,包括前後復權的資料,而且還提供股票實時資料
如果有問題,請去官網下載再安裝:baostock.com,不需要註冊。
安裝TA-Lib庫 pip install ta-lib(如果安裝不成功,可進入“”下載如“TA_Lib‑0.4.17‑cp35‑cp35m‑win32.whl”相對應的版本,使用pip install xx.whl進行本地安裝)。
程式首先下載股票上一個交易日之前的日K線行情資料,然後計算上一交易日的KDJ指標
import baostock as bs
import pandas as pd
import numpy as np
import talib as ta
import datetime
stockcodelist =['sh.600000', 'sz.300009', 'sz.300128',
login_result =bs.login(user_id='anonymous', password='123456')
print('login respond error_msg:'+login_result.error_msg)
startdate = '2018-01-01'
today = datetime.datetime.now()
delta = datetime.timedelta(days=1)
# 獲取截至上一個交易日的歷史行情
predate = today - delta
strpredate = datetime.datetime.strftime(predate, '%Y-%m-%d')
for stockcode in stockcodelist:
### 獲取滬深A股行情和估值指標(日頻)資料並返回收盤價20日均線 ####
# date 日期
# code 股票程式碼
# high最高價
# low最低價
# close 收盤價
# preclose 前收盤價
# volume 交易量
# amount 交易額
# adjustflag 復權型別
# turn 換手率
# tradestatus 交易狀態
# pctChg 漲跌幅
# peTTM 動態市盈率
# psTTM 市銷率
# pcfNcfTTM 市現率
# pbMRQ 市淨率
rs = bs.query_history_k_data("%s" % stockcode,
"date,code,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,peTTM,pbMRQ,psTTM,pcfNcfTTM",
start_date=startdate, end_date=strpredate,
frequency="d", adjustflag="2")
print('query_history_k_data respond error_code:' + rs.error_code)
print('query_history_k_data respond error_msg:' + rs.error_msg)
#### 列印結果集 ####
result_list = []
while (rs.error_code == '0') &rs.next():
# 獲取一條記錄,將記錄合併在一起
result_list.append(rs.get_row_data())
result = pd.DataFrame(result_list, columns=rs.fields)
closelist = [float(price) for price in list(result['close'])]
highlist = [float(price) for price in list(result[high])]
lowlist = [float(price) for price in list(result[low])]
有了最高最低價和收盤價,就可以方便的計算KDJ指標了。