1 引言
做量化分析,难免要将自己的某些指标等绘制在K线图上,或者对某些指标进行改造观察K线图和指标对应的走势关系。那么用Python如何绘制和炒股软件类似的效果呢。
2 准备工具
(1)数据源:Tushare(国内做量化研究高质量数据)
Tushare大数据社区
(2)常用指标计算:Ta-lib (离线下载安装链接如下)
https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib
(3)K线绘图工具:mpl_finance.py (下载链接如下)
https://download.csdn.net/download/yifengdongying/29738748
3 开始工作
3.1 导入依赖包
import mpl_finance
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import ticker
import talib
3.2?编制计算指标的函数
这里只计算了最常见的两个指标MACD、KDJ,量化小伙伴,可以自己进行加工改造,找到适合自己的指标。
# 利用talib计算MACD指标
def macd_cal(df):
df['DIFF'], df['DEA'], df['MACD'] = talib.MACD(df['close'].values)
df['MACD'] *= 2 #国内MACD需要乘以2
return df
# 利用talib计算KDJ指标
def kdj_cal(df):
df['kdj_k'], df['kdj_d'] = talib.STOCH(df['high'].values,
df['low'].values,
df['close'].values,
fastk_period=9,
slowk_period=5,
slowk_matype=1,
slowd_period=5,
slowd_matype=1) # 计算kdj的正确配置
df.loc[:, 'kdj_j'] = 3.0 * df.loc[:, 'kdj_k'] - 2.0 * df.loc[:, 'kdj_d']
return df
3.3?编制绘图的函数
# k线绘制
def ax_kline(ax, df):
date_tickers = df['trade_date'].values
def format_date(x, pos=None):
# 由于前面股票数据在 date 这个位置传入的都是int
# 因此 x=0,1,2,...
# date_tickers 是所有日期的字符串形式列表
if x < 0 or x > len(date_tickers) - 1:
return ''
return date_tickers[int(x)]
date_len = len(df)
dateLoc = int(date_len / 10 + 0.5)
ax.xaxis.set_major_locator(ticker.MultipleLocator(dateLoc))
ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
ax.set_ylabel('K')
ax.grid(True)
plt.setp(ax.get_xticklabels(), visible=False)
mpl_finance.candlestick_ochl(
ax=ax,
quotes=df[['iNum', 'open', 'close', 'high', 'low']].values,
width=0.7,
colorup='r',
colordown='g',
alpha=0.7)
ax.set_title('%s' % (df['ts_code'].iloc[0]))
# kdj指标绘制
def ax_kdj(ax, df):
ax.plot(df['iNum'], df[['kdj_k', 'kdj_d', 'kdj_j']])
# make these tick labels invisible
ax.set_ylabel('KDJ')
ax.grid(True)
plt.setp(ax.get_xticklabels(), visible=True)
ax.set_title('KDJ:', loc='right')
# macd指标绘制
def ax_macd(ax, df):
ax.bar(df['iNum'], df['MACD'], color='b')
ax.plot(df['iNum'], df[['DIFF', 'DEA']])
ax.set_ylabel('MACD')
# ax.set_title('MACD_%s_%0.2f'%(df['ts_code'][0],success_rate_macd))
ax.grid(True)
plt.setp(ax.get_xticklabels(), visible=True)
# 绘图主程序
def kplot(df, index):
'''
df: 数据格式如下(实例):
ts_code 000001.SZ
trade_date 20190329
open 12.26
high 12.82
low 12.21
close 12.82
pre_close 12.22
change 0.6
pct_chg 4.91
vol 1.66951e+06
amount 2.1083e+06
DIFF -0.00807692
DEA -0.00448718
MACD -0.00717949
kdj_k 46.7579
kdj_d 47.4992
kdj_j 45.2753
Name: 20190329, dtype: object
'''
df = df.sort_values('trade_date')
df['iNum'] = np.arange(len(df))
if index == 'MACD':
fig = plt.figure(figsize=[12, 8])
ax1 = plt.axes([0.1, 0.3, 0.8, 0.6])
ax_kline(ax1, df)
ax2 = plt.axes([0.1, 0.1, 0.8, 0.2], sharex=ax1)
ax_macd(ax2, df)
elif index == 'KDJ':
fig = plt.figure(figsize=[12, 8])
ax1 = plt.axes([0.1, 0.3, 0.8, 0.6])
ax_kline(ax1, df)
ax2 = plt.axes([0.1, 0.1, 0.8, 0.2], sharex=ax1)
ax_kdj(ax2, df)
return fig
3.4 获取K线数据并绘图
if __name__ == '__main__':
import tushare as ts
ts.set_token('********需要用户自己去Tushare注册获取Token链接在第2章******')
pro = ts.pro_api()
df = ts.pro_bar(api=pro, ts_code='600036.SH', adj='qfq', start_date='20210301')
print(df.shape)
df = df.sort_values('trade_date')
df['iNum'] = np.arange(len(df))
df = macd_cal(df)
df = kdj_cal(df)
df['iNum'] = np.arange(len(df))
date_tickers = df['trade_date']
fig = kplot(df, 'MACD')
plt.show(fig)
4 结果展示
4.1 K线图+MACD
4.2 K线图+KDJ
|