二、模组实现自动的头寸管理、风险控制

模组是指将策略加载到相关合约的K线图上,分配一定量的资金组成的“交易单元”,而运行模组则是这些“交易单元”的运行载体。运行模组采用独立的模组交易单元管理策略运行,可实现更高端、智能的资金管理和风险控制。

当多个合约、多个策略一起运行,软件能否保证各模组有序执行,并准确无误的计算每一个模组的数据至关重要。运行模组中为每一个模组都分配独立的资金,形成一个单独的“交易单元”,用来管理当前策略的持仓和资金变化,模组之间便可以独立运行,为交易保驾护航。

如下图,在一个分区内同时运行3个模组,各个模组之间独立运行互不干扰,在模组界面可以看到独立模组的持仓、资金、下单方向和分区的合计持仓、可用资金等基本信息,可基于模组的历史运行效果显示连续的理论资金曲线和真实资金曲线。

模组中还支持查看每一个分区的组合资金曲线,如下图中的黑色资金曲线,表示的是第一分区内三个模组组合的实际资金曲线,投资者可以直观的看出交易组合的整体收益效果。

TIPS:交易单元和实盘账户的关系

wh8的大部分客户,通常会在一个合约上运行不同特点的多个模型,组合交易分散风险。多个模组单元是独立运行的,每一个模组都有自己的交易单元。

1、模组单元资金与实盘账户的资金是不同的

模组单元资金是由用户随意分配的,和实盘账户资金没有直接关系。

大多数情况下,单元资金之和不超过账户总资金数。用户在分配单元资金时会参考实盘账户的总资金量,把实盘账户的总资金,按照风险分散的逻辑,合理分配到各个模组交易单元。

2、模组交易单元的持仓与实盘账户的持仓也是不同的

模组交易单元的持仓,是这个模组单元的模型出信号自动下单的结果。

在用户不进行手动交易的情况下,各个模组单元持仓之和等于实盘账户的总持仓。

模组的三个典型应用

(一)模组实现资金管理方法

仓位管理和风险控制是资金管理的重中之重,模组独立运行和独立的交易单元管理,为投资者在策略中实施资金管理提供了便利。可以直接获取当前策略的盈亏和资金变化,一些复杂的账户资金管理操作都可以在模组中通过量化语句轻松管控。

思路1:通过资金管理函数控制独立交易单元开仓头寸

行情波动反复无常,你还在使用固定手数进行下单?运行模组中使用独立的交易单元管理策略的资金,投资者可以按照运行模组中的资金比例下单或者按资金使用率下单,来合理控制开仓头寸。

关键字:SETDEALPERCENT(fPercent);按模组单元资金比例下单

如:每次按当时可用资金的20%下单

SETDEALPERCENT(20);

如下图,模组中根据账户资金20%的比例开仓,贴合账户盈利情况科学合理的设计头寸大小。

思路2:通过资金管理函数对交易单元进行风险控制

行情的异常波动我们很难在模型中全部都量化出来并加以限制,但是行情波动带来的影响会直接体现在资金的变化上,那么是否可以调用到策略的资金来控制进出场呢?在运行模组中投资者可直接调用到模组的资金权益,配合策略优化函数来灵活的设计交易条件。

关键字:MONEYTOT返回当前模组交易单元权益

MONEYTOT=模组交易单元可用资金+持仓保证金,模型进行仓位控制、下单手数等资金管理时使用。

举例:IDLE(MONEYTOT<HHV(MONEYTOT,0)*0.95);//权益回撤一定幅度停止交易

如下图,是当模组资金回撤一定幅度时,配合策略优化函数限制模组停止开仓,实时踪账户资金变动,及时避免资金回撤带来的风险,锁住账户盈利。

(二)主力合约自动移仓

除了使用资金管理函数控制开仓头寸,模组中还可以使用策略优化函数,实现其他智能持仓管理。随着期货主力合约的转移,大部分的持仓和资金都将转移到新主力合约上,传统交易时,投资者要盯盘判断主力切换,再手动下单移仓,而在运行模组中,你只需启用自动换月策略,便可智能自动移仓,实现真正的无人值守。

关键字:TRADE_OTHER('CODE');指定交易合约

(1)该函数写为TRADE_OTHER('AUTO')时,可以加载到指数、主连、沪深300、上证50、中证500合约, 实现自动换月移仓。

(2)该函数写为TRADE_OTHER('XX主连')时,可以加载到商品指数上,实现换月移仓。

(3)CODE位置为具体合约时,表示指定以该具体合约作为交易合约。

如下图,在模型中写入TRADE_OTHER('AUTO')函数构建自动换月策略并加载到指数合约上启动运行,当主力更换时,模组中会自动平旧主力持仓并建立新主力的同向持仓,完成持仓的自动转移,保障资金的流动性。

(三)理论/交易单元持仓管理机制

受制于市场流动性、期货撮合成交机制、网络速度等因素,量化信号不可能100%按照模型里设定的价格方式完美成交。鉴于此,模组使用理论账户和交易单元,分别对理论上的信号和持仓,和信号执行的实际持仓,分别管理。

1、理论持仓和交易单元持仓的概念

什么是理论持仓,什么是交易单元持仓?他们之间又有什么样的执行关系呢?

通俗点来说:按照模型计算的理论上应该执行的信号即为理论信号,根据理论信号计算得出的资金和持仓分别为理论资金和理论持仓;

模组运行时根据理论信号执行真实的委托,并将真实的成交结果反映到模组交易单元中,实际交易产生的资金和持仓则为实际资金和交易单元持仓。

如下图是理论账户和交易单元关系示例。

二套持仓管理,保障各个模组有条不紊的运行,各模组账户资金得到有效的监控。投资者对比理论账户和交易单元的持仓和资金,也可以清楚了解到策略的执行效果和真实交易的滑点成本大小等。

在下图的模组界面中,①为理论信号,②为按照理论信号计算的理论持仓,③为交易单元持仓,④为理论资金曲线,⑤为实际资金曲线。

如上图,当模组持续运行,实际资金曲线记录的是模组的实际盈亏情况,通过理论资金曲线与实际资金曲线的对比,投资者便能了解到当前模组的滑点成本大小。

2、如何提高信号执行的成交比率

Wh8有专门的信号执行方式函数,来提高成交率,降低信号下单不成交的概率,或者取得更有利的价格成交,降低交易成本。

通过SETSIGPRICETYPE(SIG,PRICE,IsCancel)函数,可以对不同的信号设置不同的委托方式,或者极端情况下终止下单。SIG位置为交易指令,包括BK\SK\BP\SP\BPK\SPK\CLOSEOUT\STOP\STOP1;下单价格可以指定最新价/排队价/对手价/自动连续追价/超价/市价/触发价/指定价。

每一个信号可以采用不同委托价格实现不同的目的。例如:要的是便宜的成交价位,不在乎能成交几手,不便宜宁可不成交,可以用排队价;要得是保证全部成交,不在乎成交价位,可以用市价...

3、持仓匹配校验

模组正常运行时,理论持仓和交易单元持仓也应该是一致的,但是如果网络环境不稳定或委托方式不合适导致不成交,都会影响到模组的运行,所以也建议投资者养成持仓校验的习惯,及时了解持仓匹配情况。

机构投资者运行模组数量较多,一个一个去检查账户持仓是否匹配需要的时间太长,软件提供智能的持仓匹配校验功能,一键查询真实账户持仓和策略持仓是否匹配,同时可以查看模组是否正常加载以及加载失败的原因。

操作方法:模组工具条,最右边的匹配校验信息按钮调出。

持仓校验如下图:

4、手动干预的方法

情况一:模组盘中运行过程中,自动交易发出了委托形成挂单,长时间未成交

解决办法:可点击如图示“追对手价”按钮进行手动干预,撤掉原有的委托挂单,以当前的对手价重新发送委托(点击一次追一次),以此确保及时成交。

通过这个追价按钮的成交,模组会把成交价格自动带入作为权益计算的依据,权益计算会按照追价成交的价格计算。

情况二:实际账户中有持仓,理论持仓有持仓,交易单元持仓小于理论持仓,该怎么办?

在用户做不到软件持续运行,在交易时段关机了,或者电脑掉电非正常关机等情况,重新启动模组一般会出现这个现象。

解决办法:如下图,通过“重置子账户持仓”功能,将交易账户中的持仓带入到模组,就可以保持理论账户和交易单元持仓匹配。

通过重置交易单元持仓,模组会把输入的价格、持仓数量带入作为权益计算的依据,权益计算会按照你填写的价格/手数计算。

5、模组的持仓管理机制和TB持仓同步机制的区别

Wh8有理论持仓管理、交易单元持仓管理二套管理机制。Wh8认可和接受流动性、网络造成的交易单元实际持仓和理论持仓不一致的实际情况,wh8能管理这种差异,可以根据交易单元实际持仓绘制模型的实际权益曲线。

TB只有一种理论持仓管理机制,无法管理理论持仓和实际持仓不一致的情况,或者采用的简单粗暴的持仓同步方式(延后几秒补仓强制实际持仓和理论持仓一致);或者不去理会实际持仓和理论持仓的不一致。TB只能用理论持仓绘制模型的权益曲线。

因为信号执行是有时效的,TB延后几秒的补仓的成交价格难免和信号价格有出入,会导致模型的权益曲线和实际情况有出入,另外因为延后补仓提高交易成本会降低模型盈利率,甚至因为延后补仓导致亏损。

(四)模组使用注意事项

1、保持模组连续运行

只要在交易时段,软件要一直在保持运行,这样才能保证交易信号的连续性。出于节约的目的,在闭市后可以关机,但是一定要在交易重新开市前打开软件,否则就会影响连续性,造成信号和持仓对不上的情况。

量化信号能否正常执行,取决于模组中行情和交易的连续性。模组行情连续才能保证信号有序执行,精准下单。要想让模组代替人工执行下单,在有条件的情况下,尽量不要关机,保证电脑24小时不关机连续运行。

注:正常关闭软件的过程中,软件会自动保存模组的各个状态。但是,如果在软件还在运行过程中直接切断电源,会导致模组状态丢失,导致下次启动模组信号持仓不匹配。

2、保证网络稳定

模组在盘中实时接收数据计算信号,网络延迟、数据丢包等问题都会直接影响到模组中信号的计算,对后续的执行造成影响。所以运行模组时,一定要保证网络环境的稳定性。

将策略托管到云主机上运行,可以保障网络的稳定性和行情的连续性,有效避免断电、断网等突发情况的干扰。(了解云主机

3、避免手动干预模组运行

模组中各账户独立运行,每一个交易单元分别管理对应策略的持仓和资金,与总账户不存在对应关系,所以手动下的单不能由模组接管。并且手动干预带入的持仓价格可能会和理论数值不符,导致盈亏的差异,从而影响模组信号的判断,所以在模组运行时,一定要避免手动干预模组运行。

附:【不规范操作的解决办法】

不规范操作 现象和原因 解决办法
1.未连续运行 非法关机
收盘前关闭软件
开盘后启动软件
1、模组交易单元和理论持仓不匹配?
2、模组中不显示交易单元持仓?
3、实际持仓不能正常带入模组?
(原因:盘后正常关机,模组可以自动带入持仓。但盘中非法操作会导致模组中数据断档,模组的运行条件已经发生改变,所以无法接管之前的信号和持仓;)
如果当前运行的信号和持仓方向一致: 点击模组左下角的重置子账户持仓,把每个模组的持仓都手动带入;

如果当前的运行信号和持仓方向不一致: 在模组右键->清除历史信号重新运行,带入之前的持仓;
2.网络不稳定 本地网络不稳定 1、回测有信号,但是模组中没有信号?
2、K线主图的数据和模组里的数据相差很大?
(原因:主图回测是从文华服务器直接申请的完整、准确的数据计算信号。模组中是盘中一笔一笔接收数据计算信号,如果丢包或断网,模组中的数据和信号就会受到影响;)
在模组中右键->重新计算历史信号,从服务器申请准确的数据重新计算信号。模组后续出信号延续该信号向下执行。

操作建议:此操作只适用于临时解决模组信号问题。建议优化网络环境,从根源上解决问题。
3.手动干预 在下单版手动平掉模组的持仓
频繁干预交易单元持仓
1、模组为何提示不匹配?
2、模组中显示的盈亏数据,怎么和实际的开平价格计算的盈亏不符?
(原因:模组由独立交易单元管理资金和持仓,手动开仓模组中接管不到;手动平掉模组的持仓,后续模组就只出平仓信号,不会真正执行委托;另,手动干预带入的持仓价格可能和理论不符,导致盈亏的差异,从而影响信号的判断;)
模组中不接管手动下单的持仓,如果需要模组接管,可参考问题1的解决方法。

操作建议:模组中要避免频繁的手动干预。如果是因为下单效果与预期不一致,建议调整编写思路,完善策略。

附:模组的加载方式

运行模组的加载方法详见 (量化操作流程)

(五)相关常见问题解答

1、模型源码中指令后面写有手数了,如BK(1),加载模型的“交易合约”处也填写了下单手数值,下单手数以哪个为准?

答:源码中写的手数优先级高于加载模型设置的手数,所以如果源码中指令后面有手数,就按照源码中的手数下单,“交易合约”处设置的手数不起作用。当源码中指令后面没有手数的时候,再取加载模型“交易合约”处填写的手数值。

2、模型加载计算慢怎么办?

答:本地秒周期数据量过多会严重影响模型计算的速度,在主窗口K线图上单击鼠标右键—>【重新计算历史信号】,可以灵活选择加载所用的数据量,避免这一问题。

3、运行模组中【手动下单】按钮的作用?

答:当交易单元持仓和理论持仓不同步时,可以通过点击【手动下单】按钮补充持仓。注意手动下单的持仓不会自动带入到交易单元持仓中,需要点击【重置子账户持仓】按钮来同步持仓。

4、为什么下单手数与信号手数不一致?

答:(1)最后信号为开仓信号;
信号手数 < 模组理论资金曲线计算可开手数:下单手数 = 信号手数;
信号手数 > 模组理论资金曲线计算可开手数:下单手数 = 可开手数。
例:信号手数为10,下单手数却只有5手。
——根据模组分配资金计算,最大可开手为5手,所以即使信号手数为10,实际下单只可以下5手。
(2)最后信号为平仓信号;
信号手数 > 交易单元持仓 :下单手数 = 交易单元持仓;
信号手数 < 交易单元持仓 :下单手数 = 信号手数。
例:信号手数为10,下单手数却只有5手。
——理论持仓为5手,即开仓信号时只开了5手,所以平仓只执行5手;
——理论持仓为10手,但是交易单元持仓为5手(未初始化进来持仓/手动调仓至5手/账号同步至5手),所以平仓只执行5手。