把通达信公式与量化交易放在一起谈,先说结论:公式的输出是一列数值或者一串成立与不成立的判定,交易是一连串带时间与数量的动作。两者之间隔着几道环节,跨过去需要的不只是写公式的能力。
下面按公式输出的形态、从信号到动作之间缺的环节、回测口径的两种做法、公式里不容易做到的事、以及什么时候公式已经够用来写。文中函数与操作按通达信公式体系的通用描述,不同版本对外部接口与数据范围的支持存在差异。
一、公式的输出是一个序列,不是一笔交易
算式在每一根 K 线上算一次,得到一整列数值。条件类算式得到的是每一根上的成立与不成立。这一列结果描述的是「在给定的数据与算法下,每个位置上是什么状态」,它不包含任何动作信息。
量化交易需要的是另一套东西:在哪个时间点、以什么方向、动用多少仓位。一个状态序列转成动作序列,中间要补上几项规则,而且每一项规则都会改变最终结果。把条件成立等同于动作发生,是通达信公式与量化交易之间最需要先分清的一处。
{ 条件成立与动作之间还差几项 }
条件:CLOSE>MA(CLOSE,20);
{ 这一行只说状态,不说任何动作 }
二、从信号到执行之间缺的四个环节
| 环节 | 需要补的规则 | 不补会怎样 |
|---|---|---|
| 成交假设 | 以哪个价格成交、什么时间点成交 | 无法计算一次动作的结果 |
| 成本 | 手续费、印花税、滑点的取值 | 结果与实际差距随动作次数放大 |
| 数量与资金 | 每次动用多少、总资金如何分配 | 无法比较两套规则的效果 |
| 执行与约束 | 涨跌停、停牌、最小交易单位 | 出现现实中无法完成的动作 |
第二行值得单独说。成本对动作次数敏感:同一套条件,动作次数增加一倍,成本对结果的抵消作用也大致翻一倍。评价一套规则时只统计条件成立的次数,不扣除成本,得到的结论会偏乐观。这两项数据在公式里算不出来,需要另外维护一张表。
第三行是公式与策略的分水岭。公式不区分仓位,条件成立就成立;策略需要把结果映射到具体的数量上,同一组条件配上不同的数量规则,最终结果差别很大。
三、回测口径的两种做法
公式语言能做的是逐根重算:把每根上的条件算出来,再看这些位置之间的取值变化。这种口径在统计上有用,它描述的是条件本身的分布特征,例如条件在多长的时间窗里成立了多少次、成立之后的取值变化落在什么范围。
策略回测需要的是事件驱动口径:按时间顺序,逐个事件判断动作能否成立,再更新资金与持仓状态。两种口径的差别体现在三处。
第一处是同一根内的先后顺序。逐根重算把一根当成一个整体,事件驱动要区分一根之内的开、收、最高、最低出现的先后。涉及同一根内的动作时,两种口径给出的结果可能不同。
第二处是资金状态。逐根重算不维护资金,事件驱动要维护,并且资金状态会影响后续动作能否成立。
第三处是成本与约束。逐根重算里没有这两项,事件驱动必须带上。
四、公式里不容易做到的事
有几类内容不是写不出来,而是不适合放在公式里。
第一类是账户相关的取数。公式的取数对象是行情与品种属性,它读不到账户资金与持仓。涉及数量与资金的规则放在公式外面维护。
第二类是按时间顺序分步的过程。语言里没有循环与状态机,能表达的是逐根计算。带阶段、带状态切换的过程需要另找环境。
第三类是读写本地文件与外部数据源。常规算式做不到,需要外部动态库或独立的程序。
第四类是撮合与成交。公式不产生动作,也不记录成交,它不承担这一层职责。回测与风险验证的常见做法,见 指标回测与风险验证 一栏。
五、公式与策略之间的三种衔接方式
不必一步跨到完整的环境里。中间的衔接方式有三种,成本依次上升,可以按需求选择停在哪一层。
第一种是把公式当成初筛工具。算式筛出一份名单,后续的动作规则由人工按事先定好的文本执行。这种方式不需要额外的环境,代价是执行过程依赖人的一致性,规则越复杂越容易走样。它的适用边界是规则条数少、判断口径可以用一两句话写完的场景。
第二种是把公式的输出导出来,在表格里补齐成本与数量规则。公式负责算出每个位置上的状态,表格负责按时间顺序把它们变成动作序列并扣减成本。这种方式把「计算」与「记账」分开,两段各自可以单独核对,出错时定位也清楚。需要横向比较几套规则时,这一步基本要走到。
第三种是把规则整体交给支持完整编程能力的环境实现,公式只作为规则描述的一部分保留。走到这一步的前提是需求里出现了按顺序分步、状态切换、读写外部数据这类动作。到了这一层,评价的指标从「条件算得对不对」变成「整套流程是否可复现、可核对」。
三种方式的共同点是:条件本身的正确性都必须先验证过。第一层的名单错了,后面两层只是在错误结果上继续加工。先做条件核对,再往后走,顺序不能颠倒。
六、什么时候公式已经够用
通达信公式与量化交易之间不是一条必须走完的路。需求停在下面几类时,公式本身就够用。
- 把观察口径固定下来,让同一个判断在不同时间、不同品种上按同一套规则执行。
- 把重复的手工统计交给算式,减少逐根对照的工作量。
- 把条件的分布特征量化,例如统计条件成立的位置集中在什么区间。
- 做条件之间的组合对照,看几个条件同时成立时的结果有什么不同。
四类需求的共同点是:结论落在「条件本身是什么样」上,不涉及动作与资金。这正好落在公式语言的能力范围内。当需求开始出现「按顺序分步」「扣除成本之后还剩多少」「每次动用多少」这类问法时,说明已经越过了公式的边界。
七、边界说明
通达信公式与量化交易的区别,可以归纳成一句:公式负责算出状态,交易需要另外定义动作。这句话不是价值判断,两件事解决的是不同问题。
还要说明一点:把上面几道环节补齐之后,得到的是一套可复现的规则,它仍然是对历史数据的一套描述。规则在历史区间上的表现与它在之后的表现之间没有推导关系。这一点在当前的工具与数据条件下都没有绕过的办法,写明它是为了避免把统计结果当成结论使用。
更进一步的准备工作,落在两件事上:一是把条件的计算与成本的核算分开维护,各自都能单独核对;二是每次调整规则时留下版本记录,写明改了哪一项、改动前后的差异。这两件事与工具选型无关,用公式还是用别的环境都要做。
文中函数与操作按通达信公式体系的通用描述;不同版本与券商定制版对外部接口、数据范围与统计函数的支持情况存在差异,具体请以你所用客户端的实际界面与帮助文档为准。本文只讨论计算结果与动作定义之间的边界,不构成任何投资建议。
