使用matplotlib绘制K线图和成交量的组合图

使用matplotlib绘制K线图和成交量的组合图

这篇是学习使用matplotlib绘制K线图以及和成交量的组合图的笔记。补充点在于中文绘图(由于我之前对matplotlib包的改造)和解决了最新版的matplotlib删除了finance模块的问题。

解决最新版的matplotlib删除了finance模块的问题

首先亟需解决的问题是最新版的matplotlib删除了finance模块的问题。从这篇文章ImportError: No module named finance中可以找到解决办法。解决办法就是安装matplotlib推出的mpl_finance包。安装办法是首先下载mpl_finance包的源码mpl_finance_master.zip。解压之后把终端切换到这个文件夹里,然后运行下面的代码安装:

1
python3 setup.py install

获取万达电影的股票数据

1
2
3
4
5
6
7
8
9
10
import matplotlib as mpl
import tushare as ts
import matplotlib.pyplot as plt
import mpl_finance as mpf

wdyx = ts.get_k_data('002739', '2017-01-01')
# 查看数据框的属性
wdyx.info()
# 查看数据框的前3行
wdyx[:3]

这里使用的是老版的tushare包下载的数据。但是mpf.candlestick_ohlc()函数只能够处理浮点数格式的日期,所以下面需要把日期变成浮点数格式。

日期转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from matplotlib.pylab import date2num
import datetime

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

# 把数据框转换为二维数组
mat_wdyx = wdyx.as_matrix()
num_time = date_to_num(mat_wdyx[:,0])
mat_wdyx[:,0] = num_time
mat_wdyx[:3]

绘制蜡烛图

这里使用的是函数mpf.candlestick_ohlc()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 绘制K线图
fig, ax = plt.subplots(figsize = (15, 5))
mpf.candlestick_ohlc(ax, mat_wdyx, width = 0.6, colorup = 'g', colordown = 'r', alpha = 1.0)
plt.grid(True)
# 设置日期刻度旋转
plt.xticks(rotation=30)
plt.title(u'万达电影')
plt.xlabel(u'日期')
plt.ylabel(u'股价')
# x轴的刻度为日期
ax.xaxis_date()
# candlestick_ohlc()函数的参数说明:
# ax: 绘图axes的实例
# mat_wdyx: 价格的历史数据
# width: 图像中蜡烛条的宽度,表示天数
# colorup: 低开高收时的颜色
# colordown: 高开低收时的颜色
plt.savefig('万达电影')
plt.show()

万达电影股价蜡烛图(绿涨红跌)

绘制棒状图

这里用到了函数mpf.plot_day_summary_oclh()

1
2
3
4
5
6
7
8
9
fig, ax = plt.subplots(figsize=(15, 5))
mpf.plot_day_summary_oclh(ax, mat_wdyx, colorup='g', colordown='r')
plt.grid(True)
ax.xaxis_date()
plt.title("万达电影")
plt.xlabel("日期")
plt.ylabel("股价")
plt.savefig("万达电影2")
plt.show()

万达电影股价棒状图(绿涨红跌)

K线图和交易量的组合图

这里是将蜡烛图和柱形图组合:

1
2
3
4
5
6
7
8
9
10
11
fig, (ax1, ax2) = plt.subplots(2, sharex=True, figsize = (15, 8))
mpf.candlestick_ochl(ax1, mat_wdyx, width=1.0, colorup='g', colordown='r')
ax1.set_title('万达电影')
ax1.set_ylabel('股价')
ax1.grid(True)
ax1.xaxis_date()
plt.bar(mat_wdyx[:,0]-0.25, mat_wdyx[:,5], width=0.5)
ax2.set_ylabel('交易量')
ax2.grid(True)
plt.savefig('带交易量的万达电影蜡烛图')
plt.show()

带交易量的万达电影蜡烛图

# Python

评论

程振兴

程振兴 @czxa.top
截止今天,我已经在本博客上写了604.4k个字了!

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×