在 MATLAB R2015b 中使用神经网络预测金融时间序列(实际输出和预测输出之间的滞后)

Posted

技术标签:

【中文标题】在 MATLAB R2015b 中使用神经网络预测金融时间序列(实际输出和预测输出之间的滞后)【英文标题】:Using neural network to predict a financial time series in MATLAB R2015b (lag between real output and predicted output) 【发布时间】:2016-04-18 16:45:56 【问题描述】:

假设DD 是一个时间序列数据(一列和X 行)。我将 11 个样本从数据末尾分离为样本外,并通过 MATLAB 训练神经网络。神经网络在训练、测试和验证数据方面表现良好(拟合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);

这是样本外数据的真实输出和预测输出之间的比较:

但我认为两个输出之间存在滞后。现在检查一下,滞后一步:

为什么我们在样本外数据中有这种行为?我检查了样本外的不同时间长度,我们有相同的行为(一步滞后)。这是数据行为吗?

附言。

所有数据(x 变量作为训练网络的输入并与t 变量进行比较)作为训练神经网络的输入:

作为输入的所有数据之间存在滞后!用这种数据滞后训练的神经网络!这是bug吗?!这是近两年的每日时间序列,没有任何缺失数据。

【问题讨论】:

那么滞后时间总是1个时间单位? @GameOfThrows。是的。确实如此。这是领先一步的预测。 这让我觉得这是一个编程错误,您的 NN 肯定工作正常,但可能在索引或循环的开始/结束时出现错误?我不能确定,但​​如果知道这一点,您可以将数据向后移动 1 个时间单位以获得正确的结果 - 这是手动干预。 不,这不会改变结果,只是解决一个不好的编程习惯。 tmpIdx = -[0 1 2 3 4 5 6 7 14 30]+ii 这就是您想要的索引。 x = DD(tmpIdx) 就足够了 @Adriaan。感谢您的评论和您漂亮的索引程序。 【参考方案1】:

您的网络没有问题。正在发生的事情是您的网络正在退化为一个幼稚的预测器(查找它);即:它无法解决您的输入和输出之间的关系...

【讨论】:

在此处查看讨论:mathworks.com/matlabcentral/answers/…

以上是关于在 MATLAB R2015b 中使用神经网络预测金融时间序列(实际输出和预测输出之间的滞后)的主要内容,如果未能解决你的问题,请参考以下文章

CentOS x64上Matlab R2015b的镜像安装方法与卸载

matlab2015b和matlab2015a有啥区别

如何在 Matlab 中改进神经网络中的数字识别预测?

在 matlab 上配置和训练后,如何使用神经网络运行预测?

时间序列预测基于matlab CNN优化LSTM时间序列预测含Matlab源码 2003期

时间序列预测基于matlab CNN优化LSTM时间序列预测含Matlab源码 2003期