最近想扩展一下vnpy,优化一些功能和代码的性能。在看backtesting部分代码的时候,发现,vnpy其实回测功能挺弱的,可以自己扩展一下。随之而来的就是一个回测结果可视化的问题。vnpy原生的回测结果没有绘制k线,所以也就没有指标的可视化和开仓平仓的可视化,只有随后交易结果的可视化。笔者自己其实有点点不习惯,没有看到策略的可视化回测结果,有点点不开心,所以打算自己做一下。首先就是选择可视化的工具,pyecharts应该是一个首选了,而且现在发展的越来越好了。

那么,首先来尝试一下k线部分pyechats官方的代码吧。

下面的代码来自官网哦

http://pyecharts.org

from pyecharts import Klinev1 = [[2320.26, 2320.26, 2287.3, 2362.94], [2300, 2291.3, 2288.26, 2308.38],[2295.35, 2346.5, 2295.35, 2345.92], [2347.22, 2358.98, 2337.35, 2363.8],[2360.75, 2382.48, 2347.89, 2383.76], [2383.43, 2385.42, 2371.23, 2391.82],[2377.41, 2419.02, 2369.57, 2421.15], [2425.92, 2428.15, 2417.58, 2440.38],[2411, 2433.13, 2403.3, 2437.42], [2432.68, 2334.48, 2427.7, 2441.73],[2430.69, 2418.53, 2394.22, 2433.89], [2416.62, 2432.4, 2414.4, 2443.03],[2441.91, 2421.56, 2418.43, 2444.8], [2420.26, 2382.91, 2373.53, 2427.07],[2383.49, 2397.18, 2370.61, 2397.94], [2378.82, 2325.95, 2309.17, 2378.82],[2322.94, 2314.16, 2308.76, 2330.88], [2320.62, 2325.82, 2315.01, 2338.78],[2313.74, 2293.34, 2289.89, 2340.71], [2297.77, 2313.22, 2292.03, 2324.63],[2322.32, 2365.59, 2308.92, 2366.16], [2364.54, 2359.51, 2330.86, 2369.65],[2332.08, 2273.4, 2259.25, 2333.54], [2274.81, 2326.31, 2270.1, 2328.14],[2333.61, 2347.18, 2321.6, 2351.44], [2340.44, 2324.29, 2304.27, 2352.02],[2326.42, 2318.61, 2314.59, 2333.67], [2314.68, 2310.59, 2296.58, 2320.96],[2309.16, 2286.6, 2264.83, 2333.29], [2282.17, 2263.97, 2253.25, 2286.33],[2255.77, 2270.28, 2253.31, 2276.22]]
kline = Kline("K 线图示例")
kline.add("日K", ["2017/7/{}".format(i + 1) for i in range(31)], v1)
kline.render()

首先,k线在pyechats里面定义为Kline类。这里先是写好了k线的数据,v1.我们注意到,数据的结构是一个列表的列表,里面的每一个列表是open close low high,也就是oclh格式。非常符合我们做量化的风格。

有了数据之后是实例化k线对象,传个图像的名称就可以了。然后就是关键的add方法,其实就是往图像里面插入数据,我们可以看一下add的实现:

    def __add(self, name, x_axis, y_axis, **kwargs):""":param name:系列名称,用于 tooltip 的显示,legend 的图例筛选。:param x_axis:x 坐标轴数据。:param y_axis:y 坐标轴数据。数据中,每一行是一个『数据项』,每一列属于一个『维度』。数据项具体为 [open, close, lowest, highest] (即:[开盘值, 收盘值,最低值, 最高值])。:param kwargs:"""

在Kline类里面,add其实调用了__add,其中,name参数其实就是一个图例,然后是x坐标的数据,y坐标的数据。

然后就是render方法就可以获得一个html格式的结果,用浏览器打开就可以了。

大概是下面这样:

图片来自pyecharts官网。

此外还可以增加一些别的设置,这些设置都是通过add方法中设置一些关键字来完成,比如:

kline.add("日K",["2017/7/{}".format(i + 1) for i in range(31)],v1,mark_point=["max"],is_datazoom_show=True,
)

这里,我们发现多了mark_point和is_datazoom_show的一个设置,其中,mark_point是用来标记处最大值,而is_datazoom_show是用来标记出是否具有伸缩坐标轴功能的。

同样的,坐标轴伸缩方向可以通过datazoom_orient来设置:

kline.add("日K",["2017/7/{}".format(i + 1) for i in range(31)],v1,mark_point=["max"],is_datazoom_show=True,datazoom_orient="vertical",
)

此外,还可以在图上画一些别的线,比如close价的最大值。

kline.add("日K",["2017/7/{}".format(i + 1) for i in range(31)],v1,mark_line=["max"],mark_line_symbolsize=0,datazoom_orient="vertical",mark_line_valuedim="close",
)

那么,接下来我们来看一下如何改进这个k先的绘制方法吧,我们从一个pandas开始。后面的代码就是笔者自己写的哦。

我们现在有一个pandas, 里面的数据如下:

还有一列ma10没有放上去,其实就是5日均线和10日均线。

def backtesting_plot(table_name, indicator_name_list):# data preparationda = pd.DataFrame(data=table_name)da['volume'] = da['volume'].apply(lambda vol: vol if vol > 0 else 0)date = da["datetime"].apply(lambda x: str(x)).tolist()k_plot_value = da.apply(lambda record: [record['open'], record['close'], record['low'], record['high']], axis=1).tolist()# K chartkline = Kline()kline.add("Backtesting Result", date, k_plot_value)indicator_lines = Line()for indicator_name in indicator_name_list:indicator_lines.add(indicator_name, date, da[indicator_name].tolist())# trading volume bar chartbar = Bar()bar.add("volume", date, da["volume"],tooltip_tragger="axis", is_legend_show=False, is_yaxis_show=False, yaxis_max=5*max(da["volume"]))# buy and sellv1 = date[10]v2 = da['high'].iloc[10]es = EffectScatter("buy")es.add("buy", [v1], [v2])v1 = date[18]v2 = da['high'].iloc[18]es.add( "sell",  [v1],  [v2], symbol="pin",)overlap = Overlap()overlap.add(kline)overlap.add(indicator_lines,)overlap.add(bar,yaxis_index=1, is_add_yaxis=True)overlap.add(es)overlap.render(path='tt.html')

我们看一下上面这个函数,首先我们从pandas中拿出数据,转换成pyecharts能接受的list格式。要提醒大家的是,这里的datetime也要转化成字符串格式。

然后就是实例化Kline和技术指标的Line

# K chartkline = Kline()kline.add("Backtesting Result", date, k_plot_value)indicator_lines = Line()for indicator_name in indicator_name_list:indicator_lines.add(indicator_name, date, da[indicator_name].tolist())

然后用bar来制作成交量。这样的话基本就形成了。

但是我们进一步希望能够在k线图上绘制出买卖信号发生的信息,也就是交易发出的时间点,那么我们用es来添加,这里随便使用了10和18天作为一个买卖时间点。

我们做了这么多的图怎么让他们一起显示出来呢?这里就要用到overlap了,也就是叠加的类。

    overlap = Overlap()overlap.add(kline)overlap.add(indicator_lines,)overlap.add(bar,yaxis_index=1, is_add_yaxis=True)overlap.add(es)overlap.render(path='tt.html')

我们最后来看一下结果怎么样:

可以说相当漂亮了。笔者圈起来的就是我们绘制的时候设置的buy和sell两个点。

pyecharts绘制K线相关推荐

  1. PyeCharts绘制K线图(续)

    接着上一篇文章<Pyecharts绘制K线图>,今天来继续完善所绘制K线图的内容.介绍如何实现股票成交量及标记信号的绘制. 一.成交量柱状图的绘制 成交量柱状图的绘制要用到Bar().其用 ...

  2. python画k线图_小白学Python(14)——pyecharts 绘制K线图 Kline/Candlestick

    Kline-基本示例 from pyecharts import options as opts from pyecharts.charts import Kline data = [ [2320.2 ...

  3. Pyecharts绘制K线图

    一.简介 Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可.而 Python 是一门富有表达力的语言,很适合用于数据处理.当数据分析遇上数据可视 ...

  4. pyecharts绘制K线图,并添加辅助线

    官方示例可以参考:https://gallery.pyecharts.org/#/Candlestick/kline_datazoom_slider 文章目录 绘制K线图 绘制有辅助线的K线图 绘制K ...

  5. 用pyecharts绘制K线图

    获取股票数据部分,方法很多.关键是后半部分,用非常简短的代码实现了K线图,pyecharts真强! from jqdatasdk import * import numpy as np from py ...

  6. Python绘制K线图之可视化神器pyecharts

    目录 K线图 概念 用处 K线图系列模板 最简单的K线图绘制 K线图鼠标缩放 有刻度标签的K线图 K线图鼠标无缩放 大量数据K线图绘制(X轴鼠标可移动) 每文一语 K线图 概念 股市及期货市bai场中 ...

  7. python能画k线图吗_,求教使用python绘制K线图

    如何用python实现视频关键帧提取并保存为图片 import cv2 vc = cv2.VideoCapture('Test.avi') #读入视频文件 c=1 if vc.isOpened(): ...

  8. pyecharts显示K线、均线、成交量和MACD

    安装 Ta-lib: pip install Ta-lib 安装pyecharts: pip install pyecharts npm install -g phantomjs-prebuilt 安 ...

  9. python 股票图表_k线图分析法_【趣味案例】用Python绘制K线图,一眼看清股市状况...

    本文介绍关于[趣味案例]用Python绘制K线图,一眼看清股市状况及神一般的裸k交易法,精髓就这三步,一目了然!精髓就这三步,一目了然!(附图解析)的相关内容. [趣味案例]用Python绘制K线图, ...

  10. python 窗体k线图_一眼看清股市状况之用Python绘制K线图

    前几天美股熔断,据悉这次熔断是自美股有熔断机制30年来第二次,成了头条新闻.对股票一窍不通的我也在此情此景进行了一波学习,股市的变化瞬息万千,有一种图可以用来清晰地反应一段时间内股市的变化情况,它就是 ...

最新文章

  1. python进程执行带有参数的任务(args、kwargs)
  2. 02Django入门仪式之Hello World
  3. 游戏里的角色都什么格式图片_为什么这游戏里别人的都是大白鲨,我却是小金鱼?...
  4. Java中 Iterable 和 Iterator 的区别
  5. Zookeeper:fsync超时导致实例异常
  6. C++/C中定义与声明的区别
  7. unitec理工学院 计算机,2020年新西兰留学Unitec理工学院计算机硕士课程全面解析...
  8. java 程序找错_JAVA程序找错~
  9. 福师《计算机应用基础》期末考试a卷数据是,2020年春福师《计算机应用基础》期末考试A卷附答案...
  10. kafka的延迟操作-pull操作详解
  11. python requests post请求_Python“requests”模块中的POST请求无法正常工作
  12. Linux下maven安装
  13. 最大子数组问题 时间复杂度为Θ(n)
  14. 【学术】论文返修时,能否增加作者或变更作者顺序?
  15. html5 游戏 响应式,关于html5:响应式游戏网页有什么特点呢
  16. 南繁水稻国家公园国稻种芯(三亚)水稻节功能性农业产业园
  17. Team System:基本 Power Tool 工具
  18. std::thread与pthread
  19. oracle报错1034,oracle数据库登陆报错ora-1034
  20. gateway整合https(自定义证书)

热门文章

  1. 高效工作-使用石墨文档进行信息收集
  2. 设计一个求直角三角形斜边长的函数
  3. Openjudge-NOI题库-出书最多
  4. 苹果官网iPad mini滚动动画实现原理探究
  5. cpu天梯图2022 cpu性能排行榜2022最新版
  6. 数据介绍与描述性分析——以NBA球员薪酬影响因素分析为例
  7. 雪球网基于沪深300的评论爬虫
  8. WIN10安装CUDA10 cuDNN
  9. Photoshop 更改图片颜色
  10. nginx启用reuseport