掘金社区

程序化交易之三:从回测到实盘,还需要注意些什么?Pinned highlighted

掘金小Q 【 论坛管理员 】 发表在策略研究 2018-07-09 09:56:38

策略研究
2104
0
0

前言:
在之前两篇介绍文章中,笔者比较粗略的介绍了策略的开发以及策略的回测,在本篇中,笔者试图根据自己浅薄 的实盘开发经验,简单讲讲实盘策略开发需要注意的点已经可能遇到的坑,希望读者能够有所收获。

实际我们进行程序化交易,目的并不是去看它回测效果如何,毕竟理论再美,没有实验的佐助,那就是民科。而 我们开发策略的时候,尤其需要当心一个回测貌似很美的策略。记得以前碰到过一个大牛介绍经验,他当时提出 了一个观点,我还是挺认同的:市场是一个有序生态,不可能出现一个策略,每年翻几倍,可以一直这样搞下去 的,因为如果这样的话,市场的钱都被你赚了,市场上哪里还会有参与者。因此,对于一个回测很美的曲线,一 定需要仔细去查看是否出现了 Bug, 未来信息,偷价,复权处理,甚至于回测平台的行情错误等等,都需要仔 细考虑。

仿真

当我们把回测中一切能够考虑的问题都考虑清楚后,但还是会觉得对自己策略不太放心,直接上实盘未免试错成 本会比较大,因此,一个比较好的做法是,先将策略放到仿真环境中运行一段时间,对策略的牢靠程度,以及未来实盘可能出现的问题提前进行盘查。

所谓仿真,比较简单的解释就是通过量化平台创建一个虚拟交易账户,根据实时行情,利用虚拟账户中的余额去进行交易,当然这个交易实际并没有成交,而是根据实际行情,对这个交易的成本,盈亏等进行记录,以方便最后去进行分析。

在仿真的时候,相比回测,笔者总结了以下几个点,希望大家在开发自己策略的时候,避免去走这些弯路。

Bar 行情与 Tick 行情

在回测的时候,为了平衡回测效率,我们往往采用的是 Bar 行情,以方便查看我们策略的效果。笔者认为,回测 而言,一个比较适宜的做法,可以先用日线 Bar 行情进行回测,效果可以的话,直接换到分钟级别的 Bar 行 情去进行回测,为了去模拟实盘中可能遇到的市场冲击等问题,在分钟级别的 Bar 上,可以设置成交的量为该 分钟 Bar 的譬如 25%。

但是,这样的回测如果要切换到仿真或者实盘的时候,如果是掘金量化这样的量化平台时,会出现大问题。 因为这些量化平台的 Bar 行情需要等到对应 Bar 结束后才会有该根 Bar 的数据,因此,如果实盘中我们 要用到这根 Bar 里面的数据的时候,就会出现滞后。举个例子,某支股票 A, 我们利用它的分钟行情进行回测, 效果还不错,假设我们用的是通道突破策略,当股票 A 的实时价格突破 10.00 的时候,回测的时候,我们立 刻以突破点的价格进行买入,在回测时候,这不会出现什么大问题。但是,在实盘的时候,假如说在 9:50:03 出现了突破价位 10.00,此时,我们希望能够立刻去以突破点的价格进行买入操作,但是,因为我们用的是分钟 Bar 的行情,此时,我们的策略还没有接收到这个时间点的 Bar 行情,而是会在 9:51:00 的时候,我们 才会得到相应的 Bar 行情,这个滞后出现,我们很可能就不能用理想的价位去进行成交了。

因此,如果要将策略放到仿真或者实盘去运行的时候,我们需要做的将策略进行改写,以分笔行情去进行判断和成 交。分钟 Bar 行情可以用以辅助判断更高周期级别下的行情走势。

当时,当真的去订阅 Tick 行情进行交易的时候,又有需要注意的点,首先,Tick行情的涨跌停的处理,如果 策略想避开涨跌停,那么就需要判断 Tick 是否触发涨跌停价,一个简单判断的方法,根据最新分笔行情有没有 出现只有买一,或者只有卖一价;此外,某些股票可能在过去的 Tick 没有成交,那么它的 Tick 行情就是空 的,还有可能因为网络或者量化软件的问题,我们接收到的 Tick 行情价格错误,那么,我们也需要在策略中 考虑类似的情况,并加以过滤。下图是笔者用掘金量化开发实盘策略的时候,过滤一些极端行情的代码,读者可以 根据自己的需求,加以删改。

0_1531100769031_1212.png

关于行情订阅

如果可能,我们当然希望能够对全市场股票进行监控,如果盘中发现某支股票要涨停了,立刻追进去,那岂不 是美滋滋。当然,理想和现实是有差距的,通过软件来监控全市场行情,理论上当然是可以实现,但是,会面 对很多问题。

首先,假设我们今天监控的可交易的全市场股票有 3000 支,那么,一个比较极端的情况,3 秒一个 Tick, 3000 支股票同时有 Tick 行情接收过来,针对每支股票,我们程序的反应时间是 3.33E-4 秒,这就需 对策略的计算实时性有着比较高的要求,如果你的策略比较复杂,很可能这边计算还没结束,那边下一个 Tick 行情又推送过来了。

然后,同时订阅三千多支股票的话,我们的带宽是否足够,不提我们的带宽是否足够,来自数据供应商的带宽是不是 足够,都需要打一个问好,毕竟数据供应商可以面向成千上万用户的数据请求。

通过咨询这些量化平台软件公司,我获知的结果是,免费用户一般 50 支以内免费分笔行情订阅,券商用户一般 100 支股票的分笔行情订阅。当然,实际情况如何,最好还是用户亲自去仿真试一下,作为免费用户,曾经试过 同时订阅 100 多支股票行情,结果有行情错漏。

另外,这里笔者提供一个小技巧。因为策略一般不会在日内多次开仓,当策略发出了买入信号的时候,我们可以将 该股票的 Tick 行情取消订阅,国内股票 T+1, 今日买入的并不能卖出,再订阅该股票的分时行情,可能也 不是很必要了。

关于委托价格与委托数量

由于国内股票成交价位最小单位是 0.01, 每次下单最小委托都是 1 手 (100 股),当我们去下单的时候, 需要注意委托的价格为单位,下面是笔者写的一个示例代码:

0_1531101033869_2323.png
0_1531101046050_3434.png

其中, long_price 计算的是委托单价格, long_vol 对应的是委托数量。

实盘

实盘与仿真基本类似,如果仿真的问题都排除了,那实盘中的问题也不会太大了。但是,还是有一些小问题需要特别注意。

1.在分笔行情中,避免去利用 position 判断来进行交易过滤。譬如,在盘中某个时刻,策略触发,发出了委托单,此时,我们希望策略只发出一笔委托单,但有时候,我们会遇到策略连续发单,可能的一个原因是 我们对于仓位的时候查询,可能有延迟,导致策略认为发单不成功,于是进行连续发单。一个可行的方式, 我们在本地进行判断,譬如,程序如果发单了,我们相应的设置一个 flag, 当且仅当对应该标的的 flag 为 False 的时候,我们的策略才会进行发单。

2.股票交易时段,往往是在开盘的一段时间和收盘前的一段时间,因此,可以根据 Tick 的时间戳进行过滤。

3.委托发单的价格,如果以市价去发单,可能因为行情波动剧烈,导致不能成交,可行的做法是发限价单,为 保证成交,将限价单的发单价格设置比市价稍高一些。

4.股票行情因为牛熊周期可能在某些时间段对于该策略才有效果,因此,策略的有效性除了在回测时候去在多个 不同时间段进行回测,仿真的时间段需要长一些,真的上实盘的时候,先小资金测试,仓位的控制非常重要, 如果仓位过重,行情产生变化的时候,策略的损失也会相应的放大。

写在最后

交易的核心是策略,但是策略能够有效的核心,往往体现在一些细节处。有很多策略核心逻辑甚至是一样的,但是因为 细节处理的差异,会导致收益结果的非常大差别,当真的去实盘的时候,涉及到真金白银,再多仔细都不为过。很多 貌似回测很牛逼的策略,不要被其牛逼的回测效果所吓着,先仿真瞧瞧,如果仿真也行的话,那不妨小资金的去跑一跑。

交易的路,远比想象中的更复杂,如何去不断提高自己的水平,关闭造车肯定是不行,夸夸其谈更是不可行,多学多看 还要多实践,才是一个更好的进阶之路。

送大家一句话,共勉之, “纸上得来终觉浅,绝知此事要躬行”。希望大家在交易的路上,走的足够远。

相关阅读:
1. 《从量化角度告诉你常见的技术指标到底能不能赚钱?》
2. 《从回测到实盘之二:如何让回测更贴近实盘结果》

作者:胡琛 (南京师范大学理论物理博士)

暂无评论

Looks like your connection to 掘金量化社区 - 量化交易者的策略交流学习社区 was lost, please wait while we try to reconnect.