模型编写好后需要先对其进行效果测试,如果样本数据少,数据不精确,得到的测试结果就很难反映出模型的真实盈利效果。因此历史数据量和数据粒度决定了模型效果的测试深度,也反映出测试平台价值的高低。
检验趋势模型的效果,通常需要选择连续且全面的历史数据作为测试样本,如果测试的数据不够多,无法包含市场各个阶段的行情变动,模型效果的真实性就会大打折扣。wh9提供合约从上市以来的所有数据,可以多维度剖析模型。如下图,是以股指主连合约上市至今的全部数据进行的效果测试。
如下图所示,是如何在主图点击鼠标右键来申请合约数据:
模型回测需要计算每一笔历史交易的盈亏、回撤等进而得到收益率、最大回撤、胜率等我们关注的指标数据,这些数据如果全靠手动计算几乎是实现不了的。量化交易软件充分利用了计算机强大的运算能力,可瞬间出具含有众多参考项目的详细报告,分分钟就能检验模型好坏。
下图是一个分析报告的一部分,图中①④指标是我们通常最关注的数据,很多人会认为收益率高,胜率高的模型就是好模型,真的是这样的么?让我们再来看看图中的②③⑤衡量指标。
报告显示该模型在这段交易过程中,最大回撤高达1211300,最大回撤比已达到71%,说明这并不是一个稳定的模型。如此大的回撤一方面会在实盘中带来权益的锐减,另一方面也会使交易者的心态受到严重的影响。再看⑤指标,空头交易的盈亏比率较低,说明该模型的空头交易绝大多数是亏损的,在实盘交易中该模型的做空操作很可能成为短板。
所以在衡量一个模型的好坏时,我们要充分利用软件提供的测算报告,根据各个测算指标全面考量模型。
回测报告中的各项统计数据也为我们拟合一些其他的经典理论提供了数据基础和计算依据,可以更深层次的挖掘模型的隐含特性,全方位剖析模型效果。
例如著名的凯利公式:f* =(b*p -(1-p))/b (其中f* 为开仓最佳资金比例、b为模型的盈亏比率、p 为胜率)。我们从回测报告中可以直接得到胜率和盈亏比的数值,将这些数据代入到公式中进而得到该交易系统的最优开仓比例,投资者可以根据自身交易系统所计算出的f* 值乘以心理承受损失的比例去控制最大仓位。
如下图所示是如何进行模型的回测。
:设定信号计算起止时间。 | |
:设置回测参数,如初始资金,开仓手数,保证金,手续费等。 | |
:装入到模组后台运行,将k线图上回测的合约和模型加载到模组中运行。 | |
:查看回测报告 | |
:查看信号明细 |
测试天数 | 从回测数据开始到结束的自然日 |
测试周期数 | 从回测数据开始到结束的K线根数 |
信号个数 | 信号出现的总个数 |
执行信号个数 | 信号执行的总个数 |
信号消失次数 | 信号消失的总次数 |
初始资金 | 初始化的资金 |
初始资金使用率 | 手数*每手保证金率*第一个信号的开仓价*交易单位/初始资金 |
最大资金使用率 | 在持仓周期内(开仓保证金/当前权益)的最大值 |
平均资金使用率 | ((开仓保证金/当前权益)求和)/持仓周期数 |
杠杆倍数 | 杠杆倍数 = 最大资金使用率 / 保证金率 |
回测期间最大权益 | 回测期间最大的权益 整个测试过程中每个周期已缴保证金+剩余可用资金+持仓浮盈所得结果中的最大值 |
回测期间最小权益 | 回测期间最小的权益 整个测试过程中每个周期已缴保证金+剩余可用资金+持仓浮盈所得结果中的最小值 |
最终权益 | 包括当前的可用资金和浮动盈亏 |
收益 | 总盈利-总亏损(已扣除手续费) |
收益率 | 收益/初始资金 |
年化单利收益率 | 收益率/(测试天数/365) |
月化单利收益率 | 收益率/(测试天数/30) |
年化复利收益率 | (最终权益/初始资金)^(365/测试天数)-1 |
月化复利收益率 | (最终权益/初始资金)^(30/测试天数)-1 |
平均保证金收益率 | (单次交易收益/开仓保证金)求和/交易次数 =(Σ((每次交易盈利数值-手续费)/保证金))/交易次数 |
扣除最大盈利后收益率 | (最终权益-最大盈利-初始资金)/初始资金 |
扣除最大亏损后收益率 | (最终权益+最大亏损-初始资金)/初始资金 |
夏普比率 |
(年化单利收益率-无风险利率)/收益率的标准离差率 计算公式:夏普比率=[E(Rp)-Rf]/σp; 其中: E(Rp):年化单利收益率 Rf:无风险利率(大约是1.5%) σp:收益率的标准差率(年化标准差率)=标准差率/sqrt (测试天数/365) 标准差率=标准离差/初始资金 |
索提诺比率 |
(年化单利收益率-无风险利率)/下行收益率标准差 其中: 年化单利收益率=收益率/(测试天数/365) 无风险利率=1.5% 下行收益率标准差=下行标准差率/sqrt(测试天数/365) 下行标准差率=下行标准离差/初始资金 下行标准离差= n=交易次数 r=每次收益 =平均收益 if r<,f(t)=1 if r>=,f(t)=0 |
权益离散度 | 权益离散度=单次盈亏的平方和/交易次数,再开方 |
权益离散系数 | 权益离散系数=权益离散度/初始资金*100% |
权益最大回撤 | 从回测开始到结束,动态权益计算出来的波段从高点到低点回撤的最大值 |
权益最大回撤时间 | 权益最大回撤出现的时间 |
权益最大回撤比率 | (权益回撤/权益回撤时的权益)的最大值 |
权益最大回撤比率时间 | 权益最大回撤比率出现的时间 |
权益最长未创新高周期数 | 权益最长未创新高周期数 |
权益最长未创新高时间段 | 权益最长未创新高时间段 |
损益最大回撤 | 从回测开始到结束,动态损益计算出来的波段从高点到低点回撤的最大值(损益最大回撤是以持仓等于0时的资金为标准计算的) |
损益最大回撤时间 | 损益最大回撤出现的时间 |
损益最大回撤比率 | (损益回撤/损益回撤时的权益)的最大值 |
损益最大回撤比率时间 | 损益最大回撤比率出现的时间 |
损益最长未创新高周期数 | 损益最长未创新高周期数 |
损益最长未创新高时间段 | 损益最长未创新高时间段 |
本金风险率 | (初始资金 - 回测期间最小权益)/初始资金 |
年化收益风险比率 | 年化单利收益率/本金风险率 |
胜率 | (盈利次数+持平次数)/交易次数 |
*盈亏比率 |
盈利交易的平均每次盈利/亏损交易的平均每次亏损 平均每次盈利 = 总盈利/盈利交易次数 平均每次亏损 = 总亏损/亏损交易次数 |
*平均每次盈利 | 平均每次盈利交易的盈利=总盈利/总盈利次数(计算手续费) |
*平均每次亏损 | 平均每次亏损交易的亏损=总亏损/总亏损次数(计算手续费) |
*平均每次盈利/权益最大回撤 | 平均每次盈利/权益最大回撤 |
*平均每次盈利率/平均每次亏损率 |
平均每次盈利率/平均每次亏损率 平均每次盈利率 = SUM(单次盈利率) / 计算单次盈利率次数 平均每次亏损率 = SUM(单次亏损率)/ 计算单次亏损率次数 单次盈利率 = 上一次持仓为0到今次持仓为0期间的盈利占初始资金的百分比 (盈利/初始资金) 单次亏损率 = 上一次持仓为0到今次持仓为0期间的亏损占初始资金的百分比 (亏损/初始资金) |
*平均每次收益/平均每次亏损 | 平均每次收益/平均每次亏损 |
平均每次收益 | 平均每笔交易的收益=(总盈利-总亏损)/ 交易笔数(总成交量的 1/2) |
最大每手盈利 | 每手盈利的最大值(每手盈利:对于每次交易,用该次交易的盈利值除以这次交易过程中的成交手数) |
最大每手亏损 | 每手亏损的最大值(每手亏损:对于每次交易,用该次交易的亏损值除以这次交易过程中的成交手数) |
平均每手每次收益 | 平均每手每次交易的收益 |
总盈利/总亏损 | 总盈利/总亏损 |
总盈利 | 盈利的总和 |
总亏损 | 亏损的总和 |
*单次最大盈利 | 单次交易盈利的最大值 |
*单次最大亏损 | 单次交易亏损的最大值 |
单次最大盈利占比率 | 单次最大盈利/总盈利 |
单次最大亏损占比率 | 单次最大亏损/总亏损 |
收益/单次最大盈利 | 收益/单次最大盈利 |
收益/单次最大亏损 | 收益/单次最大亏损 |
*交易次数 | 发生交易的次数 |
*盈利次数 | 盈利的交易次数 |
*亏损次数 | 亏损的交易次数 |
*持平次数 | 持平的交易次数 |
*最大持续盈利次数 | 最大持续盈利的次数 |
*最大持续盈利次数出现时间 | 最大持续盈利的次数出现的时间 |
*最大持续亏损次数 | 最大持续亏损的次数 |
*最大持续亏损次数出现时间 | 最大持续亏损的次数出现的时间 |
空仓周期数 | 空仓的周期数 |
最长连续空仓周期数 | 最长连续空仓的周期数 |
*最长持仓周期数 | 持仓最长周期数 |
平均持仓周期数 | 平均多少根K线发生一笔交易=测试周期数/交易次数 |
*平均盈利持仓周期数 | 平均多少根K线发生一笔盈利的交易=测试周期数/盈利次数 |
*平均亏损持仓周期数 | 平均多少根K线发生一笔亏损的交易=测试周期数/亏损次数 |
平均持仓手数 | 每根K线的总持仓的累加 / 持仓周期数 |
最大持仓手数 | 在持仓周期内持仓手数最大值 |
平均资金使用金额 | 开仓保证金求和/持仓周期数 |
最大资金使用金额 | 在持仓周期内,开仓保证金额最大值 |
最大资金使用金额时间 | 在持仓周期内,最大资金使用金额的时间点 |
手续费 | 手续费合计 |
手续费/收益 | 手续费合计/收益 |
滑点损耗 | 滑点损耗合计 |
滑点损耗/收益 | 滑点损耗合计/收益 |
成交额 | 成交额合计 成交额=成交价*(开仓或者平仓手数)*交易单位 |
模型得分 | 根据盈利能力、稳定性、风险暴露、敏感度计算的综合得分 |
收益/风险: | ||
(1)损益曲线图 |
||
(2)权益曲线图 |
||
(3)损盈分布图 |
||
(4)损盈直方图 |
||
(5)权益回撤直方图 |
||
(6)连续亏损次数 |
||
浮动盈亏: | ||
(1)权益面积图 |
||
(2)浮盈面积图 |
||
(3)浮亏面积图 |
||
(4)浮盈分布图 |
||
(5)浮亏分布图 |
||
(6)浮盈直方图 |
||
(7)浮亏直方图 |
||
阶段分析: | ||
(1)月度统计 |
||
(2)日统计 |
||
效率分析: | ||
(1)总效率分布图 |
||
(2)建仓效率分布图 |
||
(3)平仓效率分布图 |
||
损盈分析: | ||
(1)胜率分析 |
||
(2)盈利分析 |
||
(3)亏损分析 | ||
(4)回撤分析 |
模型的效果受很多因素影响,如滑点、手续费、杠杆倍数等,我们将模型的这种特性称之为模型的敏感性。敏感性小的模型是更稳定、更好的模型。
将模型的敏感性绘制成图表,就可更直观的分析出模型的优劣。例如,在分析滑点对模型收益率的影响时,用横坐标表示滑点,纵坐标表示收益率,很明显滑点对收益率影响小的模型是更优的模型。
如下图所示,这是一个盈利的模型,也许40.92%的胜率和8.44%的最大回撤会让我们觉得这个模型还算可以,但这一定是一个好模型么?
让我们从一个二维关系去审视这个模型,看一下滑点和收益之间的关系:从下图可很明显的看出,滑点每增大一点,收益率就会大幅下降;当滑点为3个最小变动价位的时候模型已经失去了盈利能力。而实际交易的时候,我们很难做到0滑点,这个模型也就很难盈利。
分析报告得到的是各衡量指标的独立数据,而敏感性测试可告诉我们一些重要指标的变化对盈利、胜率等的影响,让我们深度了解模型的脾性。
敏感性分析横坐标提供手续费、滑点、开仓手数、杠杆倍数以及模型参数等影响因素;纵坐标提供收益率、胜率、平均收益、盈亏比率、平均每次收益/权益最大回撤、权益最大回撤比率、总交易次数和权益最大回撤指标。投资者可以根据策略的分析侧重点自由搭配组合,测算模型的敏感性。
如下图所示,是如何进行敏感性测试。
交易过程中有时会发现在一段时间内表现很好的模型,过了一段时间就好像失效了一样,这种情况是由于模型参数不再适应当前行情引起的,我们需要尽快寻找新的最优参数,而在海量的历史数据中仅凭人工去寻找如大海捞针,费时费力,机会渺茫。 "参数优化",可在指定的参数范围内用计算机很快筛选出最适合当前行情的参数。
下图是对螺纹品种跟踪止损策略模型的回测资金曲线。结束了小半年的单边上涨行情后,市场极速下跌进入调整形态,从图上可清楚的看到资金曲线在近下半年不再保持稳定上升形态,说明原来的止损价差参数已经不能适应现在的市场,模型已经失效。我们可以利用参数优化功能,对当前的参数进行优化,筛选出符合当前行情的参数组合。
下图是利用参数优化对模型的参数进行枚举和遗传后的结果。参数优化功能可以在指定的范围内利用计算机筛选出最适合当前行情的参数。在使用新参数后,黄色资金曲线更平滑稳定,新的参数更能适应市场行情,使模型真正达到顺势而为的效果。
① 先使用枚举功能,进行大范围海选,如下图所示是如何进行枚举:
设置参数关系减少参数优化时间:
有些模型各个参数间有严格的逻辑管理,以下面的回测模型为例:
Params
Numeric Length1(5);
Numeric Length2(10);
Vars
Numeric MA5;
Numeric MA10;
Begin
MA5=Ma(Close,Length1);
MA10=Ma(Close,Length2);
If(CrossUp(MA5,MA10))
BK;
If(CrossDown(MA5,MA10))
SP;
End
模型中的两个变量必然遵循一大一小规则,这样的模型我们可以首先为他们设置参数关系,如N1<N2,这样在优化时,所有比N2大的N1值都不用参加计算,运算量可以减少1/2.这样每配置一个参数关系,计算次数就减少一半;配置4个,就减少到原来的1/16,以此类推,有效减少了参数优化时间。
② 参数优化计算完会以排序的方式显示优化出来的参数组,可按下图步骤将优化后的参数保存至备选参数组或直接替换为默认参数组。
③ 如需对枚举的结果进一步精调,可在参数优化列表选择要优化的参数组->预览主图,如下图,用枚举出来的新参数对K线图回测,再对新参数进行遗传。
④ 如下图所示设置好优化的精调范围,参考标准的比重后,点击“确定”按钮,开始进行精调。
⑤ 按照和枚举同样的方法来保存精调后的结果,以便进行回测(如下图所示)。
⑥ 如下图,在K线图右键菜单->设置技术指标/量化模型->选择模型->调入参数,在参数界面选择参数优化后保存的参数组,使用新参数进行回测。
交易策略是不具备普适性的,我们很难构建出一个适用于所有合约的交易系统,但针对一个合约制定一个适合的模型则相对简单,同样的,针对一个模型也势必会存在一组最佳的交易合约。
软件的“批量回测”功能,可同步回测多个备选合约,快速出具各个合约的独立分析报告,投资者通过对比关注的收益指标便可快速挑选出符合策略的最佳合约。
比如,用同一个策略模型对上期所部分加权合约进行批量回测,筛选最佳交易合约。回测后每一个合约都生成一份独立的回测报告和独立的资金曲线图,投资者点击合约名称可切换回测报告分析,极大程度的简化了操作步骤。
如上图,是沪铜合约的回测资金曲线,盈利效果还算不错,那它是否就是最当前策略的最佳交易合约呢?当我们展开各指标项进行横向对比时,可以看到沪铜合约盈利率虽高,但是权益最大回撤竟高达62950,扣除掉最大盈利后的收益率已为负值,看来沪铜合约在测试期间的盈利并不稳定。
而沪锡收益率、盈亏比率、夏普比率等都是所有备选合约中最高的,回撤也是较小的,在测试阶段内一直保持着稳定的盈利效果,是当前策略最佳的交易合约。
如下图,优选交易合约后,可以直接一键添加到模组实际运行。
如下图,是批量回测的建立步骤。
“不要把鸡蛋放到同一个篮子中”,同理,我们在交易时也要避免单一品种或单一策略的运行模式,通过多合约、多模型组合的形式来合理分散交易风险,实现共振盈利。
单模型的回测只能看到一个模型的收益效果,如何才能查看一个策略组合的收益效果呢?软件的组合回测功能可对多模型、多合约组合进行回测,提供组合分析报告、资金统计和各类资金曲线分析工具,供交易者全面分析策略组合和各成员的盈利能力。
趋势行情下获利相对比较容易,趋势模型往往能够取得不错的回报,但在震荡行情下,由于趋势策略不能适应频繁波动的行情,反而会使盈利的资金回吐甚至反盈为亏,如下图。
对此,我们可以使用多模型组合的形式,在一个合约上同时运行趋势策略和震荡策略。如下图,是螺纹合约“趋势+震荡+波段”策略组合交易的回测效果,彩色线为组合成员的权益曲线,灰色线为组合整体的权益曲线。可见,在震荡行情下,震荡策略的盈利冲抵了趋势模型的亏损;在趋势行情下交易组合则共振盈利,实现了财富的双重增长!
如下图,是组合回测的资金曲线分析界面。右键菜单中还提供组合的权益资金曲线、净利润曲线、盈亏曲线以及资金详细信息等统计工具,帮助投资者深层分析组合的收益效果。
·权益资金曲线,记录每根K线上的权益波动;
·净利润曲线,记录平仓盈亏累加值的波动,每完整交易一次则统计一次;
·盈亏曲线,记录每根K线上的浮动盈亏累加值波动;
·资金详细信息,记录每根K线上的组合资金概况和组合中所有模型的具体交易信息,如下图,用户可结合合约明细和资金概况具体分析组合成员的盈利水平。
如下图,是组合回测的分析报告。利用各项指标将不可估量的市场风险量化展现给投资者,投资者可以此分析组合的风险-收益水平,调整交易组合,合理分散风险。
如下图,是组合回测的回撤贡献度分析报告。提供组合回撤贡献度和回撤比贡献度分析图表,计算组合成员的贡献度大小。投资者可以对得分较低的模型进行调整,提高组合整体收益和抗风险能力(回撤贡献度得分的计算方法详见本页常见问题7)。
如下图,是组合回测的阶段性分析报告。具体罗列了组合在各个周期阶段的交易和收益情况,方便投资者统计账户交易情况,进行风控管理。
如下图①-⑤所示是如何对组合策略进行测试:
期货是主力交易方式,为检验策略对主力合约的连续下单效果,一些投资者会将策略加载到主连上测试运行,这样便存在两个问题:
一方面,主连只是对主力合约数据的机械拼接,换月时产生的大幅跳空会影响信号计算; 另一方面,换月前后两个合约的持仓趋势可能发生改变,存在信号转换的风险,而无法体现出主力合约真实的连续交易效果。
针对这种情况,wh9特推出期货主连链回测,不再使用品种主连自身的K线数据计算信号,而是采用各个月份合约自挂牌以来的全部K线数据计算信号,规避品种主连K线数据换月跳空、新旧合约趋势相反等情况对量化计算准确性的影响,主力换月时,旧主力月份平仓,新主力根据月份合约的K线数据重新计算开仓信号。帮助投资者洞察策略效果,客观评价策略好坏。
模型中不写入Trade_Other语句,直接加载到品种主连上,系统会自动调用主连链回测。如下图,回测后在K线图上点击鼠标右键->模型回测报告,可查看策略在主力合约上连续运行的效果分析报告和资金曲线,供投资者分析策略连续交易的整体效果,便于调试交易策略,降低试错成本。
如下图,在2019年12月6日螺纹2001换月到螺纹2005时,2001合约是空头开仓信号,2005合约是多头开仓信号,换月时,系统对2001合约进行了平仓操作,并重新计算了05合约的开仓信号,规避了2005合约行情上涨的损失。
如下图,主连链回测还提供从信号计算开始时间到数据结束时间范围内,所有主力合约的独立回测报告和资金曲线。可查看到策略在每一个主力合约上的盈利效果,对策略在不同测试区间内分段调试。
注:
1、加载合约必须是主连合约;
2、模型中不能写有Trade_Other函数;
主连链回测机制:
主连链回测针对多个年度的主力月份合约进行连续交易的模型回测计算,用长期的历史数据验证策略的有效性。
主力换月时,回测计算的处理机制如下:
旧主力合约,清仓;
新主力合约,延续使用旧主力清仓后的资金,但是重新计算信号。
注:
主连链回测只能用于分钟、小时、日线周期;
主连链回测不支持运行优化函数;
主连链回测不支持外盘合约;
独立的算法交易模型通过挖掘盘口报价和逐笔成交数据,从极为短暂的市场变化中寻求获利,把交易策略应用到秒周期级别。这类高频率的下单策略在投入实盘使用前,往往需要进行更为精细的可行性分析。
Wh9的数据粒度可支持算法高频模型逐笔Tick精细回测,提供可视化的盘口算法模型回测平台,直观展现每一笔的下单情况和资金变动,为投资者提供精准的策略检验。
wh9支持虚拟撮合的回测平台,帮你验证模型好坏。wh9的虚拟撮合机制既考虑到了委托价等于对手价时,对手盘挂单量不足,部分成交的情况,同时,当委托价等于排队价时,还会计算挂单成交比例,按比例撮合成交,虚拟真实交易过程。
如下图,软件提供可视化的盘口算法模型回测平台,能够同时展示TICK数据变化、持仓信息、挂单详情以及权益曲线变化过程。
回测后,提供360度视角的多维度回测报告,如下图,用户可结合模型回测报告、回测交易明细以及回测运行日志,详细的了解模型的虚拟交易效果,360度的了解自己的模型。
在tick图界面上,加载独立的算法交易模型,即可对算法模型进行逐笔tick回测计算。
点击鼠标右键,可切换算法模型回测日期、调整回测速度、查看模型回测报告、回测交易明细以及回测运行日志等操作。
(1)算法交易模型逻辑检测仅支持独立的算法交易模型类型;
(2)算法模型回测界面由左侧的tick图和右侧的持仓列表、挂单列表、资金曲线图组成:
①回测期间,显示买卖1-5档价格线,红线为买价,绿线为卖价;
②回测期间,在tick图上用射线显示现有的挂单,左边起点是挂单的时间点,红色为买挂单,绿色为卖挂单;实线为开仓挂单,虚线为平仓挂单;
(3)回测完成时,撤所有挂单,挂单射线和挂单列表也会清空;
(4)算法模型回测的合约,由Data数据区、Def_TickData和主图合约组成,包括国内外期货、套利和股票。
文华精选期货因子库囊括量价、动量、期限结构、持仓、基本面、BETA等一系列因子,以期货市场全品种为标的,提供单因子筛选、多因子排名分析等功能。可借助多因子综合排名信息,对多个品种在同一时间点的强弱情况进行对比分析,构建对冲组合,实现期货横截面交易策略。
横截面策略是一种泛套利策略,主要是指的是在同一个时间点(或者同一个时间区间),同时做多、做空多个品种,形成一个多空对冲组合,以期多空两个方向交易的盈利之和为正的一类策略。
横截面策略盈利的逻辑是基于期货价格的变动:强者恒强/弱者恒弱的假设,即期货价格具有一定惯性,趋势行情具有延续性,前期上涨幅度较大的合约,后期还能够继续上涨的概率更大。
例如:使用期货品种筛选功能,对市场所有的期货品种按照涨跌幅和资金流向进行排序,根据综合排名结果做多前5的品种,做空后5的品种,形成一个对冲组合,买入上涨强势的品种,卖出处于弱势的品种进行对冲获利。
如下图,一周以后,共盈利639950元,收益率5.18%。
如下图,点击右上角菜单【量化】->期货多因子分析。
注:
① 多因子分析使用上一交易日的数据计算;
② 根据因子所选方向排序,并列排名时,下一排名需要加上并列排名个数;
③ 并列排名的品种,按代码顺序展示;
④ 空值排到最后,并列排名。