程序化交易高级教程.docx

上传人:b****4 文档编号:4646924 上传时间:2022-12-07 格式:DOCX 页数:95 大小:3.49MB
下载 相关 举报
程序化交易高级教程.docx_第1页
第1页 / 共95页
程序化交易高级教程.docx_第2页
第2页 / 共95页
程序化交易高级教程.docx_第3页
第3页 / 共95页
程序化交易高级教程.docx_第4页
第4页 / 共95页
程序化交易高级教程.docx_第5页
第5页 / 共95页
点击查看更多>>
下载资源
资源描述

程序化交易高级教程.docx

《程序化交易高级教程.docx》由会员分享,可在线阅读,更多相关《程序化交易高级教程.docx(95页珍藏版)》请在冰豆网上搜索。

程序化交易高级教程.docx

程序化交易高级教程

 

 

注:

此教程适用于赢智Wh8。

目录

第一章如何优化你的交易策略1

1.1PANZHENG函数,减少盘整行情中的交易次数1

1.2CHECKSIG函数,实现更具有优势进场价格7

1.3MULTSIG函数,在一根k线上灵活进出12

1.4TRADE_OTHER函数,在指数交易中的应用17

1.5拓展思路—结合盘口数据研发策略27

第二章多模型组合回测35

2.1回测一篮子合约35

2.2多模型组合回测38

2.3段落式交易回测42

第三章编写资金管理模型45

3.1加码模型45

3.2回撤控制模型47

3.3资金曲线跟随模型48

第四章盘口模型的基本结构与应用49

4.1盘口模型的分类49

4.2盘口模型使用的函数类型和运行机制50

4.3盘口模型的语法及编写规则50

4.4盘口模型的加载流程54

第五章盘口高频模型的编写56

5.1什么是高频交易56

5.2盘口高频模型的编写—追涨高频策略57

5.3盘口高频模型的编写—辅助判断趋势策略61

5.4盘口高频模型的编写—基差策略62

第六章盘口模型控制滑点63

6.1了解滑点的产生63

6.2盘口模型控制滑点的原理64

6.3盘口模型控制滑点策略编写64

第七章后台程序化71

7.1运行模组71

7.2盘口模型运行池80

第八章远程监控86

8.1设置运行模式86

8.2日志邮件88

第一章如何优化你的交易策略

1.1PANZHENG函数,减少盘整行情中的交易次数

很多趋势模型,在行情出现趋势的时候,都可以很好的抓住趋势,实现盈利,但长期运行下来,最终的结果却是小赚甚至亏钱,问题出在哪里?

原因在于,盘整行情中模型在不断的反复交易,而盘整中的交易都是不盈利甚至亏损的,行情中绝大部分又都是盘整行情,长时间的连续小亏损导致之前的利润全部回吐

关键函数:

PANZHENG,判断当前行情是否为盘整

注:

返回1:

表示盘整,返回0:

表示不是盘整。

作用一:

增加收益率

简单的均线模型

MA1:

=MA(C,5);

MA2:

=MA(C,10);

CROSS(MA1,MA2),BPK;

CROSS(MA2,MA1),SPK;

AUTOFILTER;

上面的模型在这段行情中实现盈利77040元,如下图所示

(增加阅读软件的页面放大率可查看清晰图片)

加入PANZHENG函数,在盘整行情中不开仓

做多代码如下:

MA1:

=MA(C,5);

MA2:

=MA(C,10);

CROSS(MA1,MA2)&&PANZHENG=0,BK;

CROSS(MA2,MA1),SP;

AUTOFILTER;

做多实现盈利179580元,如下图所示

(增加阅读软件的页面放大率可查看清晰图片)

做空代码如下:

MA1:

=MA(C,5);

MA2:

=MA(C,10);

CROSS(MA2,MA1)&&PANZHENG=0,SK;

CROSS(MA1,MA2),BP;

AUTOFILTER;

加入盘整函数后,做空亏损44100元,如下图所示

(增加阅读软件的页面放大率可查看清晰图片)

总结:

未加入盘整函数前,这段行情中多空共实现盈利77040元,加入盘整函数后,做多实现盈利179580元,做空亏损44100元,这段行情中多空共实现盈利135480元,加入盘整函数后,盘整行情交易次数大量减少,从而减少了亏损,总盈利提升76%。

作用二:

减小最大回撤

均线模型,PTA指数,2010.1.1至今的测试结果

代码如下:

MA10:

=MA(C,10);

C>MA10,BPK;//价格大于10周期均线,做多

C

AUTOFILTER;

如下图所示,模型虽然有年化,55%的收益率,但也有65%的权益最大回撤,如此大的回撤导致模型的实际可用性大大降低。

(增加阅读软件的页面放大率可查看清晰图片)

加入PANZHENG函数后,代码如下

MA10:

=MA(C,10);

C>MA10&&PANZHENG=0,BPK;//非盘整行情中,价格大于10周期均线,做多

C

AUTOFILTER;

如下图所示

胜率提升14%

盈利率提升37%

最大回撤减少45%

年化盈利率提升21%

单次交易盈利能力提升40%

减少盘整行情中的交易次数后,不仅仅盈利能力得到提升,模型的稳定性同时也得到大幅度提升,

大大提高了模型的可执行性

(增加阅读软件的页面放大率可查看清晰图片)

1.2CHECKSIG函数,实现更具有优势进场价格

大部分趋势模型采用趋势突破或者趋势跟踪的方法捕捉趋势,通常情况下,信号都出现在一根较长的k线上,如果使用收盘价模型,入场点在下根k线的开盘价上,因此会错过突破这根长k线的最佳入场时间,无形中损失掉很大一笔到手的利润;出场时也是如此,那么怎么才能以最优的价格进出场,得到更多的利润呢?

如何实现在k线没有走完之前进出场呢?

关键函数:

CHECKSIG,实现出信号立即发出委托。

信号复核的意义:

指令价模型,如果策略设计思路不够严谨,可能会产生信号出现后,再次消失的情况,称之为信号忽闪,即开错仓或者平错仓,这时可以使用信号复核进行恢复持仓的操作。

CHECKSIG设置信号确认与复核的指令价方式(TICK逐笔回测,可设置回测精度)

CHECKSIG_MIN设置信号确认与复核的指令价方式(逐分钟回测)

函数用法:

CHECKSIG(SIG,MODE1,TIME1,MODE2,TIME2,INTERVAL):

当INTERVAL不为0时,SIG为信号,MODE1为信号确认方式,TIME1信号确定数据时间间隔的倍数,MODE2信号复核方式,TIME2信号复核数据时间间隔的倍数,INTERVAL数据时间间隔。

当INTERVAL为0时,SIG为信号,MODE1为信号确认方式,TIME1信号确认时间,MODE2信号复核方式,TIME2信号复核时间,INTERVAL数据时间间隔

通过调整INTERVAL参数,模型可设置不同数据快照频率进行回测

CHECKSIG_MIN(SIG,MODE1,TIME1,MODE2,TIME2):

SIG为信号,MODE1为信号确认方式,TIME1信号确认时间,MODE2信号复核方式,TIME2信号复核时间。

逐分钟回测

几种典型的信号复核确认方式对应的写法举例(以CHECKSIG_MIN为例):

CHECKSIG_MIN(SIG,'A',0,'D',0);//出信号立即下单,K线走完复核

CHECKSIG_MIN(SIG,'A',N,'D',0);//出信号N分钟确认信号下单,K线走完复核

CHECKSIG_MIN(SIG,'A',N,'C',0);//出信号N分钟确认信号下单,不进行复核

CHECKSIG_MIN(SIG,'B',N,'D',0);//K线走完前N分钟确认信号下单,K线走完复核

CHECKSIG_MIN(SIG,'B',N,'C',0);//K线走完前N分钟确认信号下单,不复核

CHECKSIG_MIN(SIG,'B',0,'C',N);//K线走完确认信号下单

CHECKSIG_MIN(SIG,'B',0,'D',0);//K线走完确认信号下单

CHECKSIG_MIN(SIG,'A',0,'C',0);//出信号立即下单,不复核

CHECKSIG_MIN(SIG,'A',0,'F',10);//出信号立即下单,收盘前最后一根K线提前10分钟进行复核。

模型中加入CHECKSIG,在实现指令价模型的同时,可以针对不同指令实现不同的信号复核方式,让交易策略的实现更加灵活。

如:

CHECKSIG_MIN(BK,'A',0,'D',0);//出信号立即下单,K线走完复核

买开仓信号出现,立即发出委托,K线走完如果信号存在,则无需进行处理。

如果K线走完信号消失,则恢复原状,即平掉多单。

源码:

MA5^^MA(C,5);

MA10^^MA(C,10);

RSV:

=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;

K:

=SMA(RSV,3,1);

D:

=SMA(K,3,1);

EVERY(MA5>MA10,5)&&CROSSUP(K,D),BK;

EVERY(MA5

BARSBK>2&&C<=BKHIGH-10*MINPRICE,SP;

BARSSK>2&&C>=SKLOW+10*MINPRICE,BP;

CHECKSIG_MIN(BK,'B',1,'C',0);//BK信号的执行方式为:

K线走完前1秒下单,不进行复核

CHECKSIG_MIN(SK,'B',1,'C',0);//SK信号的执行方式为:

K线走完前1秒下单,不进行复核

CHECKSIG_MIN(SP,'A',0,'C',0);//SP信号的执行方式为:

出信号立即下单,不进行复核

CHECKSIG_MIN(BP,'A',0,'C',0);//BP信号的执行方式为:

出信号立即下单,不进行复核

AUTOFILTER;

如何实现指令价模型

是不是所有的模型用指令价效果都要优于收盘价呢?

答案是否定的。

究竟用指令价效果好还是收盘价效果好,还要根据交易策略决定。

一些交易逻辑简单的模型,指令价或者收盘价效果区别较小。

但收盘价模型无法处理更加细致的交易逻辑,就需要采用指令价了。

Wh8.2是国内程序化平台中唯一提供指令价模型tick回测的程序化交易软件。

是历史回测最精准的程序化交易软件。

是否支持指令价委托并不重要,重要的是是否支持回测

程序化交易平台

是否支持回测

是否支持指令价委托

是否支持信号消失自动处理

赢智wh8.1

价格估算

赢智wh8.2

Tick回测

其他程序化交易平台

如何设置模型回测精度

在并不需要用每笔TICK数据进行回测的情况下,可以通过调整CHECKSIG函数的INTERVAL参数值来调整模型的回测精度。

使用CHECKSIG函数,CHECKSIG(SIG,MODE1,TIME1,MODE2,TIME2,INTERVAL)

INTERVAL代表数据时间间隔

1)支持0、3、5、10四个值,不支持变量。

2)3、5、10分别代表用每隔3秒、5秒、10秒,计算一次模型

3)参数为3、5、10,回测速度可提升3-10倍,回测精度稍差

4)参数为0的时为每笔TICK计算一次模型

5)一个模型中只能写入一个INTERVAL值

例:

C>O,BK;

C

CHECKSIG(BK,'A',5,'D',0,3);//设置BK信号,出信号5*3=15秒后确认下单,K线走完复核。

每隔3秒计算一次信号。

CHECKSIG(SP,'A',0,'C',10,3);//设置SP信号,出信号立即下单,下单后10*3=30秒复核。

每隔3秒计算一次信号。

AUTOFILTER;

1.3MULTSIG函数,在一根k线上灵活进出

期货价格瞬息万变,经常会出现价格瞬间拉升,接着就瞬间回吐的情况。

拉升时模型出现开仓信号,如果遇到秒杀行情,不能够及时平仓,往往会带来较大的亏损。

能否处理好秒杀行情,已经成为重点解决的问题。

如何才能做到同一根k线开仓后快速止损呢?

回测止盈策略:

总结:

在这种秒杀行情中,行情已经逆转,收盘价模型,还在执行上根k线的买开仓指令,显然是错误的,导致亏损。

而指令价模型,则可以当根k线同时完成进场和止盈动作,保证既得利润。

关键函数:

MULTSIG,可以在一根k线上交易多次

模型中加入MULTSIG,在实现指令价模型的同时,同时可以实现在一根k线上反复进行交易,实现更精致的交易策略,可以很好的规避掉秒杀行情。

函数用法:

MULTSIG(Sec1,Sec2,N,INTERVAL):

当INTERVAL不为0时,设置信号复核确认方式,开仓信号出信号sec1个数据时间间隔下单不复核,平仓信号出信号Sec2个数据时间间隔下单不复核,一根K线上最大的信号个数为N,INTERVAL为数据时间间隔。

当INTERVAL为0时,设置信号复核确认方式,开仓信号出信号Sec1秒下单不复核,平仓信号出信号Sec2秒下单不复核,一根K线上最大的信号个数为N,INTERVAL为数据时间间隔。

通过调整INTERVAL参数,模型可设置不同数据快照频率进行回测

INTERVAL代表数据时间间隔

1)支持0、3、5、10四个值,不支持变量。

2)参数为3、5、10分别代表用每隔3秒、5秒、10秒,计算一次模型

3)参数为3、5、10,回测速度可提升3-10倍,回测精度稍差

4)参数为0的时候为每笔TICK计算一次模型,不限制加载周期

5)一个模型中只能写入一个INTERVAL值

MULTSIG_MIN(min1,min2,N):

设置一根k线多信号的指令价方式(逐分钟回测),开仓信号出信号min1分钟下单不复核,平仓信号出信号min2分钟下单不复核,一根K线上最大的信号个数为N。

模型源码:

C>REF(H,1),BK;//价格大于上一根k线最高价,开多仓

C

MULTSIG_MIN(0,0,3);//开仓信号,出信号立即下单,不复核;平仓信号出信号立即下单,不复核。

一根K线上最大信号个数为3。

AUTOFILTER;

案例:

收盘价模型,只能在下一根k线的开盘时止损

ST:

=ABS(C-O);

ST>MA(ST,20)&&C>O,BK;

ST>MA(ST,20)&&C

C>HV(C,3),BP;

C

(H-C)>(H-O)*0.2,SP;

(C-L)>(O-L)*0.2,BP;

AUTOFILTER;

(增加阅读软件的页面放大率可查看清晰图片)

加入MULTSIG函数,实现在同一根k线上开仓后及时止损,亏损变为盈利

ST:

=ABS(C-O);

ST>MA(ST,20)&&C>O,BK;

ST>MA(ST,20)&&C

C>HV(C,3),BP;

C

(H-C)>(H-O)*0.2,SP;

(C-L)>(O-L)*0.2,BP;

MULTSIG_MIN(0,0,2);

AUTOFILTER;

(增加阅读软件的页面放大率可查看清晰图片)

1.4TRADE_OTHER函数,在指数交易中的应用

1.4.1拓展思路--指数交易

用指数回测本身是没有问题的,因为指数连续性好,能反应某个品种的连续走势。

但现实中很多人发现,指数测试效果是盈利,但是实盘跑下来却是亏钱的,为什么会出现这种情况呢?

导致历史回测和实盘差距较大的一个因素—指数回测并参与计算交易结果,但指数本身并不能交易,指数的价格并不是当时交易合约的价格,就会导致与实际交易不符的情况。

我们能不能测试出指数和实际交易差别的真实情况呢?

关键函数:

TRADE_OTHER('CODE')指定CODE合约为交易合约,CODE为合约代码。

注:

1、

回测时:

信号价格取值为该函数定义的交易合约的信号价格。

模组加载时:

数据合约为加载模组时选择的数据合约,交易合约为该函数指定的合约。

不写入该函数时,交易和数据合约一致。

2、该函数写为TRADE_OTHER('AUTO')时,可以加载到指数、主连、主指合约,实现自动换月移仓。

建议加载到指数或主指合约使用,主连合约切换主力合约的接缝会有跳空,破坏合约趋势,可能导致出现不应该出现的信号

3、

(1)CODE位置写为'AUTO'时,如果加载在指数合约上,主连数据开始时间在指定信号计算时间之内,从主连数据开始时间开始计算信号;

(2)CODE位置为具体合约时,具体合约数据开始时间在指定信号计算时间之内,从具体合约数据开始时间开始计算信号

4、数据合约和交易合约的数据不对齐时,会计算信号,交易合约的相关价格取交易合约最后一根K线的收盘价。

5、

(1)CODE位置写为'AUTO'时:

如果加载在主连合约上,该函数可以和CHECKSIG,MULTSIG、CHECKSIG_MIN、MULTSIG_MIN,CLOSEKLINE_MIN函数连用;

如果加载在指数、主指合约上,该函数可以和CLOSEKLINE_MIN,CHECKSIG_MIN,MULTSIG_MIN函数连用;不支持和CHECKSIG,MULTSIG函数连用

(2)CODE位置为具体合约时:

该函数可以和CLOSEKLINE_MIN,CHECKSIG_MIN,MULTSIG_MIN函数连用;不支持和CHECKSIG,MULTSIG函数连用。

6、

(1)CODE位置写为'AUTO'时:

该函数可以加载到指数、主连上,不可以加载到主指和其他具体合约上。

(2)CODE位置为具体合约时:

该函数可以加载到到所有合约上。

7、该函数必须在有信号的模型中使用。

8、TRADE_OTHER函数不支持加载到副图中。

9、CODE位置写为合约代码时,该函数不支持加载到TICK周期,量能周期,秒周期上使用;CODE位置写为'AUTO'时,该函数不支持加载到日线以上周期使用。

10、CODE位置不支持写入文华码。

11、该函数不支持加载到页面盒子中使用。

一个均线模型,在未指定交易合约的时候,测试结果如下:

模型源码:

MA10:

=MA(C,10);

MA30:

=MA(C,30);

EVERY(C>MA10,4)&&C>MA30,BK;

EVERY(C

EVERY(C>MA10,4),BP;

EVERY(C

AUTOFILTER;

(增加阅读软件的页面放大率可查看清晰图片)

模型在指数上计算信号,交易也直接在指数上进行,而现实中指数是无法完成交易的,这种测试结果的真实性就无法保证。

那么真实的情况是什么样的?

加入TRADE_OTHER函数,模型源码入下:

MA10:

=MA(C,10);

MA30:

=MA(C,30);

EVERY(C>MA10,4)&&C>MA30,BK;

EVERY(C

EVERY(C>MA10,4),BP;

EVERY(C

TRADE_OTHER('RB1501');

AUTOFILTER;

测试结果为:

(增加阅读软件的页面放大率可查看清晰图片)

我们指定RB1501为交易合约后,发现盈利并没有明显变化,说明指数开平仓价格的价差,和具体合约比较接近。

但这是真实的情况吗?

下图是螺纹1501合约,2014年6月3号至今的走势,红圈中交易量较少,在这个时间段中出现的信号,很难完成交易或者将付出较大的滑点成本,必定会导致盈利的减少,那么如何知道最终的真实的交易结果?

我们在模型中加入了流动性限制,即成交量。

根据经验螺纹的成交量应该在50万手以上的时候,才能够使交易顺畅。

即指定交易合约又保证流动性的代码如下:

MA10:

=MA(C,10);

MA30:

=MA(C,30);

EVERY(C>MA10,4)&&C>MA30&&VV>500000,BK;

EVERY(C500000,SK;

EVERY(C>MA10,4),BP;

EVERY(C

TRADE_OTHER('RB1501');

AUTOFILTER;

//VV为跨合约引用RB1501的成交量

真实结果

 

(增加阅读软件的页面放大率可查看清晰图片)

当我们加入了流动性限制后,发现真实的交易情况,比开始的测试结果又差了一些。

这才是真实的结果。

所以,是否支持指数映射到主力合约交易并不重要,重要的是我们是否可以测试出这种映射交易的真实结果。

程序化交易平台

是否支持回测

是否支持映射交易

赢智wh8.1

赢智wh8.2

支持

其他程序化交易平台

1.4.2如何解决移仓换月问题

我们常常会这样做:

模型加载在主力连续合约上,指定主力合约为交易合约,只要主力合约切换,就自动移仓,这种方法正确吗?

正确的方法应该是怎么样的?

我们可以测试出来吗?

有没有更好的方法?

我们能找到吗?

主连合约加载模型,自动移仓换月,会产生较大的移仓成本

MA10:

=MA(C,10);

MA30:

=MA(C,30);

EVERY(C>MA10,4)&&C>MA30,BK;

EVERY(C

EVERY(C>MA10,4),BP;

EVERY(C

TRADE_OTHER('AUTO');

AUTOFILTER;

(增加阅读软件的页面放大率可查看清晰图片)

怎么做才能解决指数加载模型,移仓换月的问题呢?

更好的方法是:

加载两个模型,分别交易新主力合约和老主力合约。

在保证流动性的前提下,提前运行新主力合约,继续运行老主力合约,既减少移仓成本,又抓住更多的交易机会。

模型1源码:

MA10:

=MA(C,10);

MA30:

=MA(C,30);

#CALL[6881,VVA]ASAA

VV:

=AA.VV;//VV为跨合约引用RB1501的成交量

EVERY(C>MA10,4)&&C>MA30&&VV>500000,BK;

EVERY(C500000,SK;

EVERY(C>MA10,4),BP;

EVERY(C

TRADE_OTHER('RB1501');

AUTOFILTER;

模型2源码:

MA10:

=MA(C,10);

MA30:

=MA(C,30);

#CALL[6890,VVA]ASAA

VV:

=AA.VV;//VV为跨合约引用RB1410的成交量

EVERY(C>MA10,4)&&C>MA30&&VV>500000,BK;

EVERY(C500000,SK;

EVERY(C>MA10,4),BP;

EVERY(C

TRADE_OTHER('RB1410');

AUTOFILTER;

对模型1进行回测:

MA10:

=MA(C,10);

MA30:

=MA(C,30);

#CALL[6881,VVA]ASAA

VV:

=AA.VV;//VV为跨合约引用RB1501的成交量

EVERY(C>MA10,4)&&C>MA30&&VV>500000,BK;

EVERY(C500000,SK;

EVERY(C>MA10,4),BP;

EVERY(C

TRADE_OTHER('RB1501');

AUTOFILTER

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1