------从零开始学量化------
:量化目录传送门
知乎:量化目录传送门
0. 前言
为什么去画k线图???同花顺上不是已经有了吗???
我的痛点:
场景一:在后期的代码中,我们会使用svm、神经网络中需要对数据进行打标签,主要标记合适的买点和卖点,当你标记好的时候,没有一个直观的图形来观察标记的结果。
场景二:当你完成了一个量化策略,根据策略预测出的买点和卖点是否完全符合预期,有没有错误,同样也没有一个直观的图形来观察。
综上,所以我选择自己做一个k线图,主要用于以上两个场景。
1. 使用的开源框架
- tushare
- talib
- pyecharts
tushare,前面已经介绍过,是获取金融数据的框架。
talib,前面也介绍过,用于计算技术指标。
pyecharts,前面并没有介绍过,该框架用于绘制k线图。
为什么不用matplotlib或者是seaborn画k线图呢?主要是因为seaborn绘制出来的是一个图片,不能像同花顺软件一样,对k线进行缩放、移动,不便于进行交互。所以此处使用pyecharts,但目前pyecharts社区还不太活跃,并且灵活性远不如echarts,后面尽量不再使用pyecharts。
## 安装pyecharts
pip install pyecharts
2. 代码效果
3. 代码简介
- tushare抓取了2015-2018年的贵州茅台(600519)的日线数据。
- 使用talib计算cci指标(Commodity Channel Index,顺势指标)
- 当cci>=50则选择买入股票,当cci<50则卖出股票
- 绘制出k线图和持仓情况
4. 参考代码
import talib
import tushare
from pyecharts import Line, Kline, Bar, Overlap, Grid
# get 300ETF from tushare
data = tushare.get_k_data('600519', ktype='D', autype='None', start='2015-01-01', end='2018-07-01')
# 计算并画出cci
cci = talib.CCI(data['high'].values, data['low'].values, data['close'].values, timeperiod=14)
# 简单的一个择时策略,当cci>50则持仓,当cci<50则空仓
position = [50 if idx >= 50 else 0 for idx in cci]
# 定义k线图的提示框的显示函数
def show_kline_data(params, pos):
param = params[0]
if param.data[4]:
return "date = " + param.name + "
" + "open = " + param.data[1] + "
" + "close = " + param.data[
2] + "
" + "high = " + param.data[3] + "
" + "low = " + param.data[
4] + "
"
else:
return "date = " + param.name + "
" + "cci = " + param.value + "
"
# 绘制cci
cci_line = Line()
cci_line.add("cci", x_axis=data['date'], y_axis=cci, is_datazoom_show=True,
datazoom_xaxis_index=[0, 1],
tooltip_tragger='axis',
is_toolbox_show=True,
yaxis_force_interval=100,
legend_top="70%",
legend_orient='vertical',
legend_pos='right',
yaxis_pos='left',
is_xaxislabel_align=True,
tooltip_formatter=show_kline_data,
)
# 绘制持仓
bar = Bar()
bar.add('持仓', data['date'], position, is_datazoom_show=True)
# 将持仓和cci重叠在一个图中
cci_overlap = Overlap()
cci_overlap.add(cci_line)
cci_overlap.add(bar)
cci_overlap.render()
# 画出K线图
price = [[open, close, lowest, highest] for open, close, lowest, highest in
zip(data['open'], data['close'], data['low'], data['high'])]
kline = Kline("贵州茅台", title_pos='center')
kline.add('日线', x_axis=data['date'], y_axis=price, is_datazoom_show=True,
is_xaxislabel_align=True,
tooltip_tragger='axis',
yaxis_pos='left',
legend_top="20%",
legend_orient='vertical',
legend_pos='right',
is_toolbox_show=True,
tooltip_formatter=show_kline_data)
# 将cci折线图和K线图合并到一张图表中
grid = Grid()
grid.add(cci_overlap, grid_top="70%")
grid.add(kline, grid_bottom="40%")
grid.render()
如果你对我的文章有兴趣,可以关注一下我的和知乎,后期会在和知乎上定期更新,传送门在下方:
:潇潇夜雨归何处
知乎:潇潇夜雨
我相信,有趣的灵魂总会相遇!!!
你的关注,是我前进的动力!!!