JQData + matplotlib 实现回测日志的交易细节可视化

做量化交易的朋友都知道回测的重要性,回测结果是衡量一个量化交易策略是否靠谱的重要依据。回测平台会按历史行情数据模拟成交,并将回测结果汇总成报告。

在很多时候,仅有一份回测的最终结果是不够的。比如说当我们发现结果不符合策略的设计预期时,就需要对部分或全部股票的买卖操作进行检查确认。通常我们要翻阅回测平台给出的回测日志,找到有待检查确认的买卖交易,根据其品种、时间周期和交易时间翻查当时的历史行情,而这时又往往需要打开第三方行情软件,输入该品种的交易代码,调整K线图到特定的时间周期(比如60分钟图),再在时间轴上定位至相应的日期,然后查看该笔交易发生当时的行情走势是否符合你的策略预期。整个过程操作起来很麻烦,如果你的电脑只有一个显示屏,还得在回测平台和第三方行情软件之间来回切换,效率极低。

通过解析回测日志,可以提取出交易代码和交易时间等信息,再利用JQData的本地数据下载功能,结合matplotlib这一常用绘图工具库,可以实现自动获取行情数据然后在屏幕上绘制相应的K线图,并直接定位到图上的特定日期附近,这样就能快速方便地可视化复盘回测日志中的每笔交易,直观地来检验每一笔交易是否符合预期。

整个项目全部用python语言来编写,以下分几个部分简要介绍实现的方法:

 

一.解析回测日志:

在策略的代码中可以加入日志信息来详细记录每笔买/卖操作,比如像这样:

买入:log.info("Buying %s" % (security))
卖出:log.info("Selling %s" % (security))

如此一来,JoinQuant的回测日志中将会包含每笔买卖操作的详细信息,回测结束后在“日志输出”一栏下面可以找到很多买入,卖出的日志信息,例如:

2017-06-20 09:30:00 - INFO - Buying 000002.XSHE
2017-06-26 09:30:00 - INFO - Selling 000002.XSHE

将这些日志依照横线和空格等特征关键字split之后,可以很容易的提取出时间、买卖方向以及品种代码等有用的信息。

注意:如果你想使用来自其他回测平台的日志,可能还需要将提取出的品种代码转换为JQData兼容的格式,JQData提供了一个API可以实现这种转换:normalize_code,详见官方文档。

考虑到回测日志可能包含很多次的买入和卖出,所以还设计了连续输入模式,并做了一定的容错处理,可以将多行日志一次性复制粘贴进来。

 

二.获取数据:

提取出交易代码和时间等信息之后,就可以调用JQData的get_price函数获取该股票的历史行情数据。get_price函数的参数较多,其中security是必填的,即股票的交易代码(JQData格式)。start_date和end_date两个参数为股票的上市和退市日期,可以通过get_security_info函数查得。然后根据策略运行的频率选择frequency参数,如果是日线的话就用默认值'daily',参数fq使用默认值’pre’即前复权。注意一定要加上skip_paused=True,来跳过停牌时期。

除了历史行情数据之外,聚宽还提供了财务数据、经济基本面数据以及一些特色因子数据等,可供下载。如果你的策略中用到了这些数据,希望在复盘时与行情数据一并展示,可以调用JQData提供的相应API来获取。

参考API文档>>

 

 

三.绘图:

有了数据,接下来就可以绘图了,这里我们用到了matplotlib以及它的一个扩展库mpl_finance来实现。如果是初次使用的话需执行以下命令安装:

python -mpip install -U matplotlib
python -mpip install https://github.com/matplotlib/mpl_finance/archive/master.zip

使用时需在代码中导入相应的module

import numpy
import matplotlib.ticker as ticker
import matplotlib.pyplot as plt
from mpl_finance import candlestick_ohlc

首先创建一个figure,采用3x1栅格布局(grid)

fig = plt.figure()
grid = plt.GridSpec(3, 1, hspace=0.15)

上方主图占2个grid,下方副图占1个grid,两者共享X坐标轴,底部适当留出空白

main_ax = plt.subplot(grid[0:2,0])
    extra_ax = plt.subplot(grid[2,0], sharex=main_ax)
fig.subplots_adjust(bottom=0.2)

接下来先画主图,主图显示K线和买卖点

candlestick2_ohlc(main_ax, o, h, l, c, width=0.6, colorup='red', colordown='cyan')

main_ax为subplot返回的主图Axes实例,o、h、l、c分别为开高低收数据序列,阳线颜色用红色,阴线用青蓝色,与国内行情软件通常默认的设置一致。

然后根据日志中提取出的买卖方向和时间信息,在主图上用箭头标注出相应的买入点和卖出点。

extra_ax.arrow(x, y, 0, dy, color=clr, width=0.4)

x和y为箭头起点的坐标,dy为y轴方向箭头的长度,由于箭头方向只可能是向上或者向下,所以x轴方向长度dx为0,clr为箭头的颜色,向上箭头和向下箭头可以被设置为不同的颜色,width是箭头的宽度,设置为0.4。

主图下方为副图,可跟据策略的具体需要安排显示的内容,比如偏重技术分析的可以显示成交量或其他一些副图指标,偏重资金面的话可以显示主力资金流向或龙虎榜数据等信息,偏重基本面的可以显示财务指标等。通过JQData提供的丰富的API可以方便地获取这些数据,再用matplotlib的bar, plot等函数展现出来。

以成交量为例,先声明两个列表分别表示柱子实体颜色和边框颜色:

    c=[]
    ec=[]

然后遍历一遍成交量,当前K线的成交量大于前一根的,边框设为红色,实体设为黑色。当前K线成交量小于前一根的话,边框和实体都设为青蓝色:

    for i in range(n):
        if i == 0:
            c.append('black')
            ec.append('red')
        else:
            if v[i] > v[i - 1]:
                c.append('black')
                ec.append('red')
            else:
                c.append('cyan')
                ec.append('cyan')

最后调用bar函数,传入x轴坐标、成交量、实体颜色以及边框颜色等4个数列:

    extra_ax.bar(range(n), v, color=c, edgecolor=ec)

绘制出来的效果是这样子的,图中白色和黄色的箭头指出了策略的买点和卖点,一目了然:

JQData + matplotlib 实现回测日志的交易细节可视化_第1张图片

你可能感兴趣的:(JQDATA,jQdata)