同一份指标、同一段行情,两个人各跑一遍,结果能差出一大截。指标本身没有改过,参数也没有改过,差别出在通达信指标公式仓位这个假设上:测试时假定的每次参与比例是多少、是固定比例还是固定份额、是否把前面的结果累加进后面的计算。
本文把仓位当作一个测试参数来讨论,只讲它在回测里如何被定义、不同定义会带来什么差别、以及怎么核对。全文不涉及任何标的的判断,也不给出资金安排方面的建议;涉及的数值都是假设值,用于说明计算方式的差异。
一、仓位在回测里是一个假设参数
回测的基本流程是:按指标给定的条件逐根 K 线判断成立与否,成立则记一笔,最后把所有的记录汇总成一个结果序列。仓位就是汇总时用到的一个系数,它回答的是「假定每次只动用一部分时,结果序列长什么样」。
这个系数取值多少,不影响条件成立与否,只影响结果序列的幅度。所以两段结果的形态可以完全一致,数值却相差若干倍。核对回测时先看条件判断是否一致,再看幅度,顺序反了会把口径差异误认成指标差异。
把仓位与条件分开记录,是为了让差异有地方归因。同一份结果出现变化时,可能的原因有两类:成立位置变了,或者幅度系数变了。前者要回到指标与参数,后者要回到仓位与累加方式。分开记录之后,两类原因可以分别核对,不必整体重做一遍。
| 要素 | 是否影响条件成立 | 影响什么 |
|---|---|---|
| 指标条件与参数 | 是 | 哪些位置被记为成立 |
| 仓位假设 | 否 | 结果序列的幅度 |
| 累加方式 | 否 | 结果序列的形态 |
| 未来函数 | 是 | 成立位置本身是否可信 |
二、三种常见的假设写法
把「假定每次参与一部分」落成源码,常见三种写法。三者算出来的结果序列在数值与形态上都不相同。
三种写法里,固定比例最适合用来做核对,因为它的换算关系是一次的,反推容易。另外两种适合在口径确定之后再使用。选哪一种取决于要回答的问题,而不是哪一种更接近实际。
- 固定比例。每个成立位置都按同一个比例换算,结果序列的幅度与成立次数成正比。写法最简单,便于核对。
- 固定份额。每个成立位置都按同一个单位数量换算,不随前面的结果变化。与固定比例的差别是,前者隐含了结果累加,后者不累加。
- 按结果累加。把前面已经产生的部分计入后一笔的计算基数,形成复利式累加。这一类对早期结果特别敏感。
{ 固定比例:把条件成立的位置按同一系数换算 }
K: 0.1 (0.01, 1, 0.01)
条件:=CROSS(MA(CLOSE,5),MA(CLOSE,20));
单次:=IF(条件,K,0);
简化结果:SUM(单次,BARSCOUNT(CLOSE));
{ 按结果累加:前一笔计入后一笔的基数 }
累加结果:=1;
累加结果:=IF(条件,累加结果*(1+K),累加结果);
上面第二段用的是逐根递推的写法,通达信里可以用循环类函数或逐根累积的表达实现,具体可用的循环函数以你所装那版的函数说明为准。递推写法与累加写法的差别,在结果序列的前半段最明显。
三种写法在源码上的差别很小,一两个字符的改动就会切换口径。固定比例与固定份额之间的差别是系数是否随结果变化,固定份额与按结果累加之间的差别是基数是否包含前面的结果。改口径时一次只动一处,并把改动前后的结果序列各留一份,便于对照。
三、累加与不累加,差别在哪里
不累加的写法里,每一笔独立计算,第 1 笔与第 100 笔的分量相同,结果序列是一条近似直线加噪声的曲线。累加的写法里,第 1 笔与第 100 笔的分量差别很大,结果序列的形状由早期记录主导。
两者谈不上谁更准确,因为它们回答的不是同一个问题。不累加回答的是「每次记录的平均表现」,累加回答的是「连续参与下来的累计效果」。把两者放在一起比较数值大小,是没有意义的。
还有一个容易被忽略的细节是记录的起始位置。结果序列的第一笔在累加口径下等于系数本身,它在整体结果里的占比取决于总记录数。记录数不多时,前几笔对最终形态的影响会被放大;记录数足够多时,这一影响会被摊薄。比较两份回测结果时,先确认两边的记录数是否接近。
四、未来函数会让仓位口径失去意义
仓位口径的讨论有一个前提:条件成立的位置本身是可信的。若指标里用了未来函数,成立位置会随时间改写,这时候再精细地讨论仓位假设,等于在一个移动的基座上做测量。
核查办法是把同一根 K 线在两个时间点各算一次,看条件是否成立有没有变化。有变化,先处理未来函数,再回到仓位口径。通达信的公式管理器里可以查看每个函数的说明,凡标注了未来数据相关的函数,都要逐个核对。
数据起点同属这类前提。本地数据不足时,公式在图表最早的位置返回空值,条件不成立,这一段会被记为没有记录。两份回测若用了不同长度的本地数据,结果序列的起点不同,数值自然对不上。核对前先把两边的数据下载范围对齐。
五、验证顺序:三步
把通达信指标公式仓位这件事核对清楚,按下面三步走,每一步都能得到一个是或否的结论。
| 步骤 | 动作 | 通过标准 |
|---|---|---|
| 第一步 | 只输出条件本身,与另一份实现对照 | 成立位置逐根一致 |
| 第二步 | 固定仓位系数,改累加方式各跑一次 | 能说清两次结果形态的差别来自哪里 |
| 第三步 | 把同一根 K 线在两个时间点各算一次 | 结果不变,或已定位到变化来源 |
三步都通过之后,回测结果才有被比较的前提。跳过第一步直接比数值,是最容易走的一条弯路。
每一步都要留记录。第一步的记录是成立位置的清单;第二步的记录是两次结果序列的形态对比;第三步的记录是同一根 K 线在两个时间点的取值。三份记录合在一起,才构成一次可复现的核对。只留最终结论的,过一段时间之后无法回溯是哪一步发生了变化。而通达信指标公式仓位这类假设参数,恰是最容易被后来人改动的一项。
通达信指标公式仓位在本文里的用法只是一个计算假设:它决定了结果序列的幅度与形态,不决定条件本身的对错。把这一层分清之后,回测结果的差异就有地方安放了——差异要么来自条件口径,要么来自累加方式,两类都能逐个核对。
本文只讨论回测中的计算口径与验证顺序,不涉及具体标的的判断,也不构成对任何公式效果的承诺。站内还有 指标回测与风险验证 里讲样本区间与未来函数核对的条目、指标原理与参数 里讲参数含义的条目、公式编写与语法函数 里讲循环与累积表达式的条目,可对照查看。
