不管是对量化分析师还是普通的投资者来说,K线图(蜡烛图)都是一种很经典、很重要的工具。在K线图中,它会绘制每天的最高价、最低价、开盘价和收盘价,这对于我们理解股票的趋势以及每天的多空对比很有帮助。
一般来说,我们会从各大券商平台获取K线图,但是这种情况下获得的K线图往往不能灵活调整,也不能适应复杂多变的生产需求。因此我们有必要学习一下如何使用Python绘制K线图。
需要说明的是,这里mpl_finance
是原来的matplotlib.finance
,但是现在独立出来了(而且好像没什么人维护更新了),我们将会使用它提供的方法来绘制K线图;tushare
是用来在线获取股票数据的库;matplotlib.ticker
中有个FuncFormatter()
方法可以帮助我们调整坐标轴;matplotlib.pylab.date2num
可以帮助我们将日期数据进行必要的转化。
import mpl_finance
import tushare as ts
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib import ticker
from matplotlib.pylab import date2num
import numpy as np
sns.set()
pro = ts.pro_api()
我们以上证综指18年9月份以来的行情为例。
tushare
默认提供的数据是最新的数据在最前边;pd.to_datetime()
将字符串日期转换为pandas Timestamp
格式(类似datetime.datetime),然后用date2num转换为matplotlib需要的格式。dates
,这一列用于解决mpl_finance
中存在的一些问题,后边我们会详细解释。我们先使用mpl_finance
绘制一下,看看是否一切正常。
fig, ax = plt.subplots(figsize=(10,5))
mpl_finance.candlestick_ochl(
ax=ax,
quotes=df[['trade_date', 'open', 'close', 'high', 'low']].values,
width=0.7,
colorup='r',
colordown='g',
alpha=0.7)
ax.xaxis_date()
plt.xticks(rotation=30);
可以看到,所有的节假日包括周末,在这里都会显示为空白,这对于我们图形的连续性非常不友好,因此我们要解决掉他们。
def format_date(x,pos):
if x<0 or x>len(date_tickers)-1:
return ''
return date_tickers[int(x)]
date_tickers = df.trade_date2.values
fig, ax = plt.subplots(figsize=(10,5))
ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
mpl_finance.candlestick_ochl(
ax=ax,
quotes=df[['dates', 'open', 'close', 'high', 'low']].values,
width=0.7,
colorup='r',
colordown='g',
alpha=0.7)
ax.set_title('上证综指K线图(2018.9-)', fontsize=20);
可以看到,空白问题完美解决,这里我们解释一下。由于matplotlib
会将日期数据理解为连续数据,而连续数据之间的间距是有意义的,所以非交易日即使没有数据,在坐标轴上还是会体现出来。连续多少个非交易日,在坐标轴上就对应了多少个小格子,但这些小格子上方并没有相应的蜡烛图。
明白了它的原理,我们就可以对症下药了。我们可以给横坐标(日期)传入连续的、固定间距的数据,先保证K线图的绘制是连续的;然后生成一个保存有正确日期数据的列表,接下来,我们根据坐标轴上的数据去取对应的正确的日期,并替换为坐标轴上的标签即可。
上边format_date
函数就是这个作用。由于前边我们给dates
列生成了从0开始的序列连续数据,因此我们可以直接把它当作索引,从真正的日期列表里去取对应的数据。在这里我们要使用matplotlib.ticker.FuncFormattter()
方法,它允许我们指定一个格式化坐标轴标签的函数,在这个函数里,我们需要接受坐标轴的值以及位置,并返回自定义的标签。
你学会了吗?
当然,一个完整的K线图到这里并没有结束,后边我们会考虑加入均线、成交量等元素,感兴趣的同学欢迎关注哦!