原创 | TBQuant数据处理探索——后复权详解(上)
只做专业交易软件
“性能回测”一向是程序化交易者的招牌武器之一,代表了量化交易者对主观交易的降维打击能力。然而,从第一代平台的回测功能诞生到现在为止,关于数据连续性和可靠性的处理一直让人难以满意。
TBQuant在数据处理的环节摸索了很久,最终决定以“后复权”的形式保证数据的连续性和可靠性。为什么会选择后复权?今天就来谈谈数据连续性可靠性处理的探索过程。
数据处理的探索之路
回测对于数据连续性和可靠性到底有什么需求?
首先,性能回测是基于统计学的原理。
我们都知道一种测定硬币重心的方法,就是反复投掷硬币,然后统计正面和反面的次数。如果在大量投掷后,正面和反面的统计结果有着较大的差别,那就说明这枚硬币的质量是不均匀的。这是用统计学的原理,而不是用具体的量表,来判断一个物体的质量分布。
对于策略模型来说,我们也可以在历史行情里面,模拟运行策略模型,然后统计可能发生的交易,统计所有的盈亏,从而评价这个策略模型的性能,这就是性能测试。
这种评价模型的方法,需要一个重要的前提,那就是我们需要统计的可能发生的交易,次数必须较为庞大,并且每次发生的交易的自相关性必须较低。数据连续性,主要无法满足对交易次数的需求。这是为什么呢?
大部分趋势性策略往往是非常低频的策略,很有可能一年之间只发生一两次交易,甚至好几年才有一次交易。在这种情况下,恐怕需要相当长时间的行情数据才能支持产生数十次交易信号。这就是我们遇到的问题:对于期货来说,每一个合约的行情数据至多只有一年,很难发生多次交易,这该如何做性能测试?
有些人认为,应该把到期月份一致的合约连起来,也就是所谓的cc指数。比如,1905合约到期以后,马上接上2005合约。
图为19年1月15日到期交割的合约和19年1月16号上市的合约数据拼接起来,这种就是cc指数。
或者也可以把主力合约连起来,构成888指数。
图为RB888指数,即螺纹钢连续指数。
期货的主力合约,即某个品种持仓量最大的合约,被称为这个品种的主力合约。一般这个合约的交易盘口会比较活跃,适合投机者交易。当前主力合约的持仓量如果被更远期合约超越,那么就产生了“主力换月”,该品种的主力合约就切换成了持仓量更大的远期合约。
然而上面提到的两种拼接方式,无论哪一个,在发生合约拼接转换的时候价格都会产生非常大的跳空,特别是cc指数。这种跳空从理论上来看,大部分是由于新老合约的时间价值不同而产生的,不可避免。这种跳空经常会导致策略产生错误信号,在这里,跳空成为了数据连续性的主要问题。
为了解决这里出现的跳空问题,另外一些人提出,可以模仿股票指数的方法,创造一个商品指数。由于指数稀释了波动性,一般来说不会产生跳空,所以很好的解决了数据连续性的需求。于是,各大期货行情软件纷纷不约而同出现了一种叫做000的商品指数合约。
这种000商品指数合约的常见算法,是将一个品种所有合约的开仓合约市值相加,再除以这个品种所有合约总数,最后得到一个加权平均价格,这就是000商品指数。
000指数 = ∑(合约价格*合约持仓量)/∑合约持仓量
其中分子即为品种的开仓市值总和。下面是一个实际计算案例:
假设一个品种A的合约数据按上表所列示,那么该品种的000指数即为:
合计市值2220000除以合计持仓量10000 = 222
我们看到这个A品种的主力合约即为A02合约,其价格为220,非常接近222的指数价格。指数拥护者认为,这个误差相当小,可以近似把指数作为代替主力合约的数据。
指数有两个非常明显的优点:
第一, 指数基本不会出现跳空。因为指数是由所有合约按持仓量加权计算,如果仅仅是单一合约如果有较大波动,很难影响到指数整体。
第二, 由于指数计算依据是该市场对该品种投入的资金总量,客观来说反应了市场当前对该品种的价格评价。
第一个优点解决了888指数跳空产生错误信号的问题,第二个优点则让指数对于商品有了一个宏观评价。利用好这两个优点,可以有的放矢的开发出一些不错的策略。
然而,000指数并不是完美的测试数据,因为000的算法导致了一种新的问题:数据可靠性问题。
我们先来看这样一个例子。
时间点一:
指数价格 = 4520000/20000 = 226
时间点二:
指数价格 = 4520000/20000 = 226
这里我们可以看到,指数的价格在两个时间点是相同的,都是226。
然而当我们观察主力合约时,便会发现A02合约的价格从220上涨到了260,涨幅达到了(260-220)/220=18%。
另外,次主力合约A03,跌幅达到了(240-180)/240 = 25%。
合约上这样强烈的波动,指数为什么波澜不惊?
这里的例子为了方便说明,条件设定较为夸张。我们观察上面的例子会发现,这种现象有两个特点:
第一,主力合约和次主力的持仓量非常接近,A02合约有10000,占总持仓的50%,而A03有8000,占总持仓的40%,从占比来说相差并不悬殊。
第二,主力合约和次主力合约的价格发生了反向变动。在常规情况下这种变化是很少发生的,但是假如市场出现重大变动导致影响市场近期供需,而对远期供需基本不产生影响,这时便会产生价格反向变动。
从实际观测来,有时候即使没有重大市场变动,在主次合约即将换月的时候,由于市场中存在移仓换月的操作,也会导致两者价格发生反向波动。
综合以上两个特点,由于主次合约的权重占比接近,同时两者又反向价格变动,于是对指数的影响正好被对冲掉,导致指数基本没有变化。
指数既然没有变化,显然不可能触发任何交易信号,然而实际行情很有可能已经天翻地覆。如果说错过的是开仓信号,风险还是可控的。如果错过的是平仓信号,甚至是止损信号,这个风险就不可控了。
商品指数数据的不可靠问题一般出现在意外行情和换月的时候较多。从时间频率上来说并不频繁,而且若能辅助做一些风控手段,比如根据账户风险度减仓等措施,是可以有效规避不可靠问题。但是对于回测来说,仍然无法将真实的历史交易记录体现出来,所以使用指数回测依然不是完美的选择。
数据不可靠问题是000天生算法的缺陷,这条路已经走死了,无法再改进下去。难道就没有完美的数据供回测使用了吗?如果我们把注意力收回到主力连续888上,对888指数进行改进,却能取得意想不到的效果!
(未完待续...)
▲
0条评论