评估分形指数和Hurst指数预测金融时间序列的能力·进阶篇
📐

评估分形指数和Hurst指数预测金融时间序列的能力·进阶篇

(2/3)· 大数据集才能算分形维数?这套局部数值法让短线交易者也能看清趋势惯性

进阶 第 2/3 篇
很多交易者以为分形维数必须拿上万根K线才能算,于是直接放弃这类指标。其实用局部数值法,几百根收盘价的偏移范围就能估出 Hurst 指数,短线也能看出序列有没有'记忆'。

◍ 用最小覆盖面积估局部分形指数

1919年 Hausdorff 给出分形维度公式,核心是拿半径最小的球去覆盖目标集合;若原集合落在欧氏空间,也能换成单元格等任意简单形状做几何近似,覆盖因子只随形状改变。把函数 f(t) 在 [a,b] 区间切成 m 段,单元格边长 ε 缩小时,覆盖数 N 按幂律 N(ε)∝ε^(-D) 增长,D 即分形维数。 单元格法要把走势图所在平面划成小于 ε 的格,数出至少落一个点的格数 N(ε),换不同 ε 后在双对数坐标画 N(ε),用最小二乘拟直线,斜率就是 D。但用函数振幅做矩形覆盖更快收敛:每个 [t(i-1),t(i)] 段取 f(t) 极大极小差当高、ε 当底,最小覆盖面积 S(ε) 等于各段矩形面积之和,ε 越小算得越准,且 S(ε)∝ε^(2-Df),Df 叫最小覆盖层维数,指数 ν=2-Df 就是分形指数。 对 32 个观测值的时间序列,文献[2]显示单元格覆盖与矩形覆盖算出的分形维数一致,而矩形法收敛快,能用小样本在局部定出 Df。给 S(ε)∝ε^(ν) 两边取对数,双对数坐标下用 LS 拟直线求正切得 ν,它就是序列的局部特征。文献[1]称 ν 的测定精度高于单元尺寸法或 Hurst 法,且不限序列分布;样本不少于 32 点即可靠,金融资产历史通常远长于此,故可把 ν 当时间函数,每点用前 32 值滚动算。 图3示例里,32点片段回归确定系数 R²=0.96,分形指数 ν=0.4544,说明这段估得相当准。卢克石油1999年危机前报价用单元覆盖得 D=1.1894(趋势持久),Hurst 法却得 H=0.40、D=1.6 且 R²仅0.56,明显与事实不符。 美国铝业8145点价序列拆成8113个重叠32天窗口、步长1天:H 的95%置信区间宽度、ν 的对应宽度、以及 K=1-R²(点线重合误差)三项比对中,绝大多数窗口 ν 比 H 更准。ν 相对 Hurst 的最大优势是迅速进入渐近,可当局部动力学特征——把前序可算区间的 ν(t) 直接挂进监控,就能区分震荡与趋势段。外汇与贵金属波动剧烈、杠杆风险高,用 ν 做局部状态识别前务必在 MT5 用真实历史校验窗口长度。

用分形指数读价格记忆

做价格行为的人若打算挂一个基于分形指数的指标,得先认清楚这个指数在说什么。它直接刻画序列本身的行为特征,和投资者结构是绑定的。 当分形指数等于 0.5,对应的是随机游走(维纳过程)。此时投资者行为相互独立,价格缺乏明显方向,对外部冲击的依赖弱、没有反馈回路,套利空间基本不存在。 指数低于 0.5,说明价格对外部影响反而更“稳”。典型场景是标的缺乏新信息、市场对其稳定性有共识,买卖盘在窄区间里互相绞杀:涨了有人砸、跌了有人接,把价格推回原区间。这种负向关联削弱了波动,却保住了区间。 指数高于 0.5,稳定性下降,往往伴随新信息涌入与一致预期。参与者对信息的定价趋同,价格走出趋势,极端时引发急涨急跌。外汇与贵金属这种高杠杆品种里,此类跳变常伴随滑点和流动性断裂,风险显著放大。 分形指数 α 与赫斯特指数 H 满足 α = 1 - H,由此可把混沌序列分类:α=0.5 即 H=0.5,是无记忆的布朗噪声;0.5<α≤1 对应 0≤H<0.5,呈“粉红噪声”,带负记忆,前一截正增量后更可能接负增量;0≤α<0.5 对应 0.5<H≤1,是“黑噪声”,带正记忆,既有趋势倾向延续。打开 MT5 把 H 值算出来,就能先判一段行情是几类噪声再动手。

「分形指数和 Hurst 指数的评价指标」

以天、周和月为尺度的成功交易与对金融时间序列混乱状态的理解有关。在对短数据片段中的分形指标进行稳定评估的基础上,我们可以开发出一种股票指标(其演化是由大量人的意志决定的),这将有助于交易者识别和预测金融时间序列。 该指标评估了分形指数、分形指数的置信区间、确定系数的值和 Hurst 指数。下面的图表显示了上述 , , 和 函数图。 在指标中,可以设置时间序列段的长度,对其进行计算,并提供参数评估窗口。指标发布时,该系列按收盘价计算,而窗口移动一个计数。由于评价窗口(区间)的长度等于二的幂次,我们可以通过对其进行线性逼近得到一组数值,并对其分形指数进行评价。 CFragmentIndexLine.mqh 文件片段执行覆盖面积计算循环,如图2所示。程序中的操作顺序通过详细的注释进行解释。 [CODE] <span class="keyword">double</span> CFractalIndexLine::CalculateFractalIndex(<span class="keyword">const</span> <span class="keyword">double</span> &amp;series[],<span class="keyword">const</span> <span class="keyword">int</span> N0,<span class="keyword">const</span> <span class="keyword">int</span> N1, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">const</span> <span class="keyword">double</span> hourSampling,<span class="keyword">int</span> CountFragmentScale=<span class="number">0</span>) &nbsp;&nbsp;{ <span class="comment">//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -</span> <span class="comment">// series[] - time series</span> <span class="comment">// N0, N1 - the left and right boundary points of the series[] array fragment, based on which the fractal index will be estimated</spa

◍ 遍历分段提取波动幅度并落库

拿到边界数组后,真正干活的是对每段区间做极值扫描。代码先用 Boundaries.CountNonEmty() 拿到有效区间数 countInterval,再按区间逐个用 ArrayMaximum 与 ArrayMinimum 定位片段内最高、最低采样点的下标,两者价差即为该区间振幅 A,并累加到 V。 nCheckPoint 由首段边界跨度加 1 算出,例如边界 x[0]=10、y[0]=20 时 nCheckPoint=11,意味着每段至多检查 11 个采样点;若区间实际更短,ArrayMaximum 的 length 参数会被静默截断,这一行为在回测 EURUSD M5 片段时容易掩盖边界外的尖刺。 振幅汇总后写入存储数组:idxAmplVar 由 NumPartDivide 的 2 次幂决定,LogDeltaScales 存划分尺度的对数,LogAmplVariations 存总振幅 V 的对数。外汇与贵金属波动受杠杆与跳空影响,该振幅度量仅反映历史片段统计特征,实际行情延续倾向需结合实时流动性判断,高风险品种勿直接用作仓位依据。 最后函数 return V,调用方拿到的是当前划分尺度下的累计振幅;换 NumPartDivide 重跑,就能观察 log(V) 随尺度变化的斜率,那是判断分段自相似程度的可验证入口。

MQL5 / C++
  class="type">class="kw">double dayDeltaScales=BoundaryArray(NumPartDivide,fragment,class="num">0,Nfrgm-class="num">1,hSampling,Boundaries,nIntervalPoints);
class=class="str">"cmt">// class="num">2. GO THROUGH INTERVALS TO DETERMINE LIMIT VALUES OF FUNCTIONS AND OF AMPLITUDE VARIATION
  class="type">int countInterval=Boundaries.CountNonEmty();
  class="type">int   maxFuncIdx=class="num">0,minFuncIdx=class="num">0;
  class="type">class="kw">double A,V=class="num">0.;
  nCheckPoint=(class="type">int)(Boundaries.y[class="num">0]-Boundaries.x[class="num">0])+class="num">1;
  for(class="type">int i=class="num">0; i<countInterval; i++)
    {
      maxFuncIdx = ArrayMaximum(fragment,(class="type">int)Boundaries.x[i],nCheckPoint); class=class="str">"cmt">// INDEX WITH MAX. VALUE
      minFuncIdx = ArrayMinimum(fragment,(class="type">int)Boundaries.x[i],nCheckPoint);
      A = fragment[maxFuncIdx] - fragment[minFuncIdx];
      V = V+A;
      i=i;
    }
class=class="str">"cmt">// class="num">3. ACCUMULATION OF RESULTS IN STORAGE    
  if(idxAmplVar==-class="num">1) idxAmplVar=ipow2(NumPartDivide); class=class="str">"cmt">// index in the storage array
  LogDeltaScales   [idxAmplVar] = log(dayDeltaScales); class=class="str">"cmt">// log-scale of the current division
  LogAmplVariations[idxAmplVar] = log(V);              class=class="str">"cmt">// log-Amplitude Variation in the current division scale
  class="kw">return V;
}
把重复劳动交给小布
这些分形维数与 Hurst 指数的滚动诊断,小布盯盘的 AIGC 已内置,打开对应品种页即可看到局部分形特征曲线,你只管判断持久还是反趋势。

常见问题

该区间意味着序列具有持久性,即向上或向下趋势倾向于延续,价格存在一定惯性而非纯随机。
当收盘价序列水平不独立时,存在趋势记忆,占用空间比独立白噪声更紧凑,故 D 显著小于平面的拓扑维数 2。
可以,小布盯盘对应品种页内置了局部分形特征与 Hurst 指数的滚动计算,省去手动套公式的麻烦。
文中方法不要求万级样本,数百根即可捕捉局部行为,具体长度可结合品种波动周期调试,结果仅作概率参考。