1.4 量化技术篇—完成一个简单k线图和择时策略

------从零开始学量化------
简书量化目录传送门
知乎量化目录传送门


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. 代码效果

image

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 + "<br/>" + "open = " + param.data[1] + "<br/>" + "close = " + param.data[
2] + "<br/>" + "high = " + param.data[3] + "<br/>" + "low = " + param.data[
   4] + "<br/> "
else:
return "date = " + param.name + "<br/>" + "cci = " + param.value + "<br/>"
# 绘制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()

如果你对我的文章有兴趣,可以关注一下我的简书和知乎,后期会在简书和知乎上定期更新,传送门在下方:
简书潇潇夜雨归何处
知乎潇潇夜雨
我相信,有趣的灵魂总会相遇!!!
你的关注,是我前进的动力!!!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容