# 【MATLAB数据处理实用案例详解（13）】——利用Elman网络实现上证股市开盘价预测

## 二、Elman网络预测上证股市开盘价原理

x

n

=

f

(

x

n

1

,

x

n

2

,

x

n

N

)

{x_n} = fleft( {{x_{n - 1}},{x_{n - 2}},{x_{n - N}}} right)

xn=f(xn1,xn2,xnN)

x

1

x

N

{x_1} sim{x_N}

x1xN组成第一个样本，其中

(

x

1

,

x

2

,

,

x

N

1

)

left( {{x_1},{x_2}, cdots ,{x_{N - 1}}} right)

(x1,x2,,xN1)为自变量，

x

N

{x_N}

xN为目标函数值；抽取

x

2

x

N

+

1

{x_2} sim{x_{N+1}}

x2xN+1组成第二个样本，其中

(

x

2

,

x

3

,

,

x

N

)

left( {{x_2},{x_3}, cdots ,{x_{N}}} right)

(x2,x3,,xN)为自变量，

x

N

+

1

{x_{N+1}}

xN+1为函数值，以此类推，最终形成以下训练矩阵：

[

x

1

x

2

x

i

x

2

x

3

x

i

+

1

x

N

1

x

N

x

N

x

N

+

1

]

left[ begin{array}{l} {x_1}{kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {x_2}{kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {x_i}\ {x_2}{kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {x_3}{kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {x_{i + 1}}\ {kern 1pt} {kern 1pt} {kern 1pt} cdots {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} cdots {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} cdots \ {x_{N - 1}}{kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {x_N}\ {x_N}{kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {kern 1pt} {x_{N + 1}} end{array} right]

x1x2xix2x3xi+1xN1xNxNxN+1

## 三、算法步骤

### 3.1 加载数据

%% 清除工作空间中的变量和图形
clear,clc
close all
% 加载337个上证指数开盘价格
whos


Name Size Bytes Class Attributes

price 337x1 2696 double

### 3.2 构造样本集

x

1

x

N

{x_1} sim{x_N}

x1xN组成第一个样本，其中

(

x

1

,

x

2

,

,

x

N

1

)

left( {{x_1},{x_2}, cdots ,{x_{N - 1}}} right)

(x1,x2,,xN1)为自变量，

x

N

{x_N}

xN为目标函数值，以此类推，代码如下：

% 数据个数
n=length(price);

% 确保price为列向量
price=price(:);

% x(n) 由x(n-1),x(n-2),...,x(n-L)共L个数预测得到.
L = 6;

% price_n：每列为一个构造完毕的样本，共n-L个样本
price_n = zeros(L+1, n-L);
for i=1:n-L
price_n(:,i) = price(i:i+L);
end


### 3.3 划分训练集和测试集

trainx = price_n(1:6, 1:280);
trainy = price_n(7, 1:280);

testx = price_n(1:6, 290:end);
testy = price_n(7, 290:end);


### 3.4 创建Elman神经网络

MATLAB神经网络工具箱提供了newelm与elmannet函数，都可以建立Elman反馈网络。这里采用elmannet函数，它只需要三个参数，分别指定延迟、隐含层神经元个数和训练函数。

% 包含15个神经元，训练函数为traingdx
net=elmannet(1:2,15,'traingdx');

% 设置显示级别
net.trainParam.show=1;

% 最大迭代次数为2000次
net.trainParam.epochs=2000;

% 误差容限，达到此误差就可以停止训练
net.trainParam.goal=0.00001;

% 最多验证失败次数
net.trainParam.max_fail=5;

% 对网络进行初始化
net=init(net);


### 3.5 网络训练

%训练数据归一化
[trainx1, st1] = mapminmax(trainx);
[trainy1, st2] = mapminmax(trainy);

% 测试数据做与训练数据相同的归一化操作
testx1 = mapminmax('apply',testx,st1);
testy1 = mapminmax('apply',testy,st2);

% 输入训练样本进行训练
[net,per] = train(net,trainx1,trainy1);


### 3.6 测试

% 将训练数据输入网络进行测试
train_ty1 = sim(net, trainx1);
train_ty = mapminmax('reverse', train_ty1, st2);

% 将测试数据输入网络进行测试
test_ty1 = sim(net, testx1);
test_ty = mapminmax('reverse', test_ty1, st2);


THE END

)">