商品期货量化交易-TradingviewPine语言基础课程(二十二):量化交易回测系统

Author: ianzeng123, Created: 2023-04-03 16:28:18, Updated:

大家好,在上述的课程中,我们详细介绍了如何使用Pine语言开发一个交易策略。 然而一个新开发出来的交易策略, 需要全方位检测才能应用于实战,同样一个优秀的策略也是在试错中不断改进得以产生。量化交易回测的目的是还原交易过程,进而验证策略的逻辑和可行性,所以回测的准确性尤为重要。在以往的课程中,我们对于回测的解读只有一个指标,预估收益,然而,预估收益并不是唯一的指标。在实际的交易中,我们需要考虑多个指标来评估一个策略的优劣。今天我们来详细了解一下量化交易的回测系统。

回测报告

量化交易与主观交易的重要区别之一是量化交易能够通过历史数据回测得出绩效报告,交易者可以从中发现策略的缺点并进行优化改进。然而,要正确评估策略并进行优化改进,必须了解回测参数设置和绩效报告,并正确解读它们。只有这样才能知道策略需要改进的方向。

回测配置参数

即使是相同的策略,回测配置参数不一样,也会影响最终的回测结果。在解读回测绩效报告之前,先来看下回测配置,上图是发明者量化软件的回测界面, 这里我们需要注意的几个参数的解释说明如下: img

  • 回测开始时间和回测终止时间,这两个时间段确定回测的时间,对于实盘策略的确定具有重要的意义,因为在疫情时代和后疫情时代,策略的功效可能具有极大的差别。
  • 数据周期, 可以选择: 天、 小时及分钟的任意数值,这个确定了策略的执行周期,对于日内的交易策略,可以选择分钟或者小时,而对于长期的趋势策略,可以选择小时或者天数。
  • 回测数据级别,可以选择: 模拟级 Tick 和实盘级 Tick;执行方式可以选择:实时价模型和收盘价模型,这部分的内容我们在模型执行那里进行了详细的介绍,大家可以重温下。
  • 策略外部参数:参数调参的时候会使用到,最小值,最大值,步长。
  • 滑价点数,我们也提到过,因为期货实盘是瞬息万变的,确定好交易的信号,但是交易的价格可能和需要的不一致,所以回测系统中通常会设置一个滑价点数,表示交易价格允许偏离预期价格的最大点数。
  • 品种代码:期货的品种代码是用来区分不同的期货合约的标识符。比如玻璃的代码为FG,螺纹钢的代码为rb等等,这里需要注意的是,代码是区分大小写的,郑商所的期货品种都需要大写;品种代码字母过后还需要填写一定的数字,因为期货是按照周期交割的,比如FG305是玻璃期货的2023年5月份的合约,如果日志信息报告期货品种错误,可以打开期货交易软件,查询准确的合约代码。如果想省力,可以直接填写后缀888,代表主力合约,在策略执行期间,系统会帮你自动移仓。

回测报告参数

一个盈利率高、胜率高的模型并不一定就是一个好模型。衡量策略好坏的指标需要考虑多方面因素,以下是一些重要的参考指标:

img

  • 累计收益

累计收益是指在一段时间内某个投资产品或投资组合的总收益。它是通过将所有的收益加起来计算得出的。

  • 年化收益率

年化收益率表示投资期限为一年的理论收益率,日收益率、 月收益率、 季度收益率都可以换算成年收益率。如果一个策略回测的日收益率是 0.01%, 那么年化收益率是3.65%。其计算公式为: (收益 / 本金) / 投资天数 * 252 ×100%。

  • 年化波动率

波动率是衡量策略风险的指标之一,它是描述策略资金曲线的涨跌幅程度,是对策略稳健性的衡量,也反映了策略风险水平。 其计算方式为:最高价减去最低价的值再除以最低价所得到的比率,年化波动率就是每日波动标准差的年化。

  • 最大回撤比率

除了波动率外,更能直观反映风险绩效指标就是最大回撤率。 它是统计资金曲线任意周期内最高点到最低点时的回撤幅度的最大值。它是描述策略可能出现的最糟糕情况。最大回撤是一个重要的风险指标,对于量化交易而言,该指标甚至比波动率还重要。

  • 夏普比率

回撤意味着风险,也意味着波动,正确的方式是将收益率和风险都考虑在内,也就是说不但要考虑收益率,更要考虑每承担每一单位风险所产生的超额收益。夏普比率就是一个对收益和风险综合考虑的指标。其公式为:(策略收益率-无风险利率)/策略收益率的标准差。每个策略回测都可以计算夏普比率, 如果值为正数, 则表示策略收益大于策略波动风险; 如果值为负数, 则表示策略波动风险大于策略收益。也就是说在设计策略时要考虑风险,尽量用最小的风险换取最大的回报。

回测陷阱

量化交易回测虽然可以快速验证策略在历史数据中是否有效,但很多时候回测并不代表未来能盈利,回测看起来非常好的策略,往往实盘表现不佳。因此需要在策略设计过程中规避回测的陷阱, 才能让策略回测反映真实的结果。

  • 未来函数

未来函数就是利用了未来的价格,交易策略如果包含未来函数,在实盘运行时回造成信号闪烁的问题。比如有一个策略逻辑时这样的:当收盘价大于开盘价就买入,当收盘价小于开盘价就卖出。这在回测时是没有问题的,因为收盘价是已经完成,固定不变的数据。但是在实盘交易中,收盘价只有在收盘的时候才能固定下来,所以程序会把当前的最新价格当作收盘价,这种利用未来价格的策略,会导致买卖信号频繁出现和消失。如果一个策略的买卖点不是固定的,回测的数据也是没有意义的。如何避免使用未来函数?最简单的办法是使用滞后的价格,可以把这个策略条件修改为:当上根K线收盘价大于开盘价就买入,当上根K线收盘价小于开盘价就卖出。因为无论是在回测中还是在实盘中,上根K线始终是已经完成的,这样就可以保证回测与实盘保持一致。

img

  • 偷价

相反偷价是利用了已经过去的价格,偷价并不会造成信号频繁出现和消失,但是会造成信号无效。比如有一个策略逻辑是:当收盘价大于开盘价就在开盘时买入,当收盘价小于开盘价就在开盘时卖出。显然这个策略条件在实盘时是不能成交的,当收盘价出现时,开盘价早就过去了。但是在回测中,程序是会以开盘价买入卖出的,这相当于在原本的资金曲线上叠加了一条斜率为正的直线会造成一种非常夸张的回测资金曲线。为避免这种情况发生,编写完策略首先要检查策略逻辑,如果策略回测的收益曲线非常平滑,回撤极小,就要警惕了。尤其是策略逻辑存在隐蔽性偷价行为,务必在实盘之前先用仿真交易测试一段时间。

  • 成本冲击

实盘交易中为了保证订单能及时成交,通常需要用对手价或者市价下单,商品期货买一价和卖一价至少相差一个点差,如果是交易不活跃的期货合约就需要更多的点差成本。或者当自己的订单量超过市场现有的订单量时,就会造成自己的订单消耗了市场流动性,触动价格朝向不利于自己的方向移动,使交易成本进一步上升。不仅如此,手续费、极端行情、软硬件系统、服务器响应、网络延迟都会增加实盘的交易成本。尤其是交易频率比较高的策略对受市场冲击成本更大,为了让回测更接近实盘环境,折中的办法是在回测时加上固定2跳左右的滑点。

img

  • 幸存者偏差

回测也有运气的成分,有时候的回测结果可能这个策略刚好适应了历史数据,再换几个参数或者回测品种就不一定有这么好的结果了。因此回测良好的策略,需要在实盘上进行模拟,确定效果较好才可真正应用于实盘。

img

  • 过拟合

过拟合是统计学中的术语,它是指过于精确地匹配数据特征, 以至于无法在其他数据中良好地拟合,量化交易中的过拟合是一种回测时表现很好, 实盘中表现较差的现象。

img

由于商品期货历史数据有限,所以过拟合问题就更加严重,尤其是对于中低频策略来说,几乎不可能完全避免过拟合,但可以利用下面几种方法来减少拟合:

  1. 减少核心参数
  2. 简化处理逻辑
  3. 增加数据样本
  4. 样本内外测试

更多内容