五 量化交易全流程( 三 )


For 循环回测系统
For循环回测系统是最直观的回测系统 。For循环系统比较简单直观 , 所以很多回测使用的都是For循环系统 。For循环系统是指针对每一个数据点进行遍历 。比如 , 对于日线数据 , 就是循环遍历每一个OHLC(Open、High、Low、Close)数据 。在遍历的时候同时进行计算 , 比如计算移动均线 , 然后在此过程中决定是买人还是卖出某资产 。一般是以当天的收盘价或者第二天的开盘价作为买人或者卖出价 。当然 , 有时候为了止损止盈 , 也需要使用不同的价格 。
For循环系统的优势具体总结如下 。
□ For循环系统最符合人类交易的直觉 , 简单直观 , 易于实现 。任何语言都可以用来快速地实现一个For循环系统 , 所以For循环系统非常常见 。
□For循环系统可以解决"路径依赖"的问题 , 因为我们是依次迭代每一个数据点 , 这样在计算当前数据点的时候 , 前面的结果都已经计算好了 , 可以直接使用 。
For循环系统的劣势具体总结如下 。
□相对于向量化系统 , 速度比较慢 。比如 , 在中使用进行迭代循环 , 就会比较慢 。或者在中使用循环 , 也会非常的慢 。如果数据量比较小 , 则速度慢是没关系的 。但是很多回测数据量其实是比较大的 , 比如回测2000支股票数据 , 这种情况下 , 速度就非常重要了 。
□比较容易出现前视偏差 。比如 , 我们在编写策略逻辑的时候 , 经常会使用索引值来调用不同的数据点 , 比如使用i-1来调用前一个数据点 。这个时候可能会出现失误 , 调用了i+1的值 。而这个值在回测中应该是未知的 , 这样就出现了前视偏差 。
□ For 循环只能用于测试 , 而不能用于实盘 , 这样回测和实盘就分别拥有两套代码了 。同时维护两套代码 , 可能会出现逻辑不一致的问题 。
事件驱动系统
事件驱动系统会尽可能地模拟真实的交易机制 , 是一种结构更为复杂的系统 。在事件驱动系统中 , 交易相关的所有行为都是由事件触发的 。比如 , 当前K线结束了 , 我们需要做什么?发出委托之后 , 我们需要做什么?委托成交之后 , 我们需要做什么?事件驱动系统详尽地定义了交易中可能发生的每一个相关事件 , 并用函数的形式来指定发生对应事件后所应采取的行动 。
事件驱动系统具有很多优势 , 具体如下 。
□避免"前视偏差" 。因为在事件驱动系统中 , 所有的数据只有等事件发生之后(比如下一根K线开始了) , 才会看得到这个数据 , 并采取相应的行动 。这样就完全避免了不小心使用未来函数 。
□代码复用 。很多事件驱动系统其本身就带有实盘交易模块 。这样 , 回测程序就可以直接用于实盘交易中了 。回测和实盘交易使用的是同一套代码 , 非常便于维护 。
□ 可以最大程度地模拟真实交易 , 甚至包括下单的冲击成本都可以模拟 。
事件驱动系统虽然具有很多优势 , 是非常完善的系统 , 但其也有如下缺点 。
□ 实现困难 。事件驱动系统是一个比较复杂的系统 , 需要进行精心的设计和调试 , 也就是说 , 需要花费大量的精力在该系统上 。对于一个IT开发人员来说 , 这个问题可能并不算困难 。但对于很多策略研发者、投资经理来说 , 自己开发则几乎是不可能的任务 。当然 , 好消息是现在有很多开源框架可以使用 , 但即使是开源框架 , 想要入手用起来也有一定的学习曲线 。