okaa

一个隐蔽的偷价行为

在说这件事之前,先来聊聊label的事儿。

label就是你预测的目标,它是一个未来的值,最常见的是未来的收益率,第二常见的是未来的波动率,它还可以再复杂一些,比如未来一个固定收益率的阈值,预测的目标是收益率会不会超过这个固定的阈值。

label可以是一个连续的值,比如连续的收益率或者波动率。也可以是简单的-1/0/1分类,分别对应下跌、持平和上涨。

上面是label的背景。现在我把label锁定为未来的收益率,有几种方式可以计算收益率。

我一般采用两种方式计算收益率。第一种是用收盘价来算,第二种是用vwap来算,可以算对数收益率,也可以算百分比收益率。

用哪一种价格来算收益率好呢?

收盘价是一个采样价格,是最后交易时段的一个瞬时价格,它反映了价格的最终走势。缺点也显而易见,它没有考虑到整个时间段的成交量信息,并且在流动性较低时,这个采样价格可能会被操纵。

我经常看到一些策略分享,这些分钟级别的策略用收盘价撮合回测,最后得到了一条四十五度笔直向上冲的曲线——这往往都是自娱自乐的假象,真实交易的时候spread会把微薄的利润吃干抹净。

另一种vwap价格,它考虑了整个时段的成交量,反映了一个更公允的价格水平,也更难被操纵。但由于vwap是基于整个交易时段的价格和成交量来计算的,它是一个累积的值,所以在价格波动时vwap并不能迅速做出反应。

思虑再三,我决定用能刻画整个交易时间段成交量信息的vwap,来计算收益率,进而用来寻找优秀的因子。在构造好初始特征和算法后,一锅一锅的因子应运而生。

接下来,我紧锣密鼓地把这批因子喂进模型,得到最后的仓位,然后测算真实的回测收益。

就在这一步,我犯了个很傻笔的错误。在测算真实回测收益时,我用到的收益率是vwap的收益率。于是…

几乎所有样本内外的回测长的都像上图,一根根45°拔地而起的窜天猴让我喜出望外,感觉明天就能把摊子支棱起来了。

但是心里隐隐约约觉得肯定有不对的地方,然后我回过头来仔细检查,我的回测代码和数据都木有问题,错就错在vwap来计算收益率这个地方。

不仅仅因为vwap是一个不能被成交到的价格,而且这个vwap还有一个隐藏的坑,它还包含了一部分已经发生的历史信息,这一段信息已经被很多因子描述出来了,我获得了错误的价格优势,所以回测曲线呈现出vwap收益率和因子极为明显的线性关系。

然后我重新调整到用收盘价来计算收益率,终于得到了合理的稳定亏损曲线,好了可以洗洗睡了:

以上就是一个傻逼错误从产生到被发现的故事。

退出移动版