如上所述,您将从量化交易的“您好世界”开始:移动均线交叉。您将开发的策略很简单:您可以创建两个独立的简单移动平均线(SMA),它们具有不同的回溯期,假设是40天和100天。如果短时移动平均线超过长移动平均线,那么您就走长线,如果长移动平均线超过短移动平均线,则退出。 记住,当您走长线时,您认为股票价格会上涨,将来会以更高的价格卖出(=买入信号); 当您走短线的时候,您卖出您的股票,期望您能以更低的价格买回来,实现利润(=卖出信号)。 当您刚刚开始时,这个简单的策略可能看起来很复杂,但让我们一步步来: 首先定义您的两个不同的回溯期:短窗口和长窗口。您设置两个变量并为每个变量分配一个整数。确保您分配给短窗口的整数小于分配给长窗口变量的整数! 接下来,创建一个空的signals DataFrame,但确保复制您的aapl数据的索引,以便您可以开始计算您的aapl数据的每日买入或卖出信号。 在您的空signals DataFrame中创建一个名为signal的列,并将其行全都初始化为0.0。 在准备工作之后,是时候在各自的长短时间窗口中创建一组短和长的简单移动平均线了。利用的rolling()函数,启动滚动窗口计算:在函数中,指定window和min_period,并设置center参数。在实践中,您将short_window或long_window传递给rolling()函数, 由于窗口观测必须要有值,将1设置为最小值,并设置False使标签不设定在窗口的中心。接下来,不要忘记链接mean()函数,以便计算滚动的平均值。 在计算了短期和长期窗口的平均值后,当短移动平均线跨过长移动平均线时,您应该创建一个信号,但只能在该周期大于最短移动平均窗口期间创建信号。在Python中,需要满足这么一个条件:signals['short_mavg'][short_window:] > signals['long_mavg'][short_window:]。请注意,您添加[short_window:]用以满足条件“只能在大于最短移动平均窗口期间”。当条件为真时,初始化为0.0的signal列将被1.0覆盖。一个“信号”被创建了!如果条件为假,则0.0保留原始值,不生成信号。您可以使用NumPy的where()函数设置此条件。与您刚才读到的一样,您分配这个结果的变量是signals['signal'][short_window],用以在该周期大于最短移动平均窗口期间创建信号。 最后,您可以收集信号的差异,用以产生实际的交易订单。换句话说,在signals DataFrame的这一列中,无论您是买入还是卖出股票,您可以区分长仓和空头。 请看这里的代码。 这不是太难了?输出signals DataFrame并检查结果。重点是这个DataFrame 中positions和signal列的意义。当您继续前进时,您会看到,atv,这将变得非常重要! 当您花费时间了解您的交易策略的结果时,就可以使用Matplotlib快速绘制所有的这些(短期和长期移动平均线以及买入和卖出信号): 您可以在这里找到这个图表的代码。 这结果很酷,不是吗? 对交易策略进行回溯测试 现在你已经掌握了你的交易策略,下一步对它进行回溯测试并计算其业绩是一个很好的想法。但是,在深入了解这一点之前,你可能需要稍微了解下回溯测试(backtesting)的缺陷,在回测器(backtester)中需要哪些组件以及你可以使用哪些Python工具来回测你的简单算法。 若你已经具备了这些知识,你可以继续开始运用你的回测器(backtester)。 回溯测试除了“测试交易策略”之外,还对相关历史数据的策略进行了测试,来确保你在采取行动之前,这是一项切实可行的策略。通过回溯测试,交易员可以在一段时间内模拟和分析具体策略的交易风险和盈利能力。但是,当你做回溯测试时,请明智的记住这其中会存在一些开始时可能并不明显的陷阱。 例如,存在一些外部事件,如市场制度转变,这些通常是监管变化或宏观经济事件,绝对会影响你的回溯测试。还有流动性方面的限制,如禁止卖空,可能会严重影响到你的回溯测是。 接下来,你可能会提醒自己一些其他陷阱,在你比如,过度拟合一个模型(优化偏差)时,在你因认为这样更好(介入)而忽略策略规则,或者在你意外地将信息引入到过去的数据(前视偏误)时。 当你真正去做自己的策略并回溯测试它们的时候,你会发现教程提到的这些陷阱只占需要考虑的很小一部分。 (责任编辑:本港台直播) |