在 MATLAB R2015b 中使用神经网络预测金融时间序列(实际输出和预测输出之间存在滞后)
Using neural network to predict a financial time series in MATLAB R2015b (lag between real output and predicted output)
假设DD
是一个时间序列数据(一列X
行)。我从数据末尾分离出 11 个样本作为样本外,并通过 MATLAB 训练神经网络。神经网络在训练、测试和验证数据上的表现都很好(fitting app神经网络的默认属性:fitnet
)。
for ii = 31 : (numel(DD)-1)
D_0(ii-30,1) = DD(ii-0);
D_1(ii-30,1) = DD(ii-1);
D_2(ii-30,1) = DD(ii-2);
D_3(ii-30,1) = DD(ii-3);
D_4(ii-30,1) = DD(ii-4);
D_5(ii-30,1) = DD(ii-5);
D_6(ii-30,1) = DD(ii-6);
D_7(ii-30,1) = DD(ii-7);
D_14(ii-30,1) = DD(ii-14);
D_30(ii-30,1) = DD(ii-30);
D_plus_1(ii-30,1) = DD(ii+1);
end
x = [D_0 D_1 D_2 D_3 D_4 D_5 D_6 D_7 D_14 D_30]';
t = D_plus_1';
%% Out-of-sample data
x_oos = x(:,end-10:end);
t_oos = t(:,end-10:end);
x(:,end-10:end) = [];
t(:,end-10:end) = [];
hiddenLayerSize = 5;
trainFcn = 'trainlm'; % Levenberg-Marquardt backpropagation.
net = fitnet(hiddenLayerSize,trainFcn);
net.input.processFcns = {'removeconstantrows','mapminmax'};
net.output.processFcns = {'removeconstantrows','mapminmax'};
net.divideFcn = 'dividerand'; % Divide data randomly
net.divideMode = 'sample'; % Divide up every sample
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
% Choose a Performance Function
% For a list of all performance functions type: help nnperformance
net.performFcn = 'mse'; % Mean Squared Error
[net,tr] = train(net,x,t);
x
是神经网络的输入,t
是神经网络的输出(目标)。训练后,我使用此代码预测样本数据外的结果:
y_Out = net(x_oos);
这是样本外数据的真实输出与预测输出的比较:
但我认为两个输出之间存在滞后。现在用一步延迟检查:
为什么我们在样本外数据中有这种行为?我检查了样本外的不同时间长度,我们有相同的行为(一步滞后)。这是数据行为吗?
PS.
所有数据(x
变量作为训练网络的输入并与t
变量进行比较)作为训练神经网络的输入:
所有数据作为输入之间存在滞后!用这种数据滞后训练的神经网络!这是一个错误?!这是近两年的每日时间序列,没有任何缺失数据。
你的网络没有问题。正在发生的事情是您的网络正在退化为一个朴素的预测器(查找);即:它无法解决您的输入和输出之间的关系...
假设DD
是一个时间序列数据(一列X
行)。我从数据末尾分离出 11 个样本作为样本外,并通过 MATLAB 训练神经网络。神经网络在训练、测试和验证数据上的表现都很好(fitting app神经网络的默认属性:fitnet
)。
for ii = 31 : (numel(DD)-1)
D_0(ii-30,1) = DD(ii-0);
D_1(ii-30,1) = DD(ii-1);
D_2(ii-30,1) = DD(ii-2);
D_3(ii-30,1) = DD(ii-3);
D_4(ii-30,1) = DD(ii-4);
D_5(ii-30,1) = DD(ii-5);
D_6(ii-30,1) = DD(ii-6);
D_7(ii-30,1) = DD(ii-7);
D_14(ii-30,1) = DD(ii-14);
D_30(ii-30,1) = DD(ii-30);
D_plus_1(ii-30,1) = DD(ii+1);
end
x = [D_0 D_1 D_2 D_3 D_4 D_5 D_6 D_7 D_14 D_30]';
t = D_plus_1';
%% Out-of-sample data
x_oos = x(:,end-10:end);
t_oos = t(:,end-10:end);
x(:,end-10:end) = [];
t(:,end-10:end) = [];
hiddenLayerSize = 5;
trainFcn = 'trainlm'; % Levenberg-Marquardt backpropagation.
net = fitnet(hiddenLayerSize,trainFcn);
net.input.processFcns = {'removeconstantrows','mapminmax'};
net.output.processFcns = {'removeconstantrows','mapminmax'};
net.divideFcn = 'dividerand'; % Divide data randomly
net.divideMode = 'sample'; % Divide up every sample
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
% Choose a Performance Function
% For a list of all performance functions type: help nnperformance
net.performFcn = 'mse'; % Mean Squared Error
[net,tr] = train(net,x,t);
x
是神经网络的输入,t
是神经网络的输出(目标)。训练后,我使用此代码预测样本数据外的结果:
y_Out = net(x_oos);
这是样本外数据的真实输出与预测输出的比较:
但我认为两个输出之间存在滞后。现在用一步延迟检查:
为什么我们在样本外数据中有这种行为?我检查了样本外的不同时间长度,我们有相同的行为(一步滞后)。这是数据行为吗?
PS.
所有数据(x
变量作为训练网络的输入并与t
变量进行比较)作为训练神经网络的输入:
你的网络没有问题。正在发生的事情是您的网络正在退化为一个朴素的预测器(查找);即:它无法解决您的输入和输出之间的关系...