正文
我们会买入Apple股票23次,并抛出Apple股票23次。如果我们仅持有多头仓位,在6年期间只会进行23笔交易,然而,如果我们在每次多头仓位终止后,由多头仓位转为空头仓位,我们一共会进行23笔交易。(请记住,更加频繁的交易并不一定就是好的,交易从来不是免费的。)
你可能会注意到,目前的系统并不是很健全,即使是一个短期均线超过长期均线的短暂瞬间,交易也会被触发,并导致交易立即结束(这样并不好,不仅仅是因为每一笔实际交易都伴随着一笔费用,已获得的收益会因此被迅速稀释)。
此外,每个牛市行情都会立即转换到熊市行情,如果你在构建一个允许看涨押注和看跌押注的交易系统,这会导致在一笔交易结束时,立即触发另一笔在股市中反向押注的交易,这看起来又有些挑剔了。
一个更好的系统应该根据更多的证据来判断股市正朝着发展的特定方向,但我们现在不会关心这些细节。
现在,让我们尝试着确定每次买入和抛出股票时的价格。
从上面我们可以看到,在2013年5月17日,Apple股票的价格大幅下跌,我们的交易系统似乎不能很好地处理这种状况。
但是,这次股价下跌并不是因为Apple公司受到了巨大的冲击,而是由于股票拆分。尽管派付股息不如股票拆分那样明显,但是这些因素仍可能影响到我们交易系统的效果。
我们不希望我们的交易系统因为股票拆分和派付股息而表现得很糟糕。我们应该如何处理这种情况?一种方法是获取股票拆分和派付股息的历史数据,并设计一个处理这类数据的交易系统。
这或许是最好的解决方案,能够最为真实地反映股票的行为,但是它过于复杂。另一种解决方案是根据股票拆分和派付股息的情况调整股票价格。
雅虎财经只提供调整后的股票收盘价,但是对于我们来说,要得到调整后的开盘价、最高价、最低价,这样就足够了。已调整收盘价计算方式如下:
pricetadj = mt x pricet
其中,mt是用来调整股价的系数。只需进行一次除法就可以求出mt的值,因此,我们可以使用收盘价和已调整收盘价来调整股票的其他所有价格。
让我们回到前面,调整Apple的股价,并用这些调整后的数据重新评估我们的交易系统。
你可以看到,根据股票拆分和派付股息情况调整后的股票价格有明显的不同。从现在开始,我们将使用这些数据。
现在,让我们创建一个价值100万美元的虚拟投资项目,根据我们建立的规则,看看它会如何表现。规则包括:
-
在任何交易中,仅投资所有投资总额的10%。
-
如果损失超过交易金额的20%,则退出仓位。
在模拟的过程中,牢记以下几点:
股票交易以100股为单位。
我们的止损规则包含在股价下跌至一定程度时将股票抛出的指令。因此,我们需要检查这一期间的低价是否已经足够得低,以至于触发止损指令。实际上,除非我们买入了看跌期权,否则我们无法保证以设置的止损价格抛出股票,但为简单起见,我们将这个价格作为抛出价。
每一笔交易都需要向经纪人支付一笔佣金,这部分费用应该计算在内。但在这里我们不这样做。
回溯检验按如下方式进行:
我们的投资项目总值在六年间增长了10%。考虑到任何一笔交易仅涉及所有投资总额的10%,这样的表现并不差。
请注意,这个交易策略并不会触发我们的止损指令。难道这意味着我们不需要止损指令吗?要回答这个问题并不简单。毕竟,如果我们选择了另一个不同的股价来判断是否抛出股票,止损指令可能真的会被触发。
止损指令会被自动触发,且不会询问指令被触发的原因。这意味着股价的真实变化与短暂波动都有可能触发止损指令,而后者我们更为关心,因为你不仅要为订单支付费用,而且还无法保证以指定的价格抛出股票,这可能会使你的损失更大。
与此同时,你交易股票的走势仍在继续,如果止损指令不被触发,你甚至可以从中获利。也就是说,止损指令能够帮助你保持自己的情绪,继续持有股票,即使它已经失去了自己的价值。如果你无法监控或快速访问自己的投资项目,例如在度假,它们也能发挥作用。
我曾介绍过一些关于赞成和不赞成止损指令的观点,但从现在起,我不会要求我们的回溯检验系统考虑止损指令。虽然不太现实(我确实相信在工业中实际应用的系统能够考虑止损规则),但这简化了回溯检验任务。
更为真实的投资项目不会将投资总额的10%押注在一只股票上。更现实的做法是考虑在多只股票上分散投资。涉及多家公司的多笔交易可能会在任何时刻进行,并且大多数投资项目会选择股票交易,而不是现金。
既然我们将在多只股票上投资,只有当移动均线交叉(不是因为止损)时才退出仓位,那么我们需要改变进行回溯检验的方式。
例如,我们将使用pandas中的DataFrame来记录所有考察股票的买入、抛出订单,前面的循环代码也需要记录更多的信息。
我实现了为多只股票创建订单数据的代码,以及一个执行回溯检验的函数。