【核心技术】高精度逐笔回测篇之序言 

wei-jianan/核心开发

应用场景

量化交易有各种流派和风格,不同流派带来了不同的关注点。但总的来说工作流分两个步骤,策略/因子研究/alpha的挖掘, 和实盘交易/具体的执行,当然研究和实盘之间,为了填平未知带来的风险,会存在不少过度阶段。

研究员|策略师|交易员的研究方式,多年观察下来,还是倾向于自己在一个excel/dataframe里面折腾,使用一堆roll,apply函数,乘上t+1的收益率在取对数,连加,基本上就可以初步判断辛辛苦苦挖掘出来的东西有没有alpha。当然交易成本,执行细节,未来函数(机器学习管这个叫数据泄露),过拟合,市场风格转换(机器学习社区有时管这个叫domain shift)等等问题先暂且不谈。 有些小型机构,或者工程能力有限的研究人员一方面没有意愿,另一方面成本确实有限,就把刚刚一通代码折腾出来的因子/特征等等,按照特定的if else 规则或者 正则化取平均,又或者再加个 ml模型训练的流程,组合起来形成信号下单的逻辑,写到实盘的代码里。至于赚不赚钱,到底能赚多少,策略的收益率 波动率特性,就交给老天保佑 了。

未知-风险存在明显的负相关关系。研究员|策略师|交易员兴奋的结束了与excel/dataframe 的战斗时。 alpha的未知达到了最高点,而风险,没上实盘有什么风险?最大的风险就是光领工资不赚钱被裁员的风险。那么之后为了尽可能低风险的把钱赚了,可以有如下步骤:
    1)把pandas与numpy代码转化成 标准化因子评估框架的代码,用ICIR之类的评价指标评估因子价值。
    2)把因子/特征 和信号或目标持仓结合起来,标准的向量化的回测。
    3) 单子有可能拆的很细,因子产生的信号有可能强推流动性差的金融产品,因子的频率和时效性有可能很高等等 ,交易成本(税+佣金),冲击成本。 综上几种情况, 很有有可能一个看起来有alpha,实际上有alpha的因子/特征 变换成一个个的交易单,就是无法打平执行成本,因而亏钱。 因此需要更高精度,更细力度到每笔下单的回测,能够很大程度上把冲击成本,延迟,交易所的撮合机制模拟出来,从而获得精确的执行成本和尽可能真实的回测收益。
    4)paper trading。把策略上实盘,下单时候打个当前价格的日志。最终综合日志分析,获得一个纸面上交易的pnl。 缺点是,依赖延迟和订单排队位置的maker策略无法模拟,滑点的模拟比较困难。
    5)小资金实盘。 基本能真实的构造出策略的pnl,缺陷是目标仓位过大时对市场的冲击,以及拆单的执行无法得到好的模拟。
以上5条,严谨点可以依次执行,随着alpha的未知性 逐渐降低, 头寸与知识产权暴露的风险逐渐增加。其中4的相对于高精度回测缺陷足够大,开发与分析成本相对于小资金实盘又足够高,个人认为可以删去,接下来的文章暂时不考虑涉及。

用户需求

那么量化的研究这个事儿在设计之初就需要满足一些普遍的原则,能够尽可能的提升效率,并降低使用成本与风险, 其中有一些原则有可能互相拮抗,因此需要权衡取舍。但既要又要才是技术进步的体现,所以全部列出,成年人不做选择,尽量全要。具体总结如下:
    1. 尽量易于编写,方便码力不足的研究人员轻松上手(固定预测的horizon,比如说每15分钟预测一次,即调用一次某个函数,或者A股比较常见的每日盘前调用一次某个回调函数)。同时又需要足够的自由度,可以满足任意类型策略的编写(想用等时间隔ochlv数据也行,想用不等时间隔的逐笔数据来交易也行)。
    2. 与实盘代码尽保持一致,避免代码转写带来的错误与知识产权暴露风险。
    3. 由于成熟机构会尽可能拆解工作流,专人专事,互相依赖。因此实盘和回测都需要满足,因子挖掘,因子组合, portofolio 优化,仓位执行等等抽象。 回测不光是针对策略实现,算pnl 夏普率, 也需要支持因子生成和 因子组合的实现以及做相应的表现评估。
    4. 尽可能模拟出执行与撮合细节,运行回测后得到的pnl精确的如同执行过实盘。如果一个策略实盘了一个月的pnl,和把这个策略拿这一个月数据重新回测一遍的pnl相差无几。那么可以说回测的精度是做到家了。
    5. 要够快。 一个回测速度跟实盘一样的回测系统,其价值极其有限。