请选择 进入手机版 | 继续访问电脑版
楼主: 量化老KK
1348 2

[程序化交易] 数据处理探索——后复权详解(上) [推广有奖]

  • 0关注
  • 5粉丝

本科生

39%

还不是VIP/贵宾

-

威望
0
论坛币
20 个
通用积分
7.7156
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
663 点
帖子
37
精华
0
在线时间
45 小时
注册时间
2019-11-20
最后登录
2023-8-1

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

“性能回测”一向是程序化交易者的招牌武器之一,代表了量化交易者对主观交易的降维打击能力。然而,从第一代平台的回测功能诞生到现在为止,关于数据连续性和可靠性的处理一直让人难以满意。

TBQuant在数据处理的环节摸索了很久,最终决定以“后复权”的形式保证数据的连续性和可靠性。为什么会选择后复权?今天就来谈谈数据连续性可靠性处理的探索过程。

回测对于数据连续性和可靠性到底有什么需求?

首先,性能回测是基于统计学的原理。

我们都知道一种测定硬币重心的方法,就是反复投掷硬币,然后统计正面和反面的次数。如果在大量投掷后,正面和反面的统计结果有着较大的差别,那就说明这枚硬币的质量是不均匀的。这是用统计学的原理,而不是用具体的量表,来判断一个物体的质量分布。

对于策略模型来说,我们也可以在历史行情里面,模拟运行策略模型,然后统计可能发生的交易,统计所有的盈亏,从而评价这个策略模型的性能,这就是性能测试。

这种评价模型的方法,需要一个重要的前提,那就是我们需要统计的可能发生的交易,次数必须较为庞大,并且每次发生的交易的自相关性必须较低。数据连续性,主要无法满足对交易次数的需求。这是为什么呢?

大部分趋势性策略往往是非常低频的策略,很有可能一年之间只发生一两次交易,甚至好几年才有一次交易。在这种情况下,恐怕需要相当长时间的行情数据才能支持产生数十次交易信号。这就是我们遇到的问题:对于期货来说,每一个合约的行情数据至多只有一年,很难发生多次交易,这该如何做性能测试?

有些人认为,应该把到期月份一致的合约连起来,也就是所谓的cc指数。比如,1905合约到期以后,马上接上2005合约。

1.png


图为19年1月15日到期交割的合约和19年1月16号上市的合约数据拼接起来,这种就是cc指数。

或者也可以把主力合约连起来,构成888指数。

2.png


图为RB888指数,即螺纹钢连续指数。

期货的主力合约,即某个品种持仓量最大的合约,被称为这个品种的主力合约。一般这个合约的交易盘口会比较活跃,适合投机者交易。当前主力合约的持仓量如果被更远期合约超越,那么就产生了“主力换月”,该品种的主力合约就切换成了持仓量更大的远期合约。

然而上面提到的两种拼接方式,无论哪一个,在发生合约拼接转换的时候价格都会产生非常大的跳空,特别是cc指数。这种跳空从理论上来看,大部分是由于新老合约的时间价值不同而产生的,不可避免。这种跳空经常会导致策略产生错误信号,在这里,跳空成为了数据连续性的主要问题。

为了解决这里出现的跳空问题,另外一些人提出,可以模仿股票指数的方法,创造一个商品指数。由于指数稀释了波动性,一般来说不会产生跳空,所以很好的解决了数据连续性的需求。于是,各大期货行情软件纷纷不约而同出现了一种叫做000的商品指数合约。

这种000商品指数合约的常见算法,是将一个品种所有合约的开仓合约市值相加,再除以这个品种所有合约总数,最后得到一个加权平均价格,这就是000商品指数。

000指数 = ∑(合约价格*合约持仓量)/∑合约持仓量

其中分子即为品种的开仓市值总和。下面是一个实际计算案例:

3.png


假设一个品种A的合约数据按上表所列示,那么该品种的000指数即为:

合计市值2220000除以合计持仓量10000 = 222

我们看到这个A品种的主力合约即为A02合约,其价格为220,非常接近222的指数价格。指数拥护者认为,这个误差相当小,可以近似把指数作为代替主力合约的数据。

指数有两个非常明显的优点:

第一, 指数基本不会出现跳空。因为指数是由所有合约按持仓量加权计算,如果仅仅是单一合约如果有较大波动,很难影响到指数整体。

第二, 由于指数计算依据是该市场对该品种投入的资金总量,客观来说反应了市场当前对该品种的价格评价。

第一个优点解决了888指数跳空产生错误信号的问题,第二个优点则让指数对于商品有了一个宏观评价。利用好这两个优点,可以有的放矢的开发出一些不错的策略。

然而,000指数并不是完美的测试数据,因为000的算法导致了一种新的问题:数据可靠性问题。

我们先来看这样一个例子。

时间点一:

4.png


指数价格 = 4520000/20000 = 226

时间点二:

5.png


指数价格 = 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指数进行改进,却能取得意想不到的效果!

(未完待续...)

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


chenjichao 在职认证  发表于 2020-4-1 21:28:08 来自手机 |显示全部楼层 |坛友微信交流群
量化老KK 发表于 2020-4-1 16:39
“性能回测”一向是程序化交易者的招牌武器之一,代表了量化交易者对主观交易的降维打击能力。然而,从第 ...
好文

使用道具

tianwk 发表于 2020-4-3 23:09:48 |显示全部楼层 |坛友微信交流群
thanks for sharing

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-29 08:04