同一份指标、同一段行情,两个人各跑一遍,结果能差出一大截。指标本身没有改过,参数也没有改过,差别出在通达信指标公式仓位这个假设上:测试时假定的每次参与比例是多少、是固定比例还是固定份额、是否把前面的结果累加进后面的计算。

本文把仓位当作一个测试参数来讨论,只讲它在回测里如何被定义、不同定义会带来什么差别、以及怎么核对。全文不涉及任何标的的判断,也不给出资金安排方面的建议;涉及的数值都是假设值,用于说明计算方式的差异。

一、仓位在回测里是一个假设参数

回测的基本流程是:按指标给定的条件逐根 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 线在两个时间点的取值。三份记录合在一起,才构成一次可复现的核对。只留最终结论的,过一段时间之后无法回溯是哪一步发生了变化。而通达信指标公式仓位这类假设参数,恰是最容易被后来人改动的一项。

通达信指标公式仓位在本文里的用法只是一个计算假设:它决定了结果序列的幅度与形态,不决定条件本身的对错。把这一层分清之后,回测结果的差异就有地方安放了——差异要么来自条件口径,要么来自累加方式,两类都能逐个核对。

本文只讨论回测中的计算口径与验证顺序,不涉及具体标的的判断,也不构成对任何公式效果的承诺。站内还有 指标回测与风险验证 里讲样本区间与未来函数核对的条目、指标原理与参数 里讲参数含义的条目、公式编写与语法函数 里讲循环与累积表达式的条目,可对照查看。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。