以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  金字塔软件问题提交  (http://weistock.com/bbs/list.asp?boardid=2)
----  【技巧贴】后台程序化精细化测评常见问题汇总  (http://weistock.com/bbs/dispbbs.asp?boardid=2&id=156505)

--  作者:雪梨
--  发布时间:2017/8/3 22:19:24
--  【技巧贴】后台程序化精细化测评常见问题汇总

      金字塔在4.0版本推出后台精细化测评功能后,解决了多年来后台程序化用户无法进行策略测评的一大问题,但是在使用过程中也暴露出一些常见的使用上的问题,这里我们将客户遇到的大多数常见的后台测试问题逐一进行解答。

 

问题1 图表和后台精细测评的主要区别在哪里?

      这里就涉及到关于后台程序化精细测评的理解误区,很多用户会想当然的认为后台程序化测评是普通测评系统的代替版,这其实是不对的,用户的策略还是应该在传统的基于图表的理论持仓的交易基础上进行编写和测试以及优化的,后台程序化测评并不能代替传统程序化的测评。

      那么后台程序化到底该什么时候用到?

      1)用户的策略经过传统测试和优化以后需要转化为后台程序化后,测评一下在后台程序化的表现,节省客户通过实盘才能测验的大量时间。

      2)需要测试挂单、撤单等这些平时只有在实盘交易才能测试到的实战技法,传统测试环境无法提供的。

      3)部分使用固定轮询模式的客户,想测试盘中逐笔数据触发时的模型闪烁情况表现等。

      测试后台程序化的步骤建议

      1)首先应该根据需要测试的品种周期进行数据补充工作,补充完毕后建议进行进行数据检查,方法:右键该品种->数据->相应的周期,若不熟悉数据补充及数据结构,请至新手乐园中的 软件常见问题 其中的问题 6、7、8、9、10

      2)由于后台测评速度较传统速度慢,切忌上来就用长时间测试,这样会浪费掉大量的测试时间并影响排错进度,应该选择尽可能短的周期测评,并检查测评结果,与传统的测评进行结果和交易明细的比对,若有问题则继续改进后台程序化代码,直至结果满意,然后再放大测试长度然后再对比,直至结果都满意后,最后再用长尺度数据长时间测评。

 

问题2 为什么我的后台精细化回测与图表不一致?

      出现不一致情况后,我们通常的解决方案是将图表程序化回测报告中的交易明细和后台的明细逐一比对,我们强烈建议从第一条开始比对,以从中找出不匹配的原因,通常来讲不匹配的大致有如下几种情形:

    1)信号从第一条就在开仓点不一致。

         重点检查:1.图表测评的起始交易时间是否与后台测评一致,是否勾选“严格使用时间段数据测试”选项。2.复权方式是否存在图表复权测试但是后台没有勾选复权模式测试。

    2)信号第一条能对上,但是盈亏金额不一致。

         重点检查:1.合约费率设置是否存在不一致,图表测评我们强烈建议使用“品种预设费率”选项,并在交易菜单->合约信息设置 功能中设置好品种分类相关费用。

    3)后台测试结果比图表测试晚一个周期。

         重点检查:1.如果入场价格和盈亏都能对上只是时间不一致,那是因为后台是实际的下单K线时间,而图表测试是信号发出时间,在这种情况不影响绩效结果。2.如果入场价格也不一致,说明图表测试和后台测试使用的运行模式不同,你需要相应修改图表公式的下单控制符以确保跟后台测试对应上,这个问题我们将在下篇做重点介绍。

    4)部分交易记录能对应上,但是部分交易记录对应不上。

         重点检查:1.后台程序化设置中“使用指定数量数据刷新”选项中的设置数据量,比如你的模型中用到了MA(CLOSE,100);那么你就至少需要设置100根数据才能满足基本的计算,如果用到了EMA这种带有递归计算性质的函数,至少需要倍的数据量才能让函数返回值趋于稳定。2.由于后台是模仿真实交易的撮合成交机制,在指令处理上也有所不同,比如在同一根BAR上开仓又马上平仓,图表的指令会给予成交处理,但是后台指令上是不能成交,因为你委托下单到成交有个时间过程。这时用户可以在测试报告的“委托明细”一栏看到会有不能成交的委托标记。

 

问题3 使用走完K线与固定轮询模式图表和后台策略的对应关系?

         图表交易为了满足用户不同的策略交易要求在下单入场时有2种下单模式:1.本周期入场控制,比较常用的如THISCLOSE,MARKETR。2.次周期入场控制,比较常用的如NEXTOPEN,MARKET。提供这2种控制模式主要目的是让图表策略在回测时能尽量的体现出 固定轮询和走完K线 2种不同的实盘下单模式。但是在后台交易语句中则没有这2种模式的区分,固定轮询模式和走完K线模式的选择完全靠后台交易设置中的运行选项来决定。这就带来一个问题,如果我们图表的下单语句是用THISCLOSE本周期下单,而后台使用走完K线模式回测,那么势必带来2个交易系统在出入场位置上的不一致(一个是本周就下单一个是次周期下单),解决方案唯有修改图表交易的交易控制符,我们以常用的图表和后台混合编程模式的代码范例,为客户提供2种一致化测评的解决方案示例代码:

 

      固定轮询模式


MA1:=MA(C,3);
MA2:=MA(C,5);

 

BUYCOND:=CROSS(MA1,MA2);
SELLCOND:=CROSS(MA2,MA1);

 

TSELL(HOLDING>0 AND SELLCOND,HOLDING,MKT);//要将后台的下单代码放图表下单代码前面
SELL(HOLDING>0 AND SELLCOND,HOLDING,THISCLOSE); //本周期下单控制

 

TBUY(HOLDING=0 AND BUYCOND,1,MKT);
BUY(HOLDING=0 AND BUYCOND,1,THISCLOSE); //本周期下单控制

 

     走完K线模式

 

MA1:=MA(C,3);
MA2:=MA(C,5);

 

BUYCOND:=CROSS(MA1,MA2);
SELLCOND:=CROSS(MA2,MA1);

 

TSELL(HOLDING>0 AND SELLCOND,HOLDING,MKT);//要将后台的下单代码放图表下单代码前面
SELL(HOLDING>0 AND SELLCOND,HOLDING,MARKET); //次周期下单控制

 

TBUY(HOLDING=0 AND BUYCOND,1,MKT);
BUY(HOLDING=0 AND BUYCOND,1,MARKET); //次周期下单控制


 

问题4 我该如何去调试我的后台程序化?

        由于后台交易策略在运行时的特殊机制,我们没法像图表交易那样相对直观的看到K线以及信号的展示,因此我们有必要再次强调一下后台程序化用户的调试自己代码所必须要掌握的一些方法和技巧。

        使用DEBUGFILE文件调试函数,通过这个函数将可以告诉我们后台程序运行时的一些基本变量状态,比如我们下面的程序代码片段:

 

 //开平仓条件
买开条件:= holding=0 and UPPERLINE>均线;
卖平多单:= holding>0 and C<均线;
卖开条件:= holding=0 and LOWERLINE<均线;
买平空单:= holding<0 and C>均线;


if islastbar then begin  ////@@@@@@@@@@@ 注意这里务必要增加ISLASTBAR条件判断只对最后周期有效,增加运行效率  @@@@@@@@@@@@@@
 debugfile(\'c:\\test.txt\',numtostr(date+19000000,0)&\' \'&numtostr(time,0)&\'买开条件:%.0f\',买开条件);  //@@@@注意:如果是序列工作模式,请使用 CONST 函数将date等序列变量转化为单值数据以提高字符串操作的工作效率。@@@@@@
 debugfile(\'c:\\test.txt\',numtostr(date+19000000,0)&\' \'&numtostr(time,0)&\'卖平多单:%.0f\',卖平多单);
 debugfile(\'c:\\test.txt\',numtostr(date+19000000,0)&\' \'&numtostr(time,0)&\'卖开条件:%.0f\',卖开条件);
 debugfile(\'c:\\test.txt\',numtostr(date+19000000,0)&\' \'&numtostr(time,0)&\'买平空单:%.0f\',买平空单);
 debugfile(\'c:\\test.txt\',numtostr(date+19000000,0)&\' \'&numtostr(time,0)&\'holding:%.0f\',holding);
end

 

//程序主体
//开仓
if 买开条件 then begin
 tbuy(1, 手数,mkt);
 buy(1,手数,market);//开多信号
end

if 卖开条件 then begin
 tbuyshort(1,手数,mkt);
 buyshort(1,手数,market);//开空信号
end
//平仓
if 卖平多单 then begin
 tsell(1,holding,mkt);
 sell(1,holding,market);//平多信号
end
if 买平空单 then begin
 tsellshort(1,holding,mkt);
 sellshort(1,holding,market);//平空信号
end

 

上述代码片段红色部分则为非常重要的代码调试部分,有了这个调试信息,用户就能很方便的查看到在每根测试K线上你所关心的变量的运行的实时状态了,为排查问题提供了非常有效的手段。