移动平均线交叉描述起来很简单,却很容易被过度搜索。快线可能上穿或下穿慢线,从而产生一个规则事件。难点在于:在查看结果之前,究竟已经指定了哪些均线、信号时点、离场和成本假设——以及一组看起来有吸引力的参数,是否只是众多尝试中最好的那一个。
在做网格搜索之前,先写出一个版本
先选定标的、时间周期、数据来源和日期区间。明确两条窗口各自的输入价格、平均方法和周期数。把看涨事件定义为快线在已收盘的K线上上穿慢线,或者定义相反方向;不要用“快线当前位于慢线上方”这类状态来替代,除非把它作为一条单独的规则记录下来。设定预热期之后第一个可用的信号时间、之后的入场价格约定、允许的方向、离场、仓位大小和最长持有时间。Pine Script v6 参考文档区分了移动平均线和交叉的内置函数;如果要在其中复现某条规则,请记录所使用的函数和源数据取值。
对于简单移动平均线,第 t 根K线上的取值是当前收盘价与前 n − 1 个收盘价的算术平均值。这使得输入价格和K线何时收盘成为定义的一部分。指数移动平均线赋予的权重不同,可能在不同的K线上发生交叉;绝不要在看过哪个版本表现更好之后,再把 SMA 换成 EMA。
手工计算一次交叉
考虑六个虚构的收盘价:100、99、98、99、100、102。用 3 根K线的 SMA 作为快线,用 5 根K线的 SMA 作为慢线。在第 5 根K线上,快线为 (98 + 99 + 100) ÷ 3 = 99.00,而慢线为 (100 + 99 + 98 + 99 + 100) ÷ 5 = 99.20。快线仍位于慢线下方。
在第 6 根K线上,快线变为 (99 + 100 + 102) ÷ 3 = 100.33。慢线为 (99 + 98 + 99 + 100 + 102) ÷ 5 = 99.60。比较相邻已收盘K线上的关系,可以识别出一次向上交叉:它从下方变为上方。这一计算并没有说明是否应该交易、承担多少风险或在哪里离场。这六个价格的存在只是为了让算术过程可以被检查。
如果均线使用收盘价,那么第 6 根K线的信号在该K线开盘时并不为人所知。在 TradingView Pine v6 的默认策略行为下,在收盘后计算的策略会为下一个可用 tick 创建市价单,通常就是下一根K线的开盘。这是特定于该平台的经纪商模拟器约定,并不保证真实成交;相关设置可以改变所模拟的时点。在您自己的测试中,请把信号时间戳和模拟成交时间戳写成两个独立字段。基于最终收盘价而在同一根K线开盘入场,会泄露来自未来的信息。
作为一个小示例,研究者可以预先声明快线窗口为 3、5 和 8 根K线,慢线窗口为 10、15 和 20 根K线,从而产生九组候选参数。这些是教学用取值,不是推荐设置。周期以K线计量,因此“20 周期”规则在 5 分钟和日线数据上意味着不同的持有期限。更大的网格搜索或许有其理由,但每一个被测试的组合都会增加选择记录。在运行网格之前,先写明您要比较的指标、基准,以及可接受的最大回撤或其他失败标准。避免在看到哪个指标让图表最好看之后,再选择一个新的指标。
纳入一个适合该问题的简单基准。例如,把该规则的权益曲线与在相同区间内把相同起始资金持有标的本身进行比较,然后报告策略的平均敞口以及任何未投入的现金。满仓买入并持有的路径,与频繁变化、部分投入的策略,具有不同的风险和敞口;单靠一个收益率百分比无法判定哪种过程更好。如果方向是只做多,不要默默地把慢线以下的时期算作盈利的空头仓位。如果规则是多空双向,请对两个方向都明确建模。
保持评估按时间顺序进行
用较早的观测来实施和比较候选设置。把较晚的观测排除在调参过程之外。在该较晚区间上对选定的规则只评估一次,然后如果该区间影响了进一步的调整,就把它标记为已使用。重叠的滚动窗口意味着相邻信号未必相互独立,而大量的小时级数据行并不等同于大量不同的市场状态。
报告整个网格,或对其做忠实汇总。除了所选设置之外,还要展示候选结果的中位数和离散程度,并说明所选参数是事先设定的,还是从结果中挑选出来的。检查所选周期附近的小幅变化。如果邻近窗口产生非常不同的行为,就把该结果描述为对参数敏感。简单的样本外划分可以限制一种形式的数据重复使用,但无法抹去研究者已经做过的实验。
确认信号具有因果性
包含某根K线最终收盘价的均线,只有在该K线收盘之后才为人所知。不要用它来在同一根K线内更早地成交。记录用于信号的时间戳和价格,以及随后的入场。用一个小型手工计算的例子或单独的单元测试来确认实现。把历史不足的早期窗口作为不可用观测处理,而不是取值为零的指标。
SuperQuant 的趋势实现使用上一根已收盘小时K线上的快/慢 SMA 交叉,并在常见引擎规则下于下一根K线开盘评估入场。该产品的默认值是示例设置,不是经过验证的推荐。其提供的数据是合成的,其运行无法确立真实市场的优势。其他应用可能以不同方式定义 EMA、SMA、持续状态入场或离场。在描述某个工具测试了什么之前,请确认实际的代码和配置。TradingView 当前的 Pine Script v6 策略文档描述了其经纪商模拟器和默认的下一 tick 成交约定;这些控制项只解释该平台。
加入成本并保留结果
对每个候选设置施加相同的费用、买卖价差、滑点和资金费率假设。如果这些成本随名义价值或标的而变化,请体现这一点,或说明所做的近似。永续合约还需要实际的资金费率约定、方向和可用的结算时间。把所选规则与所有候选结果的中位数和离散程度、总试验次数、交易笔数以及最弱但合理的成本情景并列报告。交易笔数偏低或只有一个有利窗口,是需要说明的局限,而不是隐藏其他试验的理由。
把结果与基准进行比较,并保留一份包含交易、收益路径、回撤、持有时间和敞口的台账。把被否决的设置、代码版本、数据指纹和日期放在一起,以便他人可以复现检查过的是哪条规则。把研究之前固定的参数与使用训练区间选出的参数区分开。一旦某个后期留出区间改变了参数、过滤器、指标,甚至改变了下一个研究问题,它就不再是未被触碰的;请保留该结果,并为改动后的规则获取一个新的评估区间。
如需背景资料,请阅读加密货币趋势跟踪、前视偏差指南和回测过拟合指南。回测审计清单记录了这些假设。这是一种实现与研究方法,不是业绩声明,也不是个性化的投资建议。