免费期货量化软件:多层感知器和反向传播算法

免费期货量化软件:多层感知器和反向传播算法

什么是 TensorFlow?

TensorFlow 是一个快速数值处理的开源函数库。

它是由 Google 依照 Apache 开源许可下创建、支持和发布。 该 API 是为 Python 语言设计的,尽管它也可以访问基本的 C++ API。

与设计用于深度学习的其它数字函数库(例如 Theano)不同,TensorFlow 意在研究和生产。 例如,Google 用到的基于机器学习的搜索引擎 RankBrain,和一个非常有趣的计算机视觉项目 DeepDream。

它可以在一个 CPU、GPU 或小型移动设备上的系统中运行,也可在由数百台计算机组成的大型分布式系统中运行。

什么是 Keras?

Keras 是一个功能强大,且易于使用的开源 Python 函数库,用于开发和评估深度学习模型。

它涉及强大的 Theano 和 TensorFlow 计算函数库。 它能够在短短几行代码中定义和训练神经网络模型。

教程

本教程分为 4 个章节:

  1. 在 MetaEditor 中安装和准备 Python 环境。

  2. 初期步骤和模型重建(感知器和 MLP)。

  3. 利用 Keras 和 TensorFlow 创建一个简单的模型。

  4. 如何集成 MQL5 和 Python。

1. 安装和准备 Python 环境。 首先,您应该从官方网站 www.python.org/downloads/ 下载 Python 为了使用 TensorFlow,您应该安装 3.3 和 3.8 之间的版本(我个人使用 3.7)。 下载并开始安装过程后,选中 “Add Python 3.7 to PATH” 选项。 这可确保某些事情马上就能工作,且无需以后额外配置。 然后可以直接从赫兹期货量化终端轻松运行 Python 脚本。

  • 定义 Python 可执行路径(环境)

  • 安装项目所需的依赖部件

打开 MetaEditor,并进入“工具\选项”。 在此处指定 Python 可执行文件所在的路径。 注意,安装后它应该有默认的 Python 路径。 如果没有,则需手工输入可执行文件的完整路径。 如此即可令您直接从 MetaTrader 5 终端运行脚本。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

我个人使用一个完全独立的函数库环境,称为虚拟环境。 这是一种获得“干净”安装并仅收集产品所需的库的方法。 有关 venv 包的更多信息,请阅读此处。 一旦完毕,您就能够直接从终端运行 Python 脚本。 对于这个项目,赫兹期货量化需要安装以下函数库。 如果您不确定如何安装这些库,请参阅相关的模块安装指南。

现在,赫兹期货量化已经安装并配置好了环境,下面我们来进行一个小测试,了解如何在终端中创建和运行一个小脚本。 为了直接从 MetaEditor 启动新脚本,请按照以下步骤操作: 新建 > Python 脚本

编辑

添加图片注释,不超过 140 字(可选)

为您的脚本指定名称。 MetaEditor 中的 MQL 向导会自动提示您需要导入一些函数库。 这很有趣,且对于我们的实验,我们要选择 Numpy 选项。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

现在,赫兹期货量化创建一个生成正弦图的简单脚本。 # Copyright 2021, Lethan Corp. # https://www.mql5.com/pt/users/14134597 import numpy as np import matplotlib.pyplot as plt data = np.linspace(-np.pi, np.pi, 201) plt.plot(data, np.sin(data)) plt.xlabel('Angle [rad]') plt.ylabel('sin(data)') plt.axis('tight') plt.show() 为了运行脚本,只需按 F7 进行编译,然后打开 MetaTrader 5 终端,并在图表上运行脚本。 如果有需要打印的内容,则结果将显示在智能系统选项卡中。 在我们的例子中,脚本会打开一个窗口,其中包含我们所创建的函数图。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

2. 初期步骤和模型重建(感知器和 MLP)。 出于便利起见,赫兹期货量化将采用与 MQL5 示例中相同的数据集合。 下面是 predict() 函数,它针对给定权重集合的指标线预测其输出值。 此处的第一种情况也是偏差。 此外,还有一个激活函数。 # Transfer neuron activation def activation(activation): return 1.0 if activation >= 0.0 else 0.0 # Make a prediction with weights def predict(row, weights): z = weights[0] for i in range(len(row) - 1): z += weights[i + 1] * row[i] return activation(z) 如您所知,为了训练网络,我们需要实现梯度下降过程,这已在上一篇文章中有详细解释。 作为延续,我将展示一个训练函数 “train_weights()”。 # Estimate Perceptron weights using stochastic gradient descent def train_weights(train, l_rate, n_epoch): weights = [0.0 for i in range(len(train[0]))] #random.random() for epoch in range(n_epoch): sum_error = 0.0 for row in train: y = predict(row, weights) error = row[-1] - y sum_error += error**2 weights[0] = weights[0] + l_rate * error for i in range(len(row) - 1): weights[i + 1] = weights[i + 1] + l_rate * error * row[i] print('>epoch=%d, lrate=%.3f, error=%.3f' % (epoch, l_rate, sum_error)) return weights MLP 模型的应用: 本教程分为 5 个部分:

  • 网络启动

  • 前馈

  • 反向传播

  • 训练

  • 预测

网络启动 赫兹期货量化从简单的事情开始,先创建一个新网络,并准备好进行学习。 每个神经元都有一组需要维护的权重,每个输入与一个权重连接,且有一个额外的偏置权重。 我们需要在训练期间保存神经元的其它属性,因此我们将利用字典来表示每个神经元,并按名称存储属性,例如对于权重就是 “weights”。 from random import seed from random import random # Initialize a network def initialize_network(n_inputs, n_hidden, n_outputs): network = list() hidden_layer = [{'weights':[random() for i in range(n_inputs + 1)]} for i in range(n_hidden)] network.append(hidden_layer) output_layer = [{'weights':[random() for i in range(n_hidden + 1)]} for i in range(n_outputs)] network.append(output_layer) return network seed(1) network = initialize_network(2, 1, 2) for layer in network: print(layer) 现在我们知道如何创建和启动网络,我们来看看如何用它来计算输出数据。

前馈

 
 

from math import exp # Calculate neuron activation for an input def activate(weights, inputs): activation = weights[-1] for i in range(len(weights)-1): activation += weights[i] * inputs[i] return activation # Transfer neuron activation def transfer(activation): return 1.0 / (1.0 + exp(-activation)) # Forward propagate input to a network output def forward_propagate(network, row): inputs = row for layer in network: new_inputs = [] for neuron in layer: activation = activate(neuron['weights'], inputs) neuron['output'] = transfer(activation) new_inputs.append(neuron['output']) inputs = new_inputs return inputs # test forward propagation network = [[{'weights': [0.13436424411240122, 0.8474337369372327, 0.763774618976614]}], [{'weights': [0.2550690257394217, 0.49543508709194095]}, {'weights': [0.4494910647887381, 0.651592972722763]}]] row = [1, 0, None] output = forward_propagate(network, row) print(output)

通过运行上面的脚本,赫兹期货量化得到以下结果:

[0.6629970129852887, 0.7253160725279748]

实际输出值现在看来很荒谬。 但我们很快就会看到神经元中的权重如何起更大作用。

反向传播

 
 

# Calculate the derivative of an neuron output def transfer_derivative(output): return output * (1.0 - output) # Backpropagate error and store in neurons def backward_propagate_error(network, expected): for i in reversed(range(len(network))): layer = network[i] errors = list() if i != len(network)-1: for j in range(len(layer)): error = 0.0 for neuron in network[i + 1]: error += (neuron['weights'][j] * neuron['delta']) errors.append(error) else: for j in range(len(layer)): neuron = layer[j] errors.append(expected[j] - neuron['output']) for j in range(len(layer)): neuron = layer[j] neuron['delta'] = errors[j] * transfer_derivative(neuron['output']) # test backpropagation of error network = [[{'output': 0.7105668883115941, 'weights': [0.13436424411240122, 0.8474337369372327, 0.763774618976614]}], [{'output': 0.6213859615555266, 'weights': [0.2550690257394217, 0.49543508709194095]}, {'output': 0.6573693455986976, 'weights': [0.4494910647887381, 0.651592972722763]}]] expected = [0, 1] backward_propagate_error(network, expected) for layer in network: print(layer)

当运行时,该示例在完成错误检查后打印网络。 如您所见,输出层和隐藏层的误差值已进行计算,并保存在神经元之中。

[{'output': 0.7105668883115941, 'weights': [0.13436424411240122, 0.8474337369372327, 0.763774618976614], 'delta': -0.0005348048046610517}] [{'output': 0.6213859615555266, 'weights': [0.2550690257394217, 0.49543508709194095], 'delta': -0.14619064683582808}, {'output': 0.6573693455986976, 'weights': [0.4494910647887381, 0.651592972722763], 'delta': 0.0771723774346327}]

网络训练

 
 

from math import exp from random import seed from random import random # Initialize a network def initialize_network(n_inputs, n_hidden, n_outputs): network = list() hidden_layer = [{'weights':[random() for i in range(n_inputs + 1)]} for i in range(n_hidden)] network.append(hidden_layer) output_layer = [{'weights':[random() for i in range(n_hidden + 1)]} for i in range(n_outputs)] network.append(output_layer) return network # Calculate neuron activation for an input def activate(weights, inputs): activation = weights[-1] for i in range(len(weights)-1): activation += weights[i] * inputs[i] return activation # Transfer neuron activation def transfer(activation): return 1.0 / (1.0 + exp(-activation)) # Forward propagate input to a network output def forward_propagate(network, row): inputs = row for layer in network: new_inputs = [] for neuron in layer: activation = activate(neuron['weights'], inputs) neuron['output'] = transfer(activation) new_inputs.append(neuron['output']) inputs = new_inputs return inputs # Calculate the derivative of an neuron output def transfer_derivative(output): return output * (1.0 - output) # Backpropagate error and store in neurons def backward_propagate_error(network, expected): for i in reversed(range(len(network))): layer = network[i] errors = list() if i != len(network)-1: for j in range(len(layer)): error = 0.0 for neuron in network[i + 1]: error += (neuron['weights'][j] * neuron['delta']) errors.append(error) else: for j in range(len(layer)): neuron = layer[j] errors.append(expected[j] - neuron['output']) for j in range(len(layer)): neuron = layer[j] neuron['delta'] = errors[j] * transfer_derivative(neuron['output']) # Update network weights with error def update_weights(network, row, l_rate): for i in range(len(network)): inputs = row[:-1] if i != 0: inputs = [neuron['output'] for neuron in network[i - 1]] for neuron in network[i]: for j in range(len(inputs)): neuron['weights'][j] += l_rate * neuron['delta'] * inputs[j] neuron['weights'][-1] += l_rate * neuron['delta'] # Train a network for a fixed number of epochs def train_network(network, train, l_rate, n_epoch, n_outputs): for epoch in range(n_epoch): sum_error = 0 for row in train: outputs = forward_propagate(network, row) expected = [0 for i in range(n_outputs)] expected[row[-1]] = 1 sum_error += sum([(expected[i]-outputs[i])**2 for i in range(len(expected))]) backward_propagate_error(network, expected) update_weights(network, row, l_rate) print('>epoch=%d, lrate=%.3f, error=%.3f' % (epoch, l_rate, sum_error)) # Test training backprop algorithm seed(1) dataset = [[2.7810836,2.550537003,0], [1.465489372,2.362125076,0], [3.396561688,4.400293529,0], [1.38807019,1.850220317,0], [3.06407232,3.005305973,0], [7.627531214,2.759262235,1], [5.332441248,2.088626775,1], [6.922596716,1.77106367,1], [8.675418651,-0.242068655,1], [7.673756466,3.508563011,1]] n_inputs = len(dataset[0]) - 1 n_outputs = len(set([row[-1] for row in dataset])) network = initialize_network(n_inputs, 2, n_outputs) train_network(network, dataset, 0.5, 20, n_outputs) for layer in network: print(layer)

训练后,打印网络,显示学习到的权重。 此外,网络仍然拥有可以忽略的输出和增量值。 如有必要,赫兹期货量化可以更新我们的训练函数,去删除这些数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1621624.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

免费期货量化软件策略:艾伦·安德鲁斯和他的时间序列分析技术

我相信,所有现代图表分析应用程序都会包括 安德鲁草叉。 在高级系统中,在原本的三条主线中会添加一些额外的线(例如,为了更方便,赫兹期货量化中加入了“侧边”等级)。 一些开发人员在他们的程序中包括“希夫…

免费期货量化软件:数据科学与机器学习——线性回归

它是一个跨学科领域,它运用科学方法、流程、算法、系统,从嘈杂、结构化和非结构化数据中提取出知识和见解,并将这些知识和可操作的见解在广泛的应用领域加以运用。 数据科学家则是创建编程代码、并将其与统计学相结合,从中挖掘创…

免费期货量化软件策略:在一张图表上的多个指标为用户开发

通常,当我们开始实现一个新系统时,我们并不真正知道我们如何对其进行改进;故此,我们应该始终启动一个新项目,并着眼于未来进行改进。 这对那些刚开始的人来说非常重要:持续地规划一些事情,想象未…

免费期货量化软件策略您能用移动平均线做什么呢?

我们将学习布林带,它测量数据在其平均值附近的离散度。该指标由约翰博林格(John Bollinger)创造。 它由围绕 20 天移动平均线的两条波段构成,以测量数据(价格)在其均值(20 天移动平均线&#xf…

免费期货量化软件策略:从头开始开发智能交易系统(第 25 部分)

概述 在上一篇文章提供系统健壮性 (I)中,赫兹期货量化已经看到了如何更改 EA 的某些部分,从而令系统更加可靠和健壮。 这只是针对兹期货量化将要在本文中所做之事的介绍。 请忘记您所知道的、计划的、或希望的一切。 这里最困难…

免费期货量化软件:学习如何设计一款布林带Bollinger Bands交易系统

我们将学习布林带,它测量数据在其平均值附近的离散度。该指标由约翰博林格(John Bollinger)创造。 它由围绕 20 天移动平均线的两条波段构成,以测量数据(价格)在其均值(20 天移动平均线&#xf…

免费期货量化软件:针对交易的组合数学和概率论曲线分析

赫兹期货量化将继续为构建多重状态、可扩展的交易系统奠定基础。 在本文的框架内,我想为您展示如何利用前几篇文章中的发展成果,来进一步阐述交易过程的广泛可能性。 这有助于从这些层面评估策略,来弥补其它分析方法未能涵盖的地方。 在本文中…

免费期货量化软件:从头开始开发智能交易系统概念上的飞跃

有时,在开发一些项目时,我们也许会发现新的思路和新的可能特性,这些特性能够派上用场,并为我们正在创建的系统提供极大的改进。 但问题出来了:实现新功能的最简单途径是什么? 问题在于,有时我们…

Bugku 密室逃脱 WP

一、打开题目 二、解压文件夹,查看文件和压缩包,发现压缩包进行了加密 三、查看剧本,发现摩斯密码,并解析得到电脑密码:xjpc 四、输入电脑密码得到一张图片和一个压缩包,查看图片发现图片位置发生错误&a…

如何不下载软件来制作自己的网站

注意:本文使用Windows操作系统。如果你计算机的操作系统不是Windows,这篇文章对于你来说没有丝毫意义。 我们前几天介绍了如何建立一个自己的网站,虽然也有用,但是下载了许多软件。Windows系统就自带了一个名为IIS的软件&#xff…

能优化你的网站的网页制作软件

做一个网站也许并不是一件很难的事情,但是想做出漂亮而且极富个性的网站就不那么容易了。这里笔者就给大家介绍几款用于修饰和改造网页的软件,让你的主页效果更炫一些。 有声有色 “有声有色”是给网页添加Java特效的一款软件,它集合了518个十…

搭建个人网站软件安装

搭建个人网站软件安装(均在Root用户下完成) 系统环境为:Centos7.6 参考文献: 在CentOS 7系统上安装PHP 7.4版本的方法 解决CentOS中yum安装程序时出现的"Transaction check error"错误 Centos7下安装MySQL Centos 7下安装配置Nginx Ngi…

个人网站搭建,个人网站需要什么软件

好的网页设计软件通过编码平台或简单的拖放就可以构架一个简单的个人网站。过去的网站建设需要用HTMLCSS和JS来制作。然而随着建站技术越来越成熟,拖放式网页制作工具越来越普遍,任何人都可以轻而易举地搭建自己的个人网站。 在本文中,我们将…

建站软件用什么呢?

建站软件用什么呢?目前网络上有很多建站软件都是可以建网站使用的,企业用户可以根据自己的需求去选。目前网络上建站软件有两种,一种是免费的,另一种是收费的。免费的建设网站软件一般功能是有限制的,只要能够符合用户…

VS警告 C4819 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失

1、问题 Microsoft visual studio 2019跑仿真的时候出现该警告,在高级保存选项设置编码为Unicode(UTF-8 无签名)还是会有该警告。 2、解决方法 右键项目,打开属性设置,选中:工程 -> 右键选择"属性" -> C/C ->…

webassembly003 GGML Tensor Library part-1

GGML ggml的函数 可以看到官方示例项目仅依赖于#include "ggml/ggml.h", #include "common.h",可以阅读ggml.h获取ggml的使用帮助 函数解释注释ggml_tensor多维张量按行主顺序存储。ggml_tensor结构包含每个维度中元素数&#xf…

Redis数据结构全解析【万字详解】

文章目录 前言一、SDS1、SDS的必要性2、SDS的数据结构3、SDS的优势O(1)复杂度获取字符串长度二进制安全不会发生缓冲区溢出节省空间 二、链表1、结构设计2、优缺点 三、压缩列表1、结构设计2、连续更新3、压缩列表的缺陷 四、哈希表1、结构设计2、哈希冲…

安装单片机开发工具Keil5和仿真开发板proteus

项目场景: 安装单片机开发工具Keil5和仿真开发板proteus 为啥不买开发板? 这里不使用开发板的原因是单独买个开发板其实还行,但是很多外设,而且加上本来自己是自学的,啥也不懂,坏的几率很大。 网上说买开发板实际开…

Linux下安装qt5步骤

Qt下载 Qt官方下载非常慢。Qt 官网有一个专门的资源下载网站,所有的开发环境和相关工具都可以从这里下载,具体地址是:http://download.qt.io/ 下载方式可以看这个教程Qt教程网站 当然也可以直接去我的百度网盘里下载 链接:https…