股票量化交易软件:神经网络在交易中的实际应用2---计算机视觉

文章介绍了使用卷积神经网络(CNN)进行股票期货量化软件的图像分类。通过设置CNN结构,包括不同尺寸的卷积层、池化层和全连接层,处理449x449像素的图像。利用Anaconda环境和Keras库,配合GPU进行模型训练,以加速学习过程。训练数据集通过MetaTrader5平台生成,并进行了预处理。文章强调了神经网络在图像分类任务中的应用,以及GPU对于训练速度的提升作用。
摘要由CSDN通过智能技术生成

卷积神经网络结构

在本文中,我们将使用卷积神经网络,其架构如图所示。该方案给出了构造赫兹量化软件的一般原理。 

在这种情况下,我们有:

  1. CNN输入,大小为449x449像素的图像。
  2. 第一个卷积层包含96个特征图(feature map),每张图都是447x447大小的图像。卷积核为 3x3。
  3. 子样本层包含96个特征图,大小为223x223,内核为2x2。
  4. 第二层卷积32个特征图,每张图都是大小为221x221的图像。卷积核为 3x3。
  5. 32个特征映射的子样本层,大小为110x110,内核为2x2。
  6. 第三层卷积16个特征图,每张图都是108x108大小的图像。卷积核为 3x3。
  7. 子样本层包含16个特征图,大小为54x54,内核为2x2,图中未显示。
  8. 64个神经元的完全连接层。
  9. 一个神经元的输出层。这两层代表分类单元。

如果你是新的卷积神经网络,不要担心看似繁琐和复杂的建设。给定结构的神经网络是自动建立的,您只需要设置主要参数。 赫兹股票期货量化软件
 

为神经网络训练和测试准备一组图像

在准备一组图像之前,先定义神经网络的用途。理想情况下,在轴枢点上训练网络会很好。根据这个目的,我们需要用最后一个极值柱做截图。然而,这个实验没有实际价值。这就是为什么我们将使用另一组图像。此外,还可以使用不同的数组进行实验,包括上面提到的数组。这也可能为神经网络在解决基于图像的分类任务时的效率提供额外的证据。在连续时间序列上获得的神经网络响应需要额外的优化。 赫兹股票期货量化软件

让我们不要把实验复杂化,集中在两类图像上:

  • 买入 - 当价格上涨或达到每日低点时
  • 卖出 - 当价格下跌或达到每日高点时

       

出于神经网络训练的目的,任何方向的移动都将被确定为价格在趋势方向上达到新的极值。此时将制作图表截图。趋势反转时刻对网络训练也很重要。当价格达到每日高点或低点时,还将制作图表截图。赫兹股票期货量化软件

在开始操作之前,我们需要准备图表外观。使用 CNN.tpl 模板。把它保存到赫兹股票期货量化软件 \AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\MQL5\Profiles\Templates.

在图表属性中将文本定义为“White”。

也可以附加任何其他指标,我随意拿了这些指标。还建议根据您的硬件功能找到最佳图表大小。

使用以下脚本创建图像数组。赫兹股票期货量化软件

//+------------------------------------------------------------------+
//|                                                        CNNet.mq5 |
//|                                   Copyright 2021, Andrey Dibrov. |
//|                           https://www.mql5.com/en/users/tomcat66 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, Andrey Dibrov."
#property link      "https://www.mql5.com/en/users/tomcat66"
#property version   "1.00"
#property strict
#property script_show_inputs

input string Date="2017.01.02 00:00";
input string DateOut="2018.12.13 23:00";
input string DateTest="2019.01.02 00:00";
input string Dataset="Train";

string Date1;
int count,countB,countS;
int day;
double DibMin;
double DibMax;
int HandleDate;
long WIDTH;
long HEIGHT;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlDateTime stm;
   ChartSetInteger(0,CHART_SHIFT,false);
   ChartSetInteger(0,CHART_AUTOSCROLL,false);
   ChartSetInteger(0,CHART_SHOW_OBJECT_DESCR,false);
   WIDTH=ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);
   ChartSetInteger(0,CHART_SHOW_PRICE_SCALE,false);

   if(Dataset=="Test")
     {
      HandleDate=FileOpen(Symbol()+"Date.csv",FILE_CSV|FILE_READ|FILE_WRITE|FILE_ANSI,";");
      ChartNavigate(0,CHART_END,-(iBarShift(NULL,PERIOD_H1,StringToTime(DateTest))));
      Sleep(1000);

      for(int i=iBarShift(NULL,PERIOD_H1,StringToTime(DateTest)); i>0; i--)
        {
         Date1=TimeToString(iTime(NULL,PERIOD_H1,i));
         if(DateTest<=Date1)
           {
            if(ChartNavigate(0,CHART_END,-i))
              {
               Sleep(20);
               if(ChartScreenShot(0, (string)count + ".png", (int)WIDTH, (int)WIDTH, ALIGN_LEFT))
                 {
                  FileWrite(HandleDate,TimeToString(iTime(NULL,PERIOD_H1,i)));
                  count++;
                  Sleep(20);
                 }
              }
           }
        }
     }
   if(Dataset=="Train")
     {
      ChartNavigate(0,CHART_END,-iBarShift(NULL,PERIOD_H1,StringToTime(Date)));
      Sleep(1000);
      for(int i=iBarShift(NULL,PERIOD_H1,StringToTime(Date)); i>=iBarShift(NULL,PERIOD_H1,StringToTime(DateOut)); i--)
        {
         TimeToStruct(iTime(NULL,PERIOD_H1,i),stm);
         Date1=TimeToString(iTime(NULL,PERIOD_H1,i));
         if(DateOut>=Date1 && Date<=Date1)
           {
            if(ChartNavigate(0,CHART_END,-i))
              {
               Sleep(20);
               if(day != stm.day)
                 {
                  FileCopy("Sell" + (string)countS + ".png", 0, "Buy" + (string)(countB+1) + ".png", FILE_REWRITE);
                  FileDelete("Sell" + (string)countS + ".png", 0);
                  FileCopy("Buy" + (string)countB + ".png", 0, "Sell" + (string)(countS+1) + ".png", FILE_REWRITE);
                  FileDelete("Buy" + (string)countB + ".png", 0);
                  countB ++;
                  countS ++;
                 }
               day = stm.day;
               if(stm.hour == 0)
                 {
                  DibMin = iOpen(NULL, PERIOD_H1, i);
                  DibMax = iOpen(NULL, PERIOD_H1, i);
                 }
               if(iLow(NULL, PERIOD_H1, i+1) < DibMin)
                 {
                  DibMin = iLow(NULL, PERIOD_H1, i+1);
                  countS ++;
                  ChartScreenShot(0, "Sell" + (string)countS + ".png", (int)WIDTH, (int)WIDTH, ALIGN_LEFT);
                 }
               if(iHigh(NULL, PERIOD_H1, i+1) > DibMax)
                 {
                  DibMax = iHigh(NULL, PERIOD_H1, i+1);
                  countB ++;
                  ChartScreenShot(0, "Buy"  +(string)countB + ".png", (int)WIDTH, (int)WIDTH, ALIGN_LEFT);
                 }
               Sleep(20);
              }
           }
         else
            break;
        }
     }
  }

脚本在两种模式下工作:“Train”-创建一个用于训练的图像数组,“Test”-创建一个用于获取神经网络响应的图像数组,根据该数组将生成一个指标。此外,该指标将用于优化交易策略。赫兹股票期货量化软件 

让我们以“Train”模式运行脚本。赫兹股票期货量化软件

变量“Date”- 样本的初始数据,将在其中选择用于训练的图像。"DateOut' — 选择用于训练的图像的采样周期的结束日期。"DateTest" — 从神经网络中选择图像以获得每小时响应的开始日期。结束日期将是脚本启动时间。 赫兹股票期货量化软件

一系列买入。。。卖出。。。图像将保存在数据目录的…\MQL5\Files文件夹中。图片总数为6125张。赫兹股票期货量化软件

接下来,为训练、验证和测试集准备目录。为方便起见,在桌面上创建“CNN”文件夹,并在其中创建三个文件夹-“Train”、“Val”、“Test”。赫兹股票期货量化软件

在“Train”和“Val”目录中,创建子目录“Buy”和“Sell”。在“Test”下创建一个子目录“Resp”。

从文件夹..\MQL5\Files中,剪切所有文件“Buy…”并将其粘贴到…\Train\Buy。我们有3139张图片。对“Sell…”重复相同的步骤,并将其添加到…\Train\Sell。这里有2986张图片。从文件夹“Buy”和“Sell”,削减30%的最后(有最高的数字)图像和过去他们的相应子文件夹下的“Val”。

我们现在拥有的 

  • ...\Train\Buy - 2198 张图片 
  • ...\Val\Buy   - 941 张图片
  • ...\Train\Sell - 2091 张图片
  • ...\Val\Sell   - 895 张图片

我们已经准备了一组图像用于训练网络。我有449x449像素的图像。

准备一组图像进行测试。以“Test”模式运行脚本。

一组连续的每小时屏幕截图将保存到 ...\MQL5\文件中。它们现在是12558个。不要将它们分开或分组,因为神经网络应该自己进行分组。更准确地说,网络应该显示图像与网络训练条件相对应的概率。向上和向下移动。向下移动并向上翻转。 赫兹股票期货量化软件

将这些文件剪切粘贴到 ...CNN\Test\Resp。赫兹股票期货量化软件

我们准备了一组图像,用于测试响应和优化策略。日期和时间为 EURUSDDate 的文件,保留在..\MQL5\files下,应该移动到CNN文件夹。赫兹股票期货量化软件

我想指出 MetaTrader 5 的一个特殊特性。在策略测试器中使用专家顾问来准备一组图像将更加方便和可靠。但是,MetaTrader 5不提供在策略测试器中创建赫兹股票期货量化软件功能。无论如何,这个特定功能不会影响交易机器人的创建。

训练神经网络

我们将使用 Anaconda 环境处理卷积网络。它应该配置为与 CPU 和 GPU(如果你有一个NVIDIA显卡)一起工作。这个显卡是加快学习过程所需要的。尽管如此,它还是对创建神经网络体系结构施加了一些限制——依赖于显卡的RAM数量。但学习速度明显提高。例如,在我的例子中,CPU上的一个训练 epoch 持续20分钟,而GPU上需要1-2分钟。如果网络是40个 epoch 的训练,那么我将需要13和1.5个小时。GPU的使用可以大大加快研究阶段的神经网络搜索过程。赫兹股票期货量化软件

  1. 下载 并安装最新的Anaconda Navigator版本。在所有步骤中使用默认设置。
  2. 使用菜单“Start\Anaconda3”启动“Anaconda Prompt”。
  3. 运行命令 "pip install tensorflow". 安装 Google 开发的 用于 机器学习的程序库 。

     
  4. 运行命令 "pip install keras". 安装 Keras 神经网络开发库。


     
  5. 在GPU下创建一个新的“conda”环境。键入命令 conda create--name PythonGPU。激活环境 - activate PythonGPU.

     
  6. 安装 tensorflow gpu, 键入命令 conda create -n PythonGPU python=3.6 tensorflow-gpu. 请注意,应为 python 3.6 安装 tensorflow gpu。
      


     

  7. 安装 keras gpu, 键入命令 conda install -c anaconda keras-gpu.

  8. 在 Python GPU 环境中安装用于编程的 Jupyter 接口。CPU Jupyter 在安装 Anaconda 时已经安装好了。键入命令 - conda install jupyter.
      

  9. 安装另外两个库, Pandas 和 Pillow - conda install -c anaconda pandas. 然后 - conda install pillow. 如果您不打算使用显卡,也应该为CPU安装这些库。
     


  10.  
  11. 我们现在可以开始训练卷积神经网络了。将两个文件添加到先前创建的CNN文件夹: Train.ipynb and Test.ipynb. 这些是 Jupyter Notebook 格式的文件,我们将使用它们。运行 Jupyter Notebook (PythonGPU) 打开文件 Train,  赫兹股票期货量化软件  

让我们探讨一下程序代码的每个部分。

首先加载必要的神经网络库模块。

from tensorflow.python.keras.preprocessing.image import ImageDataGenerator
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Conv2D, MaxPooling2D
from tensorflow.python.keras.layers import Activation, Dropout, Flatten, Dense
from tensorflow.keras.callbacks import ModelCheckpoint
from tensorflow.keras.models import load_model

然后设置所需的超参数。

# Directory with data for training
train_dir = 'train'
# Directory with data for validation
val_dir = 'val'
# Image dimensions
img_width, img_height = 449, 449
# Image-based tensor dimension for input to the neural network
# backend Tensorflow, channels_last
input_shape = (img_width, img_height, 3)
# Number of epochs
epochs = 20
# Mini-sample size
batch_size = 7
# Number of images for training
nb_train_samples = 4289
# Number of images for validation
nb_validation_samples = 1836
# Number of images for testing
#nb_test_samples = 3736

让我们创建网络架构。

  • 建立序列卷积神经网络结构
  • 输入图像大小为449x449像素,三通道(红色、绿色和蓝色)。这里我们使用彩色图像,你也可以尝试单色图像
  • 创建第一个用于处理二维数据的卷积层:96个特征图,每个特征图都有3x3卷积内核。卷积层的每个神经元连接到图像的一个3x3的正方形部分 
  • 激活层使用“relu”函数,计算量较小
  • 为了减少维数,添加一个带有2x2内核的子采样层,从这个正方形中选择最大值
  • 接下来,再添加两个卷积层(32核和16核)、两个激活层和两个子样本
  • 将二维数据转换为一维格式
  • 将转换后的数据传递到具有64个神经元的完全连接层
  • 使用Dropout(0.5)正则化层函数尽量避免过拟合
  • 添加一个带有一个神经元的完全连接的输出层。使用了两个图像类,因此网络响应将以二进制响应的形式接收。也可以尝试几个类。例如,两个表示趋势,一个表示横盘。在这种情况下,输出层将有三个神经元。另外,我们需要将图像分为三类。
  • “sigmoid”激活函数。它很适合用于分类,并且在我的实验中已显示出最好的性能

这个架构的例子可以很容易地更新-我们可以增加层的数量和它们的大小,根据序列改变它们的位置,改变卷积核的维数,修改激活函数和使用完全连接的层。然而,这里出现了一个难题:当使用GPU时,为了增加神经网络的结构,有必要增加显卡的RAM。或者,应该减小图像大小。否则,我们会花很多时间使用CPU。赫兹股票期货量化软件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值