画k线需要的包和环境:
python36
import tushare as ts
import re
import matplotlib.pyplot as plt
import mpl_finance as mpf
import numpy as np
import talib as tl
tushare是python的一个第三方库,通过它可以获取股票的当日数据和历史数据,可以通过这里进行详细了解;matplotlib用于数据的可视化;mpl_finance是python中可以用来画出蜡烛图、线图的分析工具,目前已经从matplotlib中独立出来;talib是一个Python 金融指数处理库.
股票数据准备:
获取股票历史数据可通过tushare库调用get_hist_data或者pro_bar来完成,这里我们通过第二种方法进行采集:
api = ts.pro_api()
首先要实例化api,需要在tushare平台注册账号,并获取token(免费);
df = ts.pro_bar('600073.SH', start_date='2019-12-30 00:00:00', end_date='2019-12-30 15:00:00', freq='1min')[::-1]
该方法会以dataframe的格式返回数据,其参数分别表示股票代码,起始时间,终止时间,要查询的频率,具体可参考下边参数,由于返回的数据时间上是从后往前的,所以我们通过[::-1]进行调换.
ts_code |
证券代码,支持股票,ETF/LOF,期货/期权,港股,数字货币 |
start_date |
开始日期 YYYYMMDD |
end_date |
结束日期 YYYYMMDD |
freq |
支持1/5/15/30/60分钟,周/月/季/年 |
asset |
证券类型 E:股票和交易所基金,I:沪深指数,C:数字货币,FT:期货 FD:基金/O期权/H港股/CB可转债 |
exchange |
市场代码,用户数字货币行情 |
adj |
复权类型,None不复权,qfq:前复权,hfq:后复权 |
ma |
均线,支持自定义均线频度,如:ma5/ma10/ma20/ma60/maN |
offset |
开始行数(分页功能,从第几行开始取数据) |
limit |
本次提取数据行数 |
factors |
因子数据,目前支持以下两种:vr:量比,默认不返回,返回需指定:factor=['vr'],tor:换手率,默认不返回,返回需指定:factor=['tor'], |
retry_count |
网络重试次数 |
index = list(map(lambda i: re.findall(r'd{2}:d{2}', i)[0], df.trade_time))
我们以时间为x轴,所以要提取df中的trade_time数据,因为我们的时间比较长,如果都显示看起来比较冗余,所以我们通过正则提取其中的时分秒即可.
下边我们就开始画k线图:
sma_10 = tl.SMA(np.array(df['close']), 10)
sma_30 = tl.SMA(np.array(df['close']), 30)
画均线,上边分别是10天内的和30天内的均值计算
fig = plt.figure(figsize=(38, 18), dpi=100)
ax = fig.add_subplot(1, 1, 1)
常见一个画布,设置其长宽,可通过dpi来设置生成图片的像素;在画布中生成一张子图.
ax.set_title(f'2019-12-27 {600073}', fontsize=30, color='red')
ax.set_xticks(range(0, len(df.index)))ax.set_xticklabels(index, rotation=-80)
给子图添加标题,可设置字体大小和颜色,这里为了醒目我们设置成红色;设置x轴,按照df的长度来设定,然后把上边通过正则获取的时间添加在x轴上,为了避免显示重叠,可通过rotation参数设置旋转,如图:
mpf.candlestick2_ochl(ax, df['open'], df['close'], df['high'],df['low'], width=0.6, colorup='r', colordown='g', alpha=0.75)
candlestick2_ochl方法用来生成k线,非常的方便,只需把开盘,收盘,最高,最低参数传入即可.
最后设置图例:
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei'] # 设置字体ax.plot(sma_10, label='10日均线')
ax.plot(sma_30, label='30日均线')
ax.legend()
这样指定股票的日k线就完成了,完整代码点击,参考图: