目录
1 股票K线图知识了解
2 用Python绘制股票K线图
2.1 安装绘制K线图的mpl_finance库
2.2 引入相关库
2.4 日期格式调整及表格转换
2.5 绘制K线图
2.6 添加均线图
2.7 添加每日成交量柱形图
下图所示为“贵州茅台”股票的日线级别的K线图:
K线图中的柱形通常称为“K线”,因为形似蜡烛,所以也称为蜡烛图。
K线是根据股票的4个价格绘制的:
开盘价(当天上午9:30开始交易时的价格)、
收盘价(当天下午3:00结束交易时的价格)、
最高价(当天股价波动中的最高价)、
最低价(当天股价波动中的最低价)。
这4个价格分别简称为“高”“开”“低”“收”。
K线分为两种:
如果当天的收盘价高于开盘价,即当天的价格上涨,称为阳线,通常绘制成红色;
如果当天的收盘价低于开盘价,即当天的价格下跌,则称为阴线,通常绘制成绿色;
补充说一句,在美国的股票市场上,反而是用红色代表跌,用绿色代表涨。
K线图中的折线称为“均线”。
均线分为5日均线(MA5)、10日均线(MA10)、20日均线(MA20)等,其绘制原理是对一定时期内股票的收盘价求平均值。
例如,要绘制5日均线,就要先计算最近连续5个交易日收盘价的平均值,具体的计算公式如下,其中Close1为当天的收盘价,Close2为前一天的收盘价,依次类推。
根据上述公式,每个交易日都能算出一个5日均价,再把多个交易日的5日均价连成一条平滑的曲线,就是5日均线。10日均线和20日均线也是用类似的原理绘制的。
命令行窗口或者Jupyter Notebook:
pip install https://github.com/matplotlib/mpl_finance/archive/master.zip
import tushare as ts
import matplotlib.pyplot as plt
import mpl_finance as mpf
import seaborn as sns
通过Tushare库获取股票代码为“000002”的股票“万科A”在2019-06-01至2019-09-30的股价数据,代码如下。
df = ts.get_k_data('000002','2019-06-01','2019-09-30')
获取到的数据部分截图如下。
因为绘制K线图的candlestick_ochl()函数只能读取数组格式的数据,并且其中的日期数据要为特定的数字格式,所以需要将前面获取的股票基本数据调整一下,代码如下。
# 导入调整日期格式涉及的两个库
from matplotlib.pylab import date2num
import datetime
# 将Tushare库中获取到的日期数据转换成candlestick_ochl()函数可读取的格式
def date_to_num(dates):
num_time = []
for date in dates:
date_time = datetime.datetime.strptime(date,'%Y-%m-%d')
num_date = date2num(date_time)
num_time.append(num_date)
return num_time
# 将DataFrame转换为二维数组,并利用date_to_num()函数转换日期格式
df_arr = df.values #将DataFrame格式的数据转换为二维数组
# df_arr
df_arr[:,0] = date_to_num(df_arr[:,0]) #将二维数组中的日期转换成数字格式
查看调整后的部分数据:
可以看到DataFrame格式的二维表格变为二维数组,且date列的内容由文本格式的日期变为数字格式的日期。
fig,ax = plt.subplots(figsize=(15,6))
mpf.candlestick_ochl(ax,df_arr,width=0.6,colorup='r',colordown='g',alpha=1.0)
plt.grid() #显示网格
ax.xaxis_date() #设置x轴的刻度格式为常规日期格式
以添加5日均线和10日均线为例,首先通过如下代码构造5日均线和10日均线的数据。
df['MA5'] = df['close'].rolling(5).mean()
df['MA10'] = df['close'].rolling(10).mean()
通过rolling()函数和mean()函数可以直接算出均线数据,若要计算20日或30日均线的数据,只需将rolling()函数中的参数换成20或30。
查看此时数据:
可以看到,代表5日均线数据的MA5列前4行为空值,这是因为5日均线数据是取连续5个交易日的收盘价来计算平均值,而前4行数据不足,也就无法计算,所以为空值;同理,MA10列的前9行也为空值,到第10行才开始有数据。
获取到5日均线和10日均线的数据后,即可将其绘制成图表,代码如下。
plt.rcParams['font.sans-serif'] = ['SimHei'] #设置正常显示中文
fig,ax = plt.subplots(figsize=(15,6))
mpf.candlestick_ochl(ax,df_arr,width=0.6,colorup='r',colordown='g',alpha=1.0)
plt.plot(df_arr[:,0],df['MA5'])
plt.plot(df_arr[:,0],df['MA10'])
plt.grid()
ax.xaxis_date()
plt.title('万科A')
plt.xlabel('日期')
plt.ylabel('价格')
在商业实战中,与股票K线图、均线图一同出现的往往还有每日成交量柱形图。下面利用绘制多图的知识点,在一张画布中绘制两张子图,第1张子图包含K线图和均线图,第2张子图为每日成交量柱形图,代码如下。
fig,axes = plt.subplots(2,1,sharex=True,figsize=(15,8))
ax1,ax2 = axes.flatten()
# 绘制K线图和均线图
mpf.candlestick_ochl(ax1,df_arr,width=0.6,colorup='r',colordown='g',alpha=1.0)
ax1.plot(df_arr[:,0],df['MA5'])
ax1.plot(df_arr[:,0],df['MA10'])
ax1.grid()
ax1.xaxis_date()
ax1.set_title('万科A',fontsize=16)
ax1.set_ylabel('价格',fontsize=16)
# 绘制每日成交量图
ax2.bar(df_arr[:,0],df_arr[:,5])
ax2.set_xlabel('日期',fontsize=16)
ax2.set_ylabel('成交量',fontsize=16)
ax1.grid()
ax1.xaxis_date()