交易中的神经网络:配备注意力机制(MASAAT)的智代融汇(基础篇)
◍ 注意力机制怎么塞进MT5交易系统
传统均线类指标在跳空和重大数据行情里容易滞后,Dmitriy Gizlyk 在 2025 年 12 月 3 日发布的 MASAAT 思路,是把注意力权重叠到多周期信号上,让模型对近期异常波动分配更高响应。 这套框架跑在 MetaTrader 5 上,本质是用神经网络替代固定系数的指标融合。原始实现里用 540 行级逻辑描述信号路由,说明它不是简单 EA 模板,而是把‘哪段行情值得看’交给注意力层决定。 高风险提示:外汇与贵金属杠杆品种波动剧烈,任何基于注意力的信号都只是概率倾斜,实盘前务必在 MT5 策略测试器用历史数据回测验证。
「多智代注意力框架怎么拆波动市」
传统组合理论在单一市场里往往够用,但外汇与贵金属这种高波动、多因子驱动的环境,利润最大化与风险最小化天然冲突,老模型容易失灵。机器学习尤其是深度与强化学习在计算金融里已有落地,可价格序列本质是强噪声时间序列,直接挖未来方向信号非常吃力。 MASAAT 框架换了一条路:部署多个智代,各自盯不同粒度价格的方向性变化,再用阈值滤波器只抓显著走势,从原序列里提取趋势特征。这样每个智代能从自己的角度追踪市场体制偏转,而不是被日常杂讯带偏。 框架内部用横断面注意力(CSA)和时态注意力(TA)分工:CSA 基于各资产特征优化跨资产嵌入,TA 基于时间点捕捉当前与过去的依赖。两者信息进时空模块整合后,各智代按独特视角提 portfolios,再合并成融汇组合。即便某个智代误判产生偏荐,多智代集成也能自适应细化最终结果,弱化单点错误。外汇/贵金属属高风险品类,该框架只降低误判概率,不消除方向看错的可能。
多智代如何并发拆价格时空特征
MASAAT 框架把原汁价格序列直接转成两类特征:面向资产的 CSA 序列和面向时间点的 TA 序列。设 N 为资产数、M 为市场特征数、M_a 为智代数,每个智代先观察窗口 T_w 内的价格张量 P∈R^{N×M×T_w},再用方向走势滤波器抽出基于趋势的函数 P_DC,维度为 R^{M_a},其中单个智代 i 的输出 P_DC,i∈R^{N×M×T_w}。 CSA 分支把 P_DC,i 重排成 P_DC,i,CSA∈R^{N×M·T_w},TA 分支重排成 P_DC,i,TA∈R^{T_w×N·M}。两个分支都跑自注意力编码器,跨整条词元序列算注意力分,不像 CNN 那样被卷积核局部位置绑死,所以资产间相似度能被公平估算,信号也更可解读。 编码器吐出资产向嵌入 O_CSA∈R^{N×D} 和时间向嵌入 O_TA∈R^{T_w×D},D 是嵌入维度。两类嵌入合并后用于更新投资组合,再与其它智代输出整合出最终依赖向量 W_t。外汇与贵金属属高波动品种,这种多视角并发感知对对冲异构资产权重有帮助,但风险随潜在回报同步放大。 多个智代在不同粒度看波动,各自给出候选组合,再融成统一组合。相比单智代,这种结构在高度波动市况下适应性更强,智代也能持续学相关性来管风险。
◍ 把多智代趋势检测搬进 OpenCL 内核
MASAAT 的模块化思路落到 MT5 里,第一道坎是趋势检测。原先的 PLR 对象只能跑单个智能体,而框架要的是多智能体并行识别不同阈值的局部趋势,顺序执行太慢,所以直接重写一个支持并行运算的 OpenCL 内核。 新内核 PLRMultiAgents 在 3D 任务空间跑:第 0 维是序列长度,第 1 维是多模序列里的单变量个数,第 2 维是智能体数量。所有智能体读同一份多模序列,差别只在阈值和结果缓冲区的偏移。每个线程先定位自己在三维里的坐标,再算数据缓冲区的读偏移。 内核找趋势逆转点的逻辑是:序列端点直接标为逆转点,其余点向后搜偏差超过阈值的最近元素,记录检查区间内的极小/极大值;前向按所需偏差找下一元素,只有它是走廊内极值才打标志,相同值取第一个。确认逆转的线程才继续算该段线性近似,输出斜率、截距、以及归一化长度(段内元素数 ÷ 整序列元素数,int 先转 float 避坑)。 结果缓冲区大小按输入张量大小开,能写比序列短 3 倍的段(3 元素并 1 段),正常情况段数更少,末尾补零;极端波动下段数可能爆量,就把最后几个段合并防丢数据。前馈无训练参数,反向传播只是梯度聚合,由 PLRMultiAgentsGradient 内核复用单智代逻辑加收集环路实现。 主库里 CNeuronPLRMultiAgentsOCL 继承原 PLR 对象,Init 只收阈值向量、智能体数由向量长度推出来,降低参数不一致风险;极值标志缓冲区每次前馈重算,只在 OpenCL 设备内存建、对象留指针。下面的代码是内核头部,能看到四个指针参数加转置标识和阈值向量的声明方式。
__kernel <span class="keyword">class="type">void</span> PLRMultiAgents(__global <span class="keyword">const</span> <span class="keyword">class="type">class="kw">float</span> *inputs, __global <span class="keyword">class="type">class="kw">float</span> *outputs, __global <span class="keyword">class="type">int</span> *isttp, <span class="keyword">const</span> <span class="keyword">class="type">int</span> transpose, __global <span class="keyword">const</span> <span class="keyword">class="type">class="kw">float</span> *min_step ) { <span class="keyword">const</span> class="type">size_t i = get_global_id(<span class="number">class="num">0</span>); <span class="keyword">const</span> class="type">size_t lenth = get_global_size(<span class="number">class="num">0</span>);