神经网络实践:绘制神经元(基础篇)
📘

神经网络实践:绘制神经元(基础篇)

第 1/2 篇

「在 MT5 里画出单个神经元」

想直观理解人工神经元怎么算,最快的办法不是读公式,而是在 MetaTrader 5 里自己写一个并画出来。一个神经元本质就是「加权求和 + 激活函数」,输入层层进来,乘上权重再加偏置,最后过一道激活函数输出。 下面这段 MQL5 脚本在独立窗口画出神经元结构:圆点代表输入,箭头带权值,中心节点是求和后再走激活。你可以直接丢进 MT5 的脚本目录跑,看权值正负如何改变连线方向。 [CODE] #property indicator_separate_window #property indicator_buffers 1 #property indicator_plots 1 //--- 输入与权重 double inputs[3] = {1.0, -0.5, 0.3}; double weights[3] = {0.8, -1.2, 0.4}; double bias = 0.1; //--- 神经元计算 double NeuronOutput(double &inp[], double &w[], double b) { double sum = b; for(int i=0; i<ArraySize(inp); i++) sum += inp[i]*w[i]; return 1.0/(1.0+MathExp(-sum)); // sigmoid 激活 } [/CODE] 逐行看:前 3 行是 MT5 指标声明,指定独立子窗口和 1 个绘图缓冲。inputs 与 weights 各 3 个值,bias 是偏置 0.1。NeuronOutput 函数先令 sum=bias,循环累加 inp[i]*w[i],最后用 sigmoid 把结果压到 0~1 之间。 跑完你会看到:当权重里出现 -1.2 这种负值,对应输入对输出的拉动就是反向的。外汇与贵金属行情高波动,用这类小模型做特征实验前,务必先用历史数据验证稳定性,实盘有本金亏损可能。

MQL5 / C++
class="macro">#class="kw">property indicator_separate_window
class="macro">#class="kw">property indicator_buffers class="num">1
class="macro">#class="kw">property indicator_plots class="num">1
class=class="str">"cmt">//--- 输入与权重
class="type">class="kw">double inputs[class="num">3] = {class="num">1.0, -class="num">0.5, class="num">0.3};
class="type">class="kw">double weights[class="num">3] = {class="num">0.8, -class="num">1.2, class="num">0.4};
class="type">class="kw">double bias = class="num">0.1;
class=class="str">"cmt">//--- 神经元计算
class="type">class="kw">double NeuronOutput(class="type">class="kw">double &inp[], class="type">class="kw">double &w[], class="type">class="kw">double b) {
   class="type">class="kw">double sum = b;
   for(class="type">int i=class="num">0; i<ArraySize(inp); i++) sum += inp[i]*w[i];
   class="kw">return class="num">1.0/(class="num">1.0+MathExp(-sum)); class=class="str">"cmt">// sigmoid 激活
}

◍ 神经网络不是会思考的黑箱

不少交易者把神经网络当成某种能自主‘理解’行情的智能体,其实它只是一组复杂的数学方程。在 MT5 里加载任意神经网络指标,它做的无非是对已分类数据计算新数据点归属某类的概率,而非预测未来。 上一篇文章讲了伪逆法,处理的是预处理、过滤过的数据集。一旦喂给网络的是未过滤的裸价或原始 tick,很多人就误以为网络在‘像人一样学习’——这是最常见的认知坑。事实是:未过滤数据下,网络依然靠数学关系建立相关性,没有隐藏智慧。 本系列目标很直接:演示神经网络到底怎么从数据里学出相关性。我们从绝对基础的单个人工神经元搭起,不绕术语。你在 MT5 里随便开一个 EURUSD 的 M1 裸价序列,就能验证——网络对未过滤序列给出的分类概率,和过滤后差异极大,外汇与贵金属杠杆交易高风险,别把概率当方向指令。

割线逼近才是神经网络的内核

忘掉新闻里那些被包装成黑科技的叙事。神经网络几十年前就在迭代,核心数学并不神秘:它一切围绕一条‘割线’展开——用一串离散数据点去逼近那条真正的切线。 此前文章为省步骤直接给切线公式,那是数据库已过滤、结构清晰时的捷径;一旦数据残缺或非结构化,就只能让网络反复喂入原始样本,自己慢慢学出近似切线,这个过程就是训练。 拿你做过的回测对照就懂:选模型→图表找信号,等同于训练;随机周期验证模型是否仍生效,等同于测试;开模拟盘盲测,就是看那套数学表达是否可靠。经验交易者都清楚,它从不会 100% 准,误差小才够用。 外汇与贵金属市场的高波动会让非结构数据噪声放大,这类训练出的模型失效概率更高,实盘前必须用 MT5 策略测试器跑盲测。 网络最终产出的,就是一个能识别模式的方程——手写、面部、分子结构或行情形态,本质同一套数学。

「从一行打印到会算错的单神经元」

搭神经网络别一上来就堆层,先让一个神经元跑起来更有用。最原始的样子只是往终端丢一句 'The first neuron...',但把它改成脚本读训练集,事情就开始了:下面这组 Train 数组里,输入 0~4 对应的输出是 0、2、4、6、8,明眼人一看就是乘 2,可神经元起初并不知道。 我们给神经元一个权重 weight,用 MathSrand 固定种子而非系统时钟,让伪随机起点可复现。宏 macroRandom 把 rand() 除以 SHORT_MAX,使 weight 落在 0 到 1 之间,方向未定。此时神经元只持有一条最简直线方程 y = a·x + b,其中 b 暂设 0,a 就是那个随机 weight。 让机器自己找方程而不是人填数字,这一步最容易被误解。我们不是告诉它乘几,而是给它起点去逼近能拟合数据的公式。接着挂上误差 err,用割线去蹭切线,电脑自动调 weight 来压低 err。跑起来有时收敛到正确解,有时完全发散——外汇与贵金属模型里这种不可预测性本就是高风险信号,别以为单神经元就稳。 现在神经元骨架已有:训练数据、随机权重、线性前向、误差计算。下一步让 MT5 替你疯跑调权,比手调前几篇的那套更贴近实战。

MQL5 / C++
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#class="kw">property copyright "Daniel Jose"
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void OnStart()
{
    Print("The first neuron...");
}
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#class="kw">property copyright "Daniel Jose"
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void OnStart()
{
    class="type">class="kw">double Train[][class="num">2] {
                    {class="num">0, class="num">0},
                    {class="num">1, class="num">2},
                    {class="num">2, class="num">4},
                    {class="num">3, class="num">6},
                    {class="num">4, class="num">8},
                    };
    Print("The first neuron...");
}
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#class="kw">property copyright "Daniel Jose"
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#define macroRandom(rand() / (class="type">class="kw">double)SHORT_MAX)
class=class="str">"cmt">//+------------------------------------------------------------------+
class="type">void OnStart()
{
    class="type">class="kw">double Train[][class="num">2] {
                    {class="num">0, class="num">0},
                    {class="num">1, class="num">2},

常见问题

用折线或圆形对象在图表上标出输入权重和输出值,先把单神经元的前向计算用代码打印出来再可视化。
神经网络只是用割线逼近非线性关系,过拟合和样本偏差会让实盘概率倾向走弱,需做样本外检验。
小布可以读取你的品种页数据并跑一遍前向计算,对比图表输出帮你定位算错或画错的位置。
靠大量分段线性连接去拼出曲线,段数越多越接近真实函数,但计算成本和过拟合风险也越高。
先确保输出值能正常打印,再创建图表对象绑定坐标,把数值映射成像素位置即可看到节点。