1. 首页
  2. 股票

为什么回测效果非常好的策略实盘却不行?

某个策略的回测利润与实际利润有差别,就那么一个核心原因:实盘系统与回测系统不一致

这种事情谁都经历过了吧。回测利润超高,大家都好兴奋。结果操作起来就不行了!哎呀,好郁闷!但是经验慢慢多起来了,这种问题自然就越来越少了,都能解决或避免。

甚至能实现回测利润跟实际利润完全一致。对呀,完全一致!哪天哪场足球比赛亏了钱,第二天直接再虚拟运行一遍,结果还是这个利润!说明是策略问题而不是回测系统的问题。如果能把回测系统做到这个境界,这就能更加相信任何新策略的回测结果。

为什么很多回测系统不够完善,主要原因只不过是该系统跟实时操作系统有差别。一旦两者有所差别,难道最后利润还能一样?所以关键问题在此。

1)绝大部分人来回测都是向量性计算。这跟实时一条一条输入处理有极大差别。如果代码不一样了,别说容易产生bug什么的,这还容易有前后顺序混杂。用向量的话,经常不小心把未来数据当成已有数据。用未来数据去预测未来,肯定行不通,没用。下面再提到一些典型例子。但是如果所有回测都是一条一条一行一行这么算的,直接避免了这类问题。

2)别说回测代码跟实时代码有差距的小危险,有时候连编程语言(或者所使用的库)都不同了。这真的不可以。用A语言去模拟一个B语言的策略,各种大差异大问题都会出现的。说实话,最好连计算机环境和配置都应该保持一致,但是最起码得保证程序一致。

3)回测程序输入输出格式跟实时程序输入输出格式也必须一致好吗。而且回测看到的输入都应该是实时系统所能看到的。反过来,实时系统看到的输入也都应该是回测看过的。数据格式、数据来源也要完全一致。虽然是常识,但是很多团队都完全没做到。

总之,整个策略必须搞成black box(黑盒子),无论输进实时数据还是输进历史数据,这黑盒子给出的命令一模一样。同一个系统又能用来回测又能用来现实操作,这才能实现预测利润靠谱。

---

之前在三家博彩团队工作过,其中一队估计是世界最大的之一,因为每天下注好几千万英镑,很多账号都是几个亿。这些公司的系统各种各样,但是共同点在于:都不做回测,也不太考虑。他们都是上一个时代留下来的遗产呢,坚持用一个最简单老策略,偶尔改进再改进效率。凭自己的体量和效率,就这么做下去了。或者说他们没必要回测,因为自己有那么多经验,策略又比较简单不用测试。所以他们几个四十岁的人对数据分析、机器学习、回测这一套都不感兴趣。

后来跟自己的高频交易老朋友一起开公司针对博彩。他想法跟我一样,那几家博彩团队都太落后了,技术和思维落后于金融十多年。我们必须用机器学习,也必须把博彩回测搞到金融高频交易回测那种境界。目标是超过之前那几家公司,因为他们太落后了,甚至说容易被利用。幸幸苦苦已经超过了另外两家,从交易量或交易频率角度来看,也已经超过了那个最大的了。

好吧,我想说的是这个回测实在太重要了。上面有几篇回答说回测永远做不到模拟现实。你们这么说可错了。最高端的高频交易公司的回测能做到什么程度?博彩那么小的体量,当然更行得通。还有人说影响市场之类的,这个疑问确实有道理;下面会分析一下。但是要求准确回测,这领域已经很成熟了。

---

先把重点放在一个回测系统到底该怎么设计。抽象(大概)概念是这样的:

(高频交易的核心也完全一样)

一些细节:

红圈Live Data:来自各种数据源的标准化实时数据渠道。

我们的大概是这种格式:

Exchange/Feed 交易所/网站来源

Request Time 抽取时间(或者网站本来标记的时间,要至少精确到微秒)

Response Time 获得时间

(pre-mapped data…)标准化之前的数据,很少用到

Fixture标准化比赛名(包括运动类别,开球时间,等等,博彩特殊吧)

Bet-Type 下注对象类别(比如full_time:goal_based:winner:home,等等,也属于博彩独有)

(其它。。。比如买卖时需要的具体信息,不解释吧)

Current Score etc.(有的feed只提供这一类,不一定都是价格)

BackPrice(0-6)(卖的价格,从最好排到最烂。注意这都是换算到概率空间的)

LayPrice(0-6)(买的价格,如上)

BackVolume(0-6)(卖的价格的下注限额,转换成volume)

LayVolume(0-6)(买的价格的下注限额,如上)

Virtual (。。。)(跟上面四类差不多,但是包括从其他BetType转换匹配过来的抽象价格)

Traded (。。。) (也类似,但都是其它该交易所该对象已成交的详细信息)

还有MID,SPREAD,VWAP之类的重要附生数据

然后每一个数据来源都必须转成这种格式。一条一条都长得一样,必须转换成这种标准的才行。任何策略输入都是这样的,无论什么运动,无论什么策略。输入就是这个。

橙圈Historic Data:被记录下来的所有Live Data。

比方说把每个比赛所有数据都存到一个压缩csv文件。每一个输入信息都是一行。存下来了那就是标准的几百万行几十列的大表格。这才是回测一场比赛的标准。

注意:存数顺序必须和原来发送的顺序一致。不一致就完了。有时候服务器在不同地区什么的,又每秒收到好几万个消息,不一定能保证每个零件收到的顺序都一样。这就麻烦了,估计高频交易还更注意这一点。

浅蓝色Manager:安排整个策略和输入分配的程序。

或者说把输入分配给model,然后根据model的反馈再给execution看一下提供操作命令。这一零件其实能操作很多不同策略,必须一致。可以给它历史数据,也可以给它历史数据,打出来的结果必须一样。策略随便替换。

深蓝色Model以及紫色Execution:这是所有策略的两个重要阶段。

Model(模型)只负责根据数据输入,把预测概率输出。具体是N秒以后(还是N交易以后)的预测都可以。它也是一个小黑盒子。

Execution(操作法)负责处理model给出的概率。输入也只有model给的,或许还有当前交易所的可赌价格信息。Execution的主要目标就是决定预测价格要还是不要,以及管理当前仓位,如果合适的话,再发送买卖命令。输出也只有(买、卖、cancel)三种命令,所以也能视为一个黑盒子。交易所和下注对象如果多了,那execution也是分散在各地的,各个execution都管自己的仓位。

为何把策略这样分为两块呢?有道理,model可以用多个execution来操作,execution也可以用于多个不同model上。值得另外开话题。

这里的重点在于:某model+某execution加起来就成了某整体策略。这策略随便改来改去(或者同时进行多个策略),可是都由同样一个manager来进行。他们对外,就是一个策略黑盒子。manager只要安排好他们的关系,也不用再改了,可以随便切换策略那两部分。

绿色Real Exchanges,又称broker:这块东西负责实行execution的命令。他在乎不同交易所不同价格以及不同规则、不同买卖命令格式。任务是把命令真正操作起来,并且反馈报告给execution。任务是处理不同交易所不同网站的细节,让execution不用费心。这里就不接着说了。

黄色Fake Exchanges:也就是另外一些虚拟交易所。如果在用历史数据操作策略,那execution都要调用这块东西,而不是真正的exchange。模拟一个交易所,把execution的命令处理干净,并且给些反馈,哪些交易成功了、哪些失败了。就这样。

为啥有个箭头从Historic Data到Fake Exchange,很值得说明。Historic Data必须把每一个价格发给对应的Fake Exchange。因为Real Exchange可以自己提交东西看看成功了没有(被匹配了多少);但是Fake Exchange不能提交东西。虚拟交易所只能根据真实价格输入才能区分一个下注有否被匹配到。怎么做?那是因为每个价格里面都有详细traded的数据,因此能看出其他玩家每一个交易。所以能看到什么被匹配,什么没有被匹配。简单版本(比如以普通博彩网站),只需要看价格N秒以后还存在否。如果还存在,假设自己抢到了。如果交易所的话,还比较麻烦,得模拟queue position(某价格的排队位置)。这么做才准确。

希望这些解释还足够。如果真按照这些条件,还发生历史数据回测利润过高,那就是回测系统有问题。要么你的历史数据有病,要么你的虚拟交易所有毛病。

---

又写了太多。我还是强调一下吧:无论博彩还是什么金融交易,回测系统无敌重要。做得好就不会出现提主所说的问题。特别是虚拟交易所这零件要做得好一点。

我们举些例子吧:

1)假设你的策略属于最简单的套利类型。交易所或某网站有差价,这就去抢了。那你的回测利润绝对是很高的,因为你都假设了这些东西都抢到了。如果不做虚拟的交易所,怎么知道这些东西到底有没有抢到?回测简直没用。

换句话说吧,正在做套利;实际上很多东西都抢不到(主要原因是那些老大公司把这些东西已经给抢了)。那你可以假设X%的交易抢不到,然后剩下的交易抢不到就选择第二好的价格,或者实在不行直接对冲掉。这些方法似乎很管用,也都能放到模型里面。可关键是你抢不到的东西一点都不随机。抢不到的东西永远是别人比你更快去抢了的。剩下抢得到的都是别人不要的!别人不要只能说明价值零下;利润完全不如任何回测。反正欧洲这边的价格抢到没抢到都是因为它们本身的价值,人家高手都在进行套利,又有好几十个员工,很难跟他比速度对吧。

如何解决:先模拟这些网站,看看价格在N毫秒以后还存在不。普通博彩网站的话,这需要很多账号才能确定。原因:博彩网站很慢更改网站上和api上的价格,大家只能反复开各种betslip才知道价格还在不在。100ms消失和1s消失肯定要分得清清楚楚的。好好地模拟起来真的不容易。

2)回测把某些比赛给筛选掉了,因为总体下注量太少之类的。这种错误我也犯过,哈哈。你筛选掉的那些条件,都是因为后来比赛结束了才知道的信息。这也是一种预测未来,有逻辑错误。筛选到几个比赛,能说明策略能用在所有比赛上吗?每天差不多一千个比赛,有时候不止,如何确定你的策略那么万能?万一你在类似的符合条件的比赛能普遍赢钱,但是其它小比赛都输钱?实时运行也不知道一比赛将来能变成什么样子。用比赛结算后的才得到数据来分类或筛选,直接输了。肯定不准。一条一条价格输入才能避免这种问题。

3)上一条还有夸张版,个人经历过。有个交易所叫必发。他们有公开的每个比赛每个市场具体历史数据。从这些数据就能算出来各种利润高的策略。比如不同bet-type之间如何利润最大化。但是这些都是骗人的数据。里面难问题很多,有些东西也是结算后才知道的;虽然模糊,没想到。用详细真实数据再去模拟,才知道这些策略都没用了。反正不要让实时和回测用不同数据,就不会落入这种陷阱。实时无法得到的东西,千万别用。不同数据来源也不要过于相信,绝对不一致。

4)说一个基本初级错误吧,也是自己曾经经历过的。在计算回测用了向量性方法加速。然后计算利润用了最普通的(buy volume + sell_stake – buy_stake – sell volume)。volume是stake * price。如果两个volume平衡了,那就是sell_stake – buy_stake而已,只不过是买得低卖得高。可是,这还没算进来交易所自己的消费(比如comission)等等。更别说没考虑到spread;直接以为什么都能在当前mid price左右附近抢到。这就太笨了,也只有回测才会出现的错误。但是很难解决,因为那些数据没有具体buy/sell price,只有最近上次交易的price。没用。

5)补充一个;许多交易公司认为model的作用是算出未来的vwap。vwap是前段时间所有交易平均价格。如果你能算出vwap的趋势,这model已经很牛逼了。不同execution只是为了提高接近vwap的具体操作价格。如果一个execution操作起来能接近vwap,甚至超过vwap,那就是牛逼的execution了。所以很多高频公司分为一个model team和一个execution team。可是后来发现单独预测vwap没用啊。因为spread太大,根本没希望抢到接近vwap的价格。

好吧,假设一平均比赛能在vwap的1%以内随便买卖下注。现在vwap为X,最近几十秒所有人的平均交易价格为X。反正所有比赛的平均spread为1-2%,那我们假设每个抢到的东西只vwap差1%。这不是很理性的判断吗?不!很多比赛的vwap都远离了目前现实家族。这让高频交易的人很头疼。你越是相信这些平均的东西,越是误了大事。因为你的策略也有可能在vwap靠谱的时候比较准,在vwap不靠破的时候超级烂。这样你的回测就。。。唉,不说这个了,感觉难以解释。

---

最后举个(或许)最重要的例子吧。因为很多上面答案都有提到。

如何避免自己影响到市场?

要是没有这个问题,那所有回测系统都能算出来春却的利润。只要回测虚拟交易所程序没问题,假设别人都跟过去历史数据一样下注,那都没问题。但是这假设有问题。如果你下注太大,整个市场会被影响到了呢。怎么办?

我们经常讨论这件事。确实存在的。不能把事情做的太大。要不然很难预测。

我的建议是:先从一百块或者最小的余额开始实行策略。或者execution不让仓位超过0.1%当前的总交易量。如果第二天跟自己的(昨天比赛)回测一样,或者差不多,那就没事了,再扩大一倍。继续这样做下去,慢慢扩张。博彩的话,一场比赛仓位达到1%(几万镑)才开始有这些问题。因为有的自动策略以及散户看到了你赌的那一套,他们有反应。之后的交易都受到了影响。到这种规模就可以停止扩展了,因为很难再符合回测。如果你一开始就用大数额去测试,那会影响市场,好傻。只要找到限制就可以。我们的赛马策略就是这样,超过世界1%的交易量就开始不准了,所以一直控制在0.5%左右。

总之,这不是大问题,只是说很多策略有个交易量上限。而且很难超过。毕竟已经稳定挣钱,大概只能去研发新策略新运动。说不定有更高级的机器学习能预测或处理市场反馈。影响市场这问题本身就是所有人所有策略都难以逃脱的陷阱,目前所有策略都有限。

---

最后有些答案说策略过适(overfitting)。这就无语了。回测(backtesting)的作用不就是避免这一套的吗?一定要回测在非training的数据上才能确定自己利润率。这种把数据分成两块还是要重视的,也属于常识吧。

举例现在的足球。里面大概每个月一万多场比赛(实际上更多,但是只有那一万左右是欧洲交易所和亚洲网站都有的)。一个月的数据也各种各样。有的比赛大(比如英超),有的比赛小(比如冰岛三级女子球赛)。这已经也很足够做一次策略回测。每个比赛大概10-100兆左右(压缩以后)。一个月的数据来测试一遍也只要几个小时最多。如果把这一个月分成5000、5000就可以了。确定回测成功了,那就把策略训练在整个一年上(不分两块),需要一礼拜时间。每个礼拜重新训练一次最近的。这足球数据已经很多了,为啥还需要着急?

如果只有几百个比赛,那倒是令人很怀疑吧。

数据不够做测试或者数据没分别好(分成training和backtesting),那都是严重问题。可是最严重的问题是大多数人回测系统不够完善。连一次下注有否成功都无法计算清楚,或者根本没有程序统一,那真的很令人无话可说。只要把回测系统弄得高级一点(或者根据上图实现),应该都能解决得差不多了。

原创文章,作者:花样财经,如若转载,请注明出处:https://www.massflowmeter.cn/216/216.html

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注