评估分形指数和Hurst指数预测金融时间序列的能力·综合运用
(3/3)·前面两篇铺垫了算法与单指标,这一篇用真实报价把分形维数和Hurst指数串成可执行的看盘动作
把千根日线算出的Hurst当成当下入场依据是常见误用,局部区间的记忆长度往往和长周期完全相反。多数人只盯一个指数值,却没意识到分形维数在震荡与趋势切换时会剧烈跳动。本文用实际数据演示如何避免用全局统计掩盖局部分形特征。
用分形指数给600天行情贴状态标签
拿一支流动性足够的标的做实测,评估窗口拉到600个交易日、单窗取64根K线,跑完能拿到536个分形指数值。这个数字不是拍脑袋——它等于总样本减去窗口长度再加一,直接决定了你后面能画多长的状态序列。 把指数值和收盘价叠在一起看,颜色就是状态语言:蓝色段代表趋势态,系统有持久记忆,后续沿原方向走的概率偏高;紫罗兰是抗持久性的“粉噪”,带负记忆,价格更容易均值回归、走平;黄色就是布朗运动,前后互不相关,这时候硬做方向单属于赌。 外汇和贵金属这类高杠杆品种,状态切到黄色还去追突破,回撤可能直接扫掉止损。开MT5把窗口参数改成64、样本取600天,先确认你常做的品种在哪段是蓝、哪段是黄,比看任何指标金叉都实在。
◍ 用局部分形指数给行情贴标签
本地分形分析在交易里不是花活,它干两件事:一是抓无序状态,也就是时间序列统计特征突变的那一刻;二是给后面做预测打底。 计算 Hurst 指数 H 时有个坑要注意:想以够用的精度定出这个指数,所需样本跨度要比常规类似比例小两个数量级。正是这点差距,让 H 能当局部分形指数用,换句话说它描述的是这段序列稳不稳。 判读很直接:H<0.5 倾向理解为有趋势在跑,H>0.5 大概率就是平盘耗着,H≈0.5 当成纯布朗运动看。靠这个函数把初始价格序列分完类,预测才有了落脚处。外汇和贵金属波动受杠杆与消息驱动,用这套分类先想清楚自己是在趋势里还是泥潭里,风险不低。
「一点提醒」
分形指标在 EURUSD H1 上跑默认设置时,有用户遇到过数组越界:日志显示 MuIndexes 长度固定为 1074,而循环变量 ii 在某次跳到了 1610,直接触发 CFractalSeriesSet.mqh 第 108 行报错。根因是索引递减逻辑里把 1610 误读成 1061 一类的大脑错觉,实际已远超容器上界。 那位用户在源码里加了一行 IndexCount 回绕保护(IndexCount = IndexCount >= (int)MuIndexes.Size() ? 0 : IndexCount;)后不再崩,但承认不确定对分形测度计算有无偏移。外汇和贵金属杠杆高,这类第三方指标改完参数前,先在策略测试器用历史数据跑一遍再上实盘。 代码层真正要盯的是这句:ii = (CircleCount - 1 - i) + IndexCount; 新分数写进数组末尾,若 CircleCount 算错就会把 ii 推过 Size()。开 MT5 把日志级调到全部,加载 Fractal Index 看前 30 秒 ii 轨迹,比读文档更快定位。
MuIndexes[ii] = IndexCalculater.Mu; class="num">16:class="num">01:class="num">59.441 Fractal Index(EURUSD,H1) ii = class="num">539 class="num">16:class="num">01:class="num">59.441 Fractal Index(EURUSD,H1) MuIndexes.Size() = class="num">1074 class="num">16:class="num">01:class="num">59.441 Fractal Index(EURUSD,H1) ii = class="num">538 class="num">16:class="num">01:class="num">59.441 Fractal Index(EURUSD,H1) MuIndexes.Size() = class="num">1074 class="num">16:class="num">01:class="num">59.441 Fractal Index(EURUSD,H1) ii = class="num">537 class="num">16:class="num">01:class="num">59.441 Fractal Index(EURUSD,H1) MuIndexes.Size() = class="num">1074 class="num">16:class="num">02:class="num">10.682 Fractal Index(EURUSD,H1) ii = class="num">1610 class="num">16:class="num">02:class="num">10.682 Fractal Index(EURUSD,H1) MuIndexes.Size() = class="num">1074 class="num">16:class="num">02:class="num">10.685 Fractal Index(EURUSD,H1) array out of range in &class="macro">#x27;CFractalSeriesSet.mqh&class="macro">#x27; (class="num">108,class="num">17) class="num">15:class="num">49:class="num">38.445 Fractal Index(EURUSD,H1) ii = class="num">1 class="num">15:class="num">49:class="num">38.445 Fractal Index(EURUSD,H1) MuIndexes.Size() = class="num">1074 class="num">15:class="num">49:class="num">38.445 Fractal Index(EURUSD,H1) ii = class="num">0 class="num">15:class="num">49:class="num">38.445 Fractal Index(EURUSD,H1) MuIndexes.Size() = class="num">1074 class="num">15:class="num">49:class="num">47.403 Fractal Index(EURUSD,H1) ii = class="num">1073 class="num">15:class="num">49:class="num">47.403 Fractal Index(EURUSD,H1) MuIndexes.Size() = class="num">1074 class="num">15:class="num">49:class="num">47.403 Fractal Index(EURUSD,H1) ii = class="num">1072 class="num">15:class="num">49:class="num">47.403 Fractal Index(EURUSD,H1) MuIndexes.Size() = class="num">1074 ii = (CircleCount - class="num">1 - i) + IndexCount; class=class="str">"cmt">// 新分数存储在数组末尾 IndexCount = IndexCount >= (class="type">int)MuIndexes.Size() ? class="num">0 : IndexCount;