交易中的神经网络:针对金融市场的多模态、扩增工具型智代(FinAgent)(基础篇)
◍ FinAgent 把多模态塞进了 MT5 交易台
- 年 12 月 18 日,一篇发布在 MetaTrader 5 交易系统栏目的文章指出,面向金融市场的智代 FinAgent 被定位为多模态、扩增工具型代理,而非传统单一信号发生器。截至发布时点,该文在站内的基础互动量为 1276 次浏览、2 条讨论,说明这类工具型思路在零售交易者中仍属早期渗透。
所谓多模态,指它不只读价格序列,还能并入文本资讯、订单流特征与跨品种相关性,再交由扩增模块做情景扩充。对做外汇或贵金属的人而言,这类代理的本质是帮你把杂乱输入压缩成可执行的观察项,而不是替你拍板。 高风险提醒:外汇与贵金属杠杆品种波动剧烈,任何工具输出的倾向都只是概率,实盘前务必在 MT5 策略测试器里跑一遍自己的样本外数据。
从规则系统到多模态智代的演化断层
传统基于规则的交易系统在高波动行情里最容易露怯:条件写死,遇到非常规跳空或流动性骤干,策略直接失效率上升。强化学习(RL)虽能自适应,但训练数据胃口大,且决策黑箱、对噪声敏感,跨市场普适性差。 LLM 进来后,靠记忆与规划模块能跟住动态环境,多模态版本还能吞文本和图表。但实测短板也很硬:多源数值/文本/视觉融合不准、对急变市场反应慢、难调用传统技术指标、决策不透明。 《金融交易的多模态基础智代》提出的 FinAgent 就是冲着这些缝填的——它接文本+视觉看盘,用两层反射做短长周期决策,记忆系统压噪声,决策层再塞进专家规则。外汇与贵金属属高风险品类,这类框架仅降低盲点,不消除亏损概率。
「FinAgent 的五模块怎么咬合出交易决策」
FinAgent 不是单模型黑箱,而是由五个模块拼成的决策生态:市场分析、两层反射、记忆、决策制定,再加数据采集层。它把新闻、价格、公司报告先转成文本查询,再用向量相似度去历史库里捞相近样本,结构化汇总后压低噪音——这一步决定了后续所有判断的素材质量。 两层反射模块分工很硬:低层盯价格变化与市场动态的相关性,做短周期波动预测,对做 M1~H1 的交易者直接有用;高层拿历史成交和过往结果挖更深的关联,做误差检测与策略纠正,还会把买卖点和有效性画出来迭代学习。 记忆模块用向量搜索在庞大数据集里秒级取数,给智代提供上下文,使它能用当天新闻叠历史形态去猜下一步波动。决策模块把市场摘要、低层反射输出、过往决策洞察揉在一起,做情绪分析并参考专家建议与传统指标,最后落出买/卖/持三种动作之一,且每次都套情境学习逻辑。 对外汇、贵金属这类高波动高杠杆品种,这种多模块闭环可能提升策略适应性,但模型依赖历史相似度,黑天鹅样本外行情下误判概率会显著抬升,实盘前务必在 MT5 策略测试器里用自己品种回测验证。
◍ 两层反射模块的 MT5 落地结构
把 FinAgent 的反射思路搬进 MT5,关键一步是放弃大语言模型,只用现有 OpenCL 神经对象拼出低层与高层两个反射模块。低层模块 CNeuronLowLevelReflection 以记忆类为父,内部挂了 LSTM 与 Mamba 两种重现对象各一个,加两组相对交叉注意力,专门抓短期参数动态。 所有内部对象都声明为静态,构造析构留空,初始化全塞进 Init 方法;父类先跑参数校验和继承对象初始化,再建两个架构不同的重现对象识别短长期变化,最后用交叉注意力把多源信息揉成统一描述。前馈时原始数据先过重现对象,再过交叉注意力补上下文,结果送进父类记忆模块找持久趋势——这可能是后续价格走向预测的底噪。 反向传播要在 calcInputGradients 里从三条信息流回收误差梯度:先经记忆模块下传到交叉注意力,再分到重现模块,最后换回原始输入缓冲区指针汇总。附件里有完整类代码,开 MT5 挂上 OpenCL 就能单步看梯度流向。 高层模块 CNeuronHighLevelReflection 管的是跨笔交易的长期互依。输入按理要四条流(动作、环境、财务、记忆),但当前接口只放两流,记忆流靠父类在内部生成。对象输出可视为智代动作张量的潜在表示,每笔交易用三参数(交易量、止损、止盈)描述,买卖分两行写,不用额外方向位。 Init 里先调父类处理动作张量,再建全连接层接第二流、重现对象跟账户状态、交叉注意力验动作与环境依赖。feedForward 每根柱线触发一次,历史深度远超一根柱,最早柱被踢掉影响极小;新柱带来未知决策,反而能回看交易对错。外汇和贵金属杠杆高,这类策略模块实盘前务必在策略测试器跑多品种回测,信号只代表概率倾向而非确定性。
class CNeuronLowLevelReflection : class="kw">public CNeuronMemory { class="kw">protected: CNeuronLSTMOCL cChangeLSTM; CNeuronMambaOCL cChangeMamba; CNeuronRelativeCrossAttention cCrossAttention[class="num">2]; class=class="str">"cmt">//--- class="kw">virtual class="type">bool feedForward(CNeuronBaseOCL *NeuronOCL) class="kw">override; class="kw">virtual class="type">bool calcInputGradients(CNeuronBaseOCL *NeuronOCL) class="kw">override; class="kw">virtual class="type">bool updateInputWeights(CNeuronBaseOCL *NeuronOCL) class="kw">override; class="kw">public: CNeuronLowLevelReflection(class="type">void) {}; ~CNeuronLowLevelReflection(class="type">void) {}; class=class="str">"cmt">//--- class="kw">virtual class="type">bool Init(class="type">uint numOutputs, class="type">uint myIndex, COpenCLMy *open_cl, class="type">uint window, class="type">uint window_key,