量化研究 | DMH改进的定向运动指标

松鼠Quant
2025-05-13

图片
量化策略开发,高质量社群,交易思路分享等相关内容

工具推荐

· 参数筛选工具

·Ai帮你编写策略

· 订单流图表

· 加入2025俱乐部

· Ai投研助手课程

『正文』

ˇ

定向运动指标是由 J. Welles Wilder 最早开发出来的,一直到现在仍在技术分析领域发挥重要作用。现在,是时候对其进行现代化改造了。 我感觉无从下手。定向运动作为技术分析的一个部分,已经存在五十年了,它是在用铅笔和纸进行计算的条件下发明的。绝不是开玩笑!你可以查看 J. Welles Wilder 1978 年出版的《技术交易系统中的新概念》一书中的工作表。(这本书在公共领域,能从互联网上免费下载。)定向运动其实是个不错的指标,但由于它诞生时的技术限制,也带有一些过时的东西。现在应该把它更新一下,用于现代算法交易。

定向运动指示器的解释

定向运动的基本原理是:在上升趋势中,高点变化的总和会比低点变化的总和大;而在下降趋势中,低点变化的总和会比高点变化的总和大。两个总和的交叉点就是时序信号。 最初的定向运动使用 ATR(平均真实范围)作为比例因子。ATR 对高点总和和低点总和进行了缩放,所以它对时序信号其实没什么影响。而且,经典的 DMI 是一个比率形式,ATR 在代数运算中完全抵消了。因此,在计算现代版本的定向运动时,可以不用 ATR。 不用缩放函数的话,定向运动就只是两个总和的差值。定向运动规则规定,在给定柱上只能选择高点的变化或者低点的变化,不能同时选两者。此外,内部日期会排除选择任何一个的情况。所以,定向运动是一系列相对稀疏的尖峰。 通过将运动与指数移动平均线(EMA)相加,可以创建一个更接近连续的函数。在 2021 年 9 月我写的股票与商品文章 “窗口化” 中,我说过移动平均线并不是特别好的过滤器,可以通过在分析期间使用 Hann 窗口系数和求和来显著改善过滤器。因此,我建议将 DMH(使用 Hann 窗口的定向运动)作为现代版本的定向运动,因为计算机很容易计算它。

图1:DMH 指标。 这显示了应用于 emini S&P 连续期货合约的 DMH 指标(使用 Hann 窗口的定向运动)的示例。 过零反映趋势的变化。

引入改进的定向运动

指标:DMH

DMH 的计算从 PlusDM 和 MinusDM 的经典定义开始。这些定向运动汇总在指数移动平均线(EMA)中。然后,在计算周期内,用 Hann 窗口系数在有限脉冲响应(FIR)滤波器中进一步平滑这个 EMA。 按照 Wilder 的说法,这个指标的零交叉点就是原始的计时信号。然而,这些过零点滞后很明显。我觉得更好的计时信号是指标的波峰和波谷。可以通过记录指标的变化率什么时候为零来识别波峰和波谷。换句话说,当指标的一根柱线差穿过零时是谷值,当它再次穿过零时是峰值。

虽然默认指标长度是 Wilder 的 14 根bar线,但我认为指标的长度应该由交易者自己定,或者如果 DMH 用于策略,可以通过优化来确定。 我建议将 DMH(使用 Hann 窗口的定向运动)作为定向运动的现代版本,因为计算机能够轻松计算它。

使用 Hann 窗口系数和在分析期间的求和可以显著改进过滤。

我最近对市场数据的性质和数据中出现的周期特征进行的研究,让我对用于交易的指标和震荡指标做了一些重大改进。这些研究改变了我对市场数据和趋势 / 周期分析的看法,也促使我更新了许多经典交易指标,比如本文介绍的定向运动。在本杂志即将发表的文章中,我会根据我最近的研究,提供一些更经典指标的改进版本。





















































Params    Numeric Length(14);   // 周期长度Vars    Numeric SF;          // 平滑因子    Numeric PlusDM;      // 正方向移动    Numeric MinusDM;     // 负方向移动    Numeric UpperMove;   // 上移    Numeric LowerMove;   // 下移    Series<Numeric> EMA; // 指数移动平均    Numeric DMSum;       // 方向移动总和    Numeric coef;        // 系数    Integer count;       // 计数器    Numeric DMH;         // 最终的 DMH 值Events    OnReady(){        SetBackBarMaxCount(1 + Length);    }    OnBar(ArrayRef<Integer> indexs)    {        Range[0:DataSourceSize() - 1]        {            SF = 1 / Length;            UpperMove = High - High[1];            LowerMove = Low[1] - Low;            PlusDM = 0;            MinusDM = 0;            If (UpperMove > LowerMove And UpperMove > 0)            {                PlusDM = UpperMove;            }            Else If(LowerMove > UpperMove And LowerMove > 0){                MinusDM = LowerMove;            }            EMA = SF * (PlusDM - MinusDM) + (1 - SF) * EMA[1];            // 使用 Hann 窗函数平滑方向移动            DMSum = 0;            coef = 0;            For count = 1 To Length            {                DMSum = DMSum + (1 - Cos(2*pi * count / (Length + 1))) * EMA[count - 1];                coef = coef + (1 - Cos(2*pi * count / (Length + 1)));            }            If (coef <> 0)            {                DMH = DMSum / coef;            }            PlotNumeric("DMH", DMH,0, Red);            PlotNumeric("零线", 0, 0,White);        }    }

防迷路


           图片

微   信|小松鼠-松鼠Quant

微信号|viquant01

25俱乐部源码

加入2025量化俱乐部

-------------往期精彩内容-------------


分享