附录C 理解连续合约
如果你想用股票或商品数据来进行分析你就需要考虑真实交易数据干扰的问题了。在商品中,这意味着当主力合约面临换月时所发生的交易。你需要先平掉该合约,然后在下一个主力合约处开仓。在股票中,这意味着股票拆分和分红派息对数据的影响。本附录将介绍构建和使用连续合约的方法,以便让对该合约的模拟测试结果,能与存在这些干扰时的真实交易结果一致。
对股票拆分和股息的适当处理
大多数股票数据软件都会提供以下几种数据格式选项: 每天的实际历史股票价格(原始数据)、对股票拆分进行调整后的价格流(拆分调整)、对上市公司所支付的股息进行调整后的价格流(股息调整) 。对于任何给定的资金在一段时间内的变化,这些历史价格流中的所有信息都要求是正确的,但不幸的是,如果支付股息或股票拆分发生在计算日之后时,这些价格流将会产生错误的结果。
实际价格文件中的问题
为了说明这一点,我们将用IBM 价格流来作为实例。在1999 年5 月5日, IBM 有一次2 : 1 的股票拆分。IBM 在该交易日的收盘价位236.25 美元。IBM 将用两股替换现存的一股,并将价格调整为118.125 美元。每个股东所持有的股票的价值维恃不变,因为每个股东现在都以拆分前价格的一半,持有了双倍的股份数。表C-1显示了IBM 在拆分发生前后几天里的实际价格数据。

如果你用实际价格文件来做分析,并且你在1999 年5 月24 日以收盘价入场做多,并在1999 年6 月1日 以收盘价退出交易,你的交易会损失约112 点,或50% 。在实际中,拆分后的两股股会在1999 年6 月1日价值224 美元,你的交易实际上是赚了点钱的。看了这个例子,你可能就知道,唯一的问题是,实际价格数据流中发生了拆分。还有另一个问题:实际价格数据流产生了不正确的结果,因为它并没有考虑支付的股息。
为了说明这一点,IBM 在2005 年2 月7 日发放了0.18 美元/股的股息。表C-2显示了该交易日附近几天的实际价格数据。

如果你用这个数据来做测试在2005 年2 月7 日以收盘价进入了一笔多头交易,并在2005 年2 月8 日以收盘价退出。你的测试结果显示,你每股亏了0.40 美元。但考虑到0.18 美元的股息,你实际上每股只亏了0.22美元。
在使用真实价格数据时,如果你已经消除了拆分附近的不利交易,由于股息的影响比较小,因此你的结果也是相对精确的。对一些分析师而言,这个说法可能是正确的,但对于那些针对股息效应的研究而言,则存在严重的问题。在1980 至2005 年3 月,IBM 所支付总股息为64.32 美元。在这段时间里,IBM 经历了2 次股票拆分,总共上涨了238.8 点。在忽略股息的情况下,IBM 自1980 年开始上涨了383% 。当考虑股息时,实际的增长率为473% ,这是一个显著的差异。
拆分调整文件中的问题
使用经拆分调整的数据流来做分析,也会导致类似的问题。表C-3 显示了IBM 最近一次拆分时的实际收盘价和拆分调整收盘价。

拆分调整数据流使用实际价格水平除以拆分值来得到的,在本例中,拆分值为2,拆分时间为1999 年5 月26 日。IBM 在1980 年以来的另一次拆分,发生在1996 年。在那一次2 : 1 的拆分中,在拆分日及之前的实际价格,需要除以四。使用拆分调整数据来进行分析的问题是,每天的价格变化以及波幅都需要除以拆分值。1999 年5 月25 日的价格实际变化,在下一个交易日收盘价之前,都是略大于15 点的。但在拆分调整的数据中,则仅反映为约7.5 点。
这会导致许多分析问题。如果你用某种形式的基于波动率或幅度的系统,那这些值就会在不断的拆分中人为变化。这会进一步导致交易的改变。如果IBM 又发生了一次2 : 1 的拆分,则1999 年5 月26 日至1999 年5月27 日的经调整后的价格变化,就会从约7.5 变化至约3.75。
拆分调整的价格流也会存在与实际价格流一样的问题: 支付股息所导致的变化没有被包含在内。
股息调整文件中的问题
股息调整文件是通过回溯时间,在实际价格数据中减去累积的股息来得到的。表C-4 显示了在最近一次股息分配一2005 年2 月7 日支付0.18美元股息时的实际收在价和股息调整收盘价。

在股息调整文件中, 2005 年2 月7 日至2005 年2 月8 日的0.22 美元的价格变化被正确显示了。但使用该文件所存在的问题是,随着我们向前回溯,股息调整价格会离实际价格越来越远。在1980 年1 月2 日,股息调整后的收盘价为-2.828 ,而当时IBM 的实际价格为62.5 。
股票数据问题小结
没有一种数据流能精确的反映历史上的真实情况。显然,应该综合的使用实际价格,以及拆分和股息信息。但没有一种可获得的价格流能提供所需的所有信息。
解决办法
对该问题,有一个简单的解决办法。可以把这气种数据流汇总起来,生成一个价格流,以真实的反映任何阶段中所发生的情况。在这个算法中,会用到以下几个步骤:
1. 用实际价格数据和拆分调整数据来发现每一天中由于拆分而存在的乘数因子。每一天,都用拆分调整收盘价除以实际收盘价,来确定该乘数因子。在数据的初期,该因子会为1 ,直到出现第一次拆分。接下来该因子就会根据拆分的比例(2-1 、3-1 、1-3 等)而变化。每出现一次拆分,该乘数因子都会发生改变。
2. 用实际价格数据和股息调整数据来确定在不同时间里的累积股息量。每一天,都用实际收盘价减去股息调整收盘价,来确定在该交易日之前所发放的累积股息量。
3. 用每天的实际价格乘以该日的乘数因子,再减去该日的累积股息,从而构造出一个向后调整的连续合约。
4. 将该向后调整的合约的日期、开盘价、最高价、最低价和收盘价写下来,再最后加一项:那一天的实际收盘价。
表C-5 显示了IBM 的连续合约的第一行和最后一行数据。

该数据流精确的反映了IBM 在过去25 年中的增值情况。2005 年3 月14 日收盘价,与1980 年1 月2 日收盘价之间的差距约为303 点,包括在拆分中存在的238 点价格增值,以及这些年中所支付的64 美元的股息。
请注意,这个数据文件包括了计算每个点时的精确变化和百分比变化所需的所有信息。连续合约中的每日变化与实际变化是相同的,因此点数变化是精确的。当用实际收盘价来相除时,我们又可以获得精确的百分比变化。表C-6 显示了一段时间的连续合约和实际价格数据。请注意看每日价格变化是如何在两个数据流中保持一致的。

连续合约和实际价格合约的每天价格变化是相同的,因此该连续合约精确的反映了历史的点数变化。为了确定不同时间段内的百分比变化,将使用连续合约数据来得到点数变化,用实际价格数据(连续合约数据中最后一列)来得到百分比变化。
请注意,价格的日内变化也可以被精确的确定。表C-7 显示了该连续合约的某一天巾的模拟数据。

现在假设你的策略会在连续合约为-6 时入场做多。利用连续合约收盘价与实际收盘价之间的已知关系,我们可以确定入场时的实际价格。该实际收盘价会比连续合约的收盘价高68 点,因此该笔在连续合约为-6 时的交易,其实际入场价将为62 美元。
正确数据所能产生的差异
为了说明不同数据流所能产生的差异,我们将分别使用连续合约、实际价格合约、拆分调整合约和股息调整合约来交易针对IBM 的一个策略。我们的交易策略使用了下列的规则:
● 如果收盘价在收盘价的10 日均线之下,则在收盘时买入。并在入场价上方15% 处放置一个止盈,在入场价下方15% 处放置一个止损。
● 如果价格在10 日均线之上,并且该交易已经至少存续了20 个交易日,则退出交易。
● 如果收盘价低于止损价,则退出交易。
● 如果收盘价高于止盈价,则退出交易。
表C-8 显示了使用者四种数据流时的交易结果。

虽然实际价格和拆分调整合约的盈利交易数和亏损交易数在25 年的测试期里与实际情况比较接近,但盈利点数和盈利百分比却存在巨大的差异。
再来看一下股息调整的结果,这个盈利的系统看上去好像在亏钱。对于百分比,股息调整文件在1980 年1月2 日时已经接近零了。小幅的每日变动,在除以该很小的值的情况下,会产生非常大的盈利或亏损百分比。这些交易的不良偏度导致了这个净效应。盈利点数会这么小的原因,则与止损和止盈有关。这些止损和止盈点会比实际情况更容易被触及,因此总的结果就不能反映真实交易。
连续合约则不仅反映了真实交易,相比其他价格数据,在使用相同的交易系统时,它还产生了更好的结果。若所交易的是个成功的系统,则常常会出现这样的情况。因为连续合约相对于其他合约有更大的变化幅度。在本质上,就会有更多的盈利。
股票连续合约小结
如果你在开发股票策略时使用了过去很多年的数据,你的结果就会是不精确的,而这些数据则可能是非常不精确的。如果你所使用的数据流包括了使用实际价格、拆分和股息来适当调整的价格,那你的结果可能会反映实际交易,并且其表现可能比使用其他价格流时的结果更好。如果你有一个很好的交易系统,你可能需要问向己,是否是因为数据的问题,导致了不好的测试结果。
对商品合约展期的适当处理
对于商品中存在的交易干扰,处理起来就要简单得多。唯一的调整方式是,当当前合约临近到期时,从当前合约展期至下一个合约。这是通过把这些合约拼起来,形成一个人造的数据流来实现的。在展期的那一天收盘时,把新合约的收盘价与旧合约的收盘价之间的差,加在之前的所有数据点上(开盘价、最高价、最低价和收盘价) 。这种向后调整的方法,会抬高或压低之前的所有数据,因此这些价格不会与历史合约价格相匹配,但开盘价、最高价、最低价和收盘价之间的正确关系仍被保留下来,每天的收盘价之间的差异也是如此。
几乎所有的数据提供商都会提供这些连续合约,一些提供商还会让客户来选择展期时机的判断标准。最常用的判断标准是,当下一个合约的持仓量超过了当前合约的持仓量。不同的展期标准会导致数据流之间存在细微的区别,但它们都是有效的数据流。