【历史文档】策略回测-回测模块详解
由clearyf创建,最终由small_q 被浏览 2007 用户
更新
本文内容对应旧版平台与旧版资源,其内容不再适合最新版平台,请查看新版平台的使用说明
新版量化开发IDE(AIStudio):
https://bigquant.com/wiki/doc/aistudio-aiide-NzAjgKapzW
新版模版策略:
https://bigquant.com/wiki/doc/demos-ecdRvuM1TU
新版数据平台:
https://bigquant.com/data/home
https://bigquant.com/wiki/doc/dai-PLSbc1SbZX
新版表达式算子:
https://bigquant.com/wiki/doc/dai-sql-Rceb2JQBdS
新版因子平台:
https://bigquant.com/wiki/doc/bigalpha-EOVmVtJMS5
\
导语
不熟悉BigQuant平台的回测机制,可能使刚接触BigQuant平台的小伙伴有些困惑,不知该如何编写策略。当使用某一回测平台时,如果不能对其回测处理机制了解清楚,我们很可能出现偷价漏价、未来函数等问题,这些问题对策略的影响是致命的。即使不出现这样的问题,很多时候,用户可能写的策略并没有达到预期的目的,因此了解回测机制非常重要。
事件驱动机制
在策略回测中应用最为广泛的就是 事件驱动机制。先看定义:某个新的事件被推送到程序中时,程序立即调用和这个事件相对应的处理函数进行相关的操作。举个“栗子”让大家更好理解。
比如开发一个股指策略,交易程序对股指TICK数据进行监听,当没有新的行情过来时,程序保持监听状态不进行任何操作;当收到新的数据时,数据处理函数立即更新K线和其他技术指标,并检查是否满足策略的下单条件,如果满足条件就执行下单。
BigQuant平台的回测机制就是事件驱动机制。因为用户分析的数据是股票、期货等交易数据,这类数据的一个很大特点就是本身是标准化的时间序列数据,在各个交易软件上也是以K线的形式呈现,K线包含了交易的开盘价、最高价、最低价、收盘价。如图1所示:
BigQuant平台回测机制是 把每一个K线当做一个事件,按照时间发生先后顺序,即从左往右依次运行。 在新的事件发生时,即出现了包含高开低收四个价格的K线,回测程序会调用这个K线的数据,如果没有触发策略信号,就什么也不做,如果触发了交易信号,则产生订单。
为了避免未来函数,即在产生订单的时候不使用未来数据,只能使用当前能够获得的数据,BigQuant平台进行了如下处理:当产生订单时,只能在下一个K线上完成订单成交,这样就能避免未来函数的问题,同时也能更加逼近现实真实情况,因为很多时候,当某根K线发出交易信号时,用户只能在下一个K线上成交订单。不仅如此,为了控制订单以某个预期的价格成交,还可以设置成交价格,最为常见的就是设置订单价格是下一个K线的开盘价。
了解BigQuant回测机制
先看BigQuant回测机制的概览图(图2):
函数解释
BigQuant平台回测主体有两个使用频率很高的函数:initialize函数和handle_data函数,理解了这两个函数开发策略就再也不是什么难事了,结合上面K线图来理解这两个函数(如图3)。
从图中可以看出,其实一共有26个事件,即26根K线,第一根K线既对应黑色箭头,又对应灰色箭头,其余都只对应灰色箭头。回测主体函数的initialize函数只在第一个事件上调用,即第一根K线,因此很多初始设置可以放在initialize函数里面。每个K线都对应灰色箭头,表示每个事件都会调用handle_data函数,即从第一根K线到最后一根K线都会运行handle_data一次,于是很多策略逻辑部分就可以放在handle_data里。不知道这样解释大家是否能够更容易理解?
订单撮合顺序
通常开发策略时,先执行卖出操作,然后执行买入操作。 BigQuant交易引擎沿袭了策略编制习惯,优先撮合卖单,然后再撮合执行买单,在撮合买单时会比对可用现金和买单所需的金额,如果可用现金不足则会自动缩减买入股票数量。 模拟交易和回测中先撮合卖单后再撮合买单,这个撮合顺序是一致的。 撮合时显示的时间和价格是根据设置的买入价和卖出价决定的,例如如果设置买入价为open,则交易记录会显示买单的执行时间是9:30价格是当日的开盘价。
回测概览图
简单策略开发
本文策略案例位于文后,可以克隆参考
新建可视化空白策略
由于BigQuant提供的是提供在线的Notebook云端研究平台,因此在首页点击“编写策略”按钮就进入个人账户页面,然后点击左上角的添加按钮(“+”)新建一可视化空白策略。
设置股票池和回测起止时间
拖入证券代码列表模块,并设置回测起止时间,以及股票池范围。本例设置为贵州茅台600519.SHA,回测起止时间为2014-01-01~2017-12-31
设置回测模块交易逻辑
拖入Trade回测模块并连接证券代码模块。
我们点击Trade模块,可以看到右侧的属性栏,属性栏中可以设置策略基本参数:成交率限制、初始资金、买入点、卖出点、回测采用的价格模式。
- 成交率:允许买入/卖出的金额占股票当日总成交额比例,如果设置成较小值例如0.000002则订单会部分成交。
- 买入点、卖出点:策略买入/卖出时采用的价格,可以分别设置为开盘价/收盘价。
- 初始资金:根据需要策略设置。
- 自动取消无法成交订单:勾选后会根据股票涨跌停、停牌、成交率等状态判断能否买入/卖出来模拟真实交易环境。
- 回测价格类型:真实价格/后复权价格,回测所采用的价格类型。回测时选择真实价格与后复权价格的结果一致,选择真实价格时会有除权派息等信息的输出提示。选择后复权价格时,模拟交易系统提示的下单量与策略下单量会存在差异,建议模拟交易时采用真实价格。
- 回测产品类型:目前支持股票、期货等品种,根据回测需求进行选择。
此外可以看到,Trade模块属性栏中还包含了主函数、数据准备函数、** 始化函数和盘前处理函数**。这些函数通常需要传入context和data对象。
如下图结构所示回测模块由四个重要函数和两个关键对象组成。
\
- 在初始化函数中通常会设置手续费、滑点和全局变量。
- 在数据准备函数中通常计算技术指标或每日买卖列表。
- 主函数中通常编写策略的每日交易逻辑。
- 盘前处理函数中通常编写订单管理逻辑
运行策略
直接点击运行就可以让策略跑起来,当回测完成时,系统会输出包含各种指标的收益曲线图
回测结果解读
收益概况
收益概况以折线图的方式显示了策略在时间序列上的收益率,黄色曲线为策略收益率。同时也显示了沪深300收益率曲线作为比较基准,蓝色曲线为基准收益率。同时,最下面的绿色曲线为持仓占比,持仓占比即仓位,10%的持仓占比表示账户里股票价值只占10%。相对收益率的曲线并没有直接绘制在图上,点击图例 相对收益率(如下图所示),就可以将其绘制出来。
不仅如此,衡量一个策略好坏的关键指标在收益概览页面也得到展示。
- 收益率:策略整个回测时间段上的总收益率。比如,如果收益率为30%,表明起始时间是1万的本金,结束时间本金就变成1.3万了,一共赚了3000元。
- 年化收益率:该策略每一年的收益率。比如,如果回测时间段为2年,总收益率为30%,那么每年的年化收益率就在15附近(不考虑复利)。
- 基准收益率:策略需要有一个比较基准,比较基准为沪深300。若基准收益率为15%,表明在整个回测时间段,大盘本身就上涨了15%,如果策略收益率小于基准收益率,说明策略表现并不好,连大盘都没有跑赢。
- 阿尔法:衡量策略的一个重要指标,该值越大越好。
- 贝塔:衡量策略的一个重要指标,该值越小越好。
- 夏普比率:衡量策略最重要的一个指标,该指标的计算不仅考虑收益率,还考虑了风险,因此比较具有参考价值,可以理解为经过风险调整后的收益率。
- 胜率:衡量策略盈利一指标,胜率越大越好。比如10次投资中有8次获利,胜率就是80%。
- 盈亏比:衡量策略盈亏能力大小比较,盈亏比越大越好。比如投资盈利时,平均每次盈利4元,亏损时,平均每次亏损2元,那么此时的盈亏比为2。
- 收益波动率:收益率的标准差,是风险的一个指标。
- 最大回撤:策略在整个时间段上亏损最严重的时候相比净值最高值下跌的百分比。如果最大回撤为20%,表明策略在某个时间点上,相比之前的净值最高点下降了20%。最大回撤是策略评估时非常关键的一个指标,通常与风险承受能力相关。
- 信息比率:信息比率也是一个常用的策略评价指标。
交易详情
交易详情主要显示了策略在整个回测过程中每个交易日的买卖信息。包括买卖时间、股票代码、交易方向、交易数量、成交价格、交易成本。
每日持仓及收益
每日持仓及收益主要呈现每日持有股票代码、当日收盘价、持仓股票数量、持仓金额、收益等指标。
输出日志
输出日志主要为策略运行过程中的一些日志。包括涨跌停股票不能交易、停牌估计不能交易等。该日志可以便于我们检查回测结果的正确性。
回测报表数据
通过回测模块.raw_perf.read_df()查看回测报表详细数据。例如回测模块是m2,通过如下代码查看回测报表数据:
m2.raw_perf.read_df()
\