首页 > 其他分享 >Matlab数学建模实战应用:案例1 - 股票价格预测

Matlab数学建模实战应用:案例1 - 股票价格预测

时间:2024-06-20 18:31:03浏览次数:28  
标签:模型 建模 forecast test train Matlab prices 股票价格 model

目录

前言

一、问题分析

二、模型选择

三、Matlab代码实现

完整代码示例

四、模型改进

1. 引入更多特征

2. 使用更复杂的模型

3. 模型参数优化

五、实例总结

总结


前言

股票价格预测是金融工程中的重要问题,利用数学建模可以帮助分析和预测股票价格的波动趋势,帮助投资者做出更明智的决策。本文将详细介绍股票价格预测的步骤,包括问题分析、模型选择、Matlab代码实现、模型验证和模型改进。

一、问题分析

  1. 股票价格的波动性
    • 股票价格具有高度的波动性,由多种因素(例如市场需求、公司业绩、经济形势等)共同作用导致。
  2. 影响因素
    • 常见的影响股票价格的因素包括:公司财务报表、行业发展、国家政策、国际经济环境、投资者情绪等。
  3. 预测目标
    • 短期预测:对未来几天或几周的股票价格进行预测,主要为日交易策略提供依据。
    • 中长期预测:对未来几个月或几年内的价格趋势进行预测,辅助长期投资决策。

二、模型选择

  1. 线性回归模型

    • 假设股票价格与某些因子(如技术指标)之间的关系是线性的。线性回归模型简单易用,但对复杂的股票价格波动可能无能为力。
  2. 时间序列模型

    • 自回归移动平均模型(ARMA)、自回归积分滑动平均模型(ARIMA)等,用于处理具有时间依赖性的序列数据。
  3. 机器学习模型

    • 支持向量机(SVM)、LSTM神经网络等,能够捕捉股票价格的非线性关系和复杂的波动模式。

本次实例将选择时间序列模型(ARIMA)进行股票价格预测。

三、Matlab代码实现

以下是一个使用ARIMA模型进行股票价格预测的完整代码示例。

  1. 导入数据
    • 我们假设股票数据(包含日期和收盘价)存储在stock_data.csv文件中。

    % 读取股票数据
    data = readtable('stock_data.csv');
    dates = data.Date;
    prices = data.Close;

    % 将日期转换为 MATLAB 日期格式
    dates = datetime(dates, 'InputFormat', 'yyyy-MM-dd');
    
    % 绘制收盘价时序图
    figure;
    plot(dates, prices);
    title('Stock Closing Prices');
    xlabel('Date');
    ylabel('Closing Price');
    grid on;

  1. 数据预处理
    • 检查和处理缺失值,并拆分数据集为训练集和测试集。

    % 检查缺失值
    if any(ismissing(prices))
        disp('存在缺失值,将其移除');
        data = rmmissing(data);
        dates = data.Date;
        prices = data.Close;
    end

    % 拆分数据集为训练集和测试集(70% 训练,30% 测试)
    n = length(prices);
    train_size = round(0.7 * n);
    train_prices = prices(1:train_size);
    test_prices = prices(train_size + 1:end);
    test_dates = dates(train_size + 1:end);

  1. 模型训练
    • 使用训练集数据训练ARIMA模型。

    % 训练 ARIMA 模型
    model = arima('Constant', 0, 'D', 1, 'Seasonality', 12, 'MALags', 1, 'SMALags', 12);
    arima_model = estimate(model, train_prices);

  1. 模型预测和验证
    • 使用训练好的模型进行预测,并与测试集数据进行比较。

    % 预测未来价格
    [forecast_prices, ~, forecast_CI] = forecast(arima_model, length(test_prices), 'Y0', train_prices);

    % 绘制预测结果
    figure;
    hold on;
    plot(test_dates, test_prices, 'b', 'DisplayName', 'Actual Prices');
    plot(test_dates, forecast_prices, 'r', 'DisplayName', 'Forecasted Prices');
    plot(test_dates, forecast_CI(:, 1), 'k--', 'DisplayName', '95% CI Lower');
    plot(test_dates, forecast_CI(:, 2), 'k--', 'DisplayName', '95% CI Upper');
    title('Stock Price Prediction Using ARIMA');
    xlabel('Date');
    ylabel('Price');
    legend('show');
    grid on;
    hold off;

  1. 计算预测误差
    • 计算模型预测的均方误差(MSE)和平均绝对误差(MAE)等。

    % 计算 MAE 和 MSE
    MAE = mean(abs(forecast_prices - test_prices));
    MSE = mean((forecast_prices - test_prices).^2);
    
    disp(['Mean Absolute Error: ', num2str(MAE)]);
    disp(['Mean Squared Error: ', num2str(MSE)]);

完整代码示例

% 读取股票数据
data = readtable('stock_data.csv');
dates = data.Date;
prices = data.Close;

% 将日期转换为 MATLAB 日期格式
dates = datetime(dates, 'InputFormat', 'yyyy-MM-dd');

% 绘制收盘价时序图
figure;
plot(dates, prices);
title('Stock Closing Prices');
xlabel('Date');
ylabel('Closing Price');
grid on;

% 检查缺失值
if any(ismissing(prices))
    disp('存在缺失值,将其移除');
    data = rmmissing(data);
    dates = data.Date;
    prices = data.Close;
end

% 拆分数据集为训练集和测试集(70% 训练,30% 测试)
n = length(prices);
train_size = round(0.7 * n);
train_prices = prices(1:train_size);
test_prices = prices(train_size + 1:end);
test_dates = dates(train_size + 1:end);

% 训练 ARIMA 模型
model = arima('Constant', 0, 'D', 1, 'Seasonality', 12, 'MALags', 1, 'SMALags', 12);
arima_model = estimate(model, train_prices);

% 预测未来价格
[forecast_prices, ~, forecast_CI] = forecast(arima_model, length(test_prices), 'Y0', train_prices);

% 绘制预测结果
figure;
hold on;
plot(test_dates, test_prices, 'b', 'DisplayName', 'Actual Prices');
plot(test_dates, forecast_prices, 'r', 'DisplayName', 'Forecasted Prices');
plot(test_dates, forecast_CI(:, 1), 'k--', 'DisplayName', '95% CI Lower');
plot(test_dates, forecast_CI(:, 2), 'k--', 'DisplayName', '95% CI Upper');
title('Stock Price Prediction Using ARIMA');
xlabel('Date');
ylabel('Price');
legend('show');
grid on;
hold off;

% 计算 MAE 和 MSE
MAE = mean(abs(forecast_prices - test_prices));
MSE = mean((forecast_prices - test_prices).^2);

disp(['Mean Absolute Error: ', num2str(MAE)]);
disp(['Mean Squared Error: ', num2str(MSE)]);

四、模型改进

在初步模型的基础上,我们可以通过引入更多特征、使用更复杂的模型和优化模型参数来进一步改进股票价格预测模型,提高预测的精度。

1. 引入更多特征

除了使用历史价格数据,我们还可以引入一些技术指标和宏观经济指标作为特征输入到模型中。这些额外特征可以提供更全面的信息,有助于提高模型的预测能力。

  1. 技术指标
    • 移动平均线(MA)、指数平滑移动平均线(EMA)、相对强弱指数(RSI)等。

    % 计算技术指标
    ma = movmean(prices, 10);  % 10 日移动平均线
    rsi = rsindex(prices, 14); % 14 日相对强弱指数
    
    % 合并特征
    features = [prices, ma, rsi];

  1. 宏观经济指标
    • 例如利率、通货膨胀率、GDP 增长率等。

    % 假设我们有宏观经济数据(已经加载到变量 macro_data 中)
    % 合并特征
    features = [prices, macro_data];

2. 使用更复杂的模型

简单的时间序列模型(如 ARIMA)可能无法捕捉股票价格的复杂波动模式。我们可以考虑使用更复杂的模型,如 GARCH 模型和 LSTM 神经网络。

  1. GARCH 模型
    • 用于建模金融时间序列的波动率。

    % 定义 GARCH 模型
    model = garch(1, 1);
    
    % 估计模型参数
    garch_model = estimate(model, train_prices);
    
    % 预测未来价格波动率
    [v, ~] = forecast(garch_model, length(test_prices), 'Y0', train_prices);

  1. LSTM 神经网络
    • 强大的深度学习模型,可以捕捉时间序列的长短期依赖关系。

    % 定义 LSTM 神经网络
    layers = [
        sequenceInputLayer(1)
        lstmLayer(100, 'OutputMode', 'sequence')
        fullyConnectedLayer(1)
        regressionLayer];
    
    % 设置训练选项
    options = trainingOptions('adam', ...
        'MaxEpochs', 250, ...
        'GradientThreshold', 1, ...
        'InitialLearnRate', 0.005, ...
        'LearnRateSchedule', 'piecewise', ...
        'LearnRateDropFactor', 0.2, ...
        'LearnRateDropPeriod', 125, ...
        'Verbose', 0, ...
        'Plots', 'training-progress');
    
    % 训练 LSTM 网络
    train_prices_sequence = reshape(train_prices, [numel(train_prices), 1, 1]);
    lstm_model = trainNetwork(train_prices_sequence, train_prices_sequence, layers, options);
    
    % 预测未来价格
    test_prices_sequence = reshape(test_prices, [numel(test_prices), 1, 1]);
    forecast_prices = predict(lstm_model, test_prices_sequence);

3. 模型参数优化

通过使用交叉验证、网格搜索等方法对模型参数进行优化,以找到最佳的参数组合。

  1. 交叉验证
    • 交叉验证用于评估模型的表现,并选择最佳模型参数。

    % 使用交叉验证选择最佳 ARIMA 模型参数
    best_model = [];
    best_mse = Inf;
    for p = 0:5
        for q = 0:5
            for d = 0:2
                try
                    model = arima('Constant', 0, 'ARLags', p, 'D', d, 'MALags', q);
                    arima_model = estimate(model, train_prices);
                    forecast_prices = forecast(arima_model, length(test_prices), 'Y0', train_prices);
                    mse = mean((forecast_prices - test_prices).^2);
                    if mse < best_mse
                        best_mse = mse;
                        best_model = arima_model;
                    end
                end
            end
        end
    end

  1. 网格搜索
    • 网格搜索通过在参数空间中进行穷举搜索,找到最佳参数组合。

    % 定义参数空间
    paramGrid = struct('NumHiddenUnits', [50, 100], 'InitialLearnRate', [0.001, 0.005]);
    
    % 初始化最优参数和最小误差
    bestParams = [];
    bestMSE = Inf;
    
    % 网格搜索参数
    for hiddenUnits = paramGrid.NumHiddenUnits
        for learnRate = paramGrid.InitialLearnRate
            % 设置 LSTM 网络和训练选项
            layers = [
                sequenceInputLayer(1)
                lstmLayer(hiddenUnits, 'OutputMode', 'sequence')
                fullyConnectedLayer(1)
                regressionLayer];
            
            options = trainingOptions('adam', ...
                'MaxEpochs', 250, ...
                'GradientThreshold', 1, ...
                'InitialLearnRate', learnRate, ...
                'LearnRateSchedule', 'piecewise', ...
                'LearnRateDropFactor', 0.2, ...
                'LearnRateDropPeriod', 125, ...
                'Verbose', 0);
            
            % 训练 LSTM 网络
            lstm_model = trainNetwork(train_prices_sequence, train_prices_sequence, layers, options);
            
            % 预测未来价格
            forecast_prices = predict(lstm_model, test_prices_sequence);
            mse = mean((forecast_prices - test_prices).^2);
            
            % 更新最优参数
            if mse < bestMSE
                bestMSE = mse;
                bestParams = struct('NumHiddenUnits', hiddenUnits, 'InitialLearnRate', learnRate);
            end
        end
    end

以下是改进模型的方法及其示例总结:

方法说明示例代码
引入更多特征使用技术指标和宏观经济指标作为额外特征输入[prices, ma, rsi, macro_data]
使用更复杂的模型尝试使用更复杂的时间序列模型(如GARCH)和深度学习模型(如LSTM)garchlstmLayer
模型参数优化使用交叉验证和网格搜索找到最佳模型参数组合for p = 0:5, q = 0:5, ...

五、实例总结

通过上述步骤,我们展示了如何使用 ARIMA 模型进行股票价格预测的全过程。接着,进一步改进模型,包括引入更多特征、使用更复杂的模型和优化参数的方法。以下是总结:

步骤说明示例代码
问题分析分析股票价格的波动性及其影响因素-
模型选择选择合适的预测模型(如ARIMA、机器学习模型等)-
数据导入从CSV文件中导入股票数据data = readtable('stock_data.csv');
数据预处理检查和处理缺失值,拆分训练集和测试集train_prices = prices(1:train_size);
模型训练使用训练集数据训练ARIMA模型model = arima(...);
模型预测和验证使用模型进行预测,并与测试集数据进行比较[forecast_prices, ~, forecast_CI] = ...
模型改进引入更多特征、使用更复杂的模型、优化模型参数garchlstmLayercross-validation

总结

本文详细介绍了股票价格预测的步骤,包括问题分析、模型选择、Matlab代码实现、模型验证和模型改进。通过实际案例,展示了如何使用 ARIMA 模型进行股票价格预测,并详细解释了如何通过引入更多特征、使用更复杂的模型和优化参数来改进预测模型。

标签:模型,建模,forecast,test,train,Matlab,prices,股票价格,model
From: https://blog.csdn.net/weidl001/article/details/139839970

相关文章

  • MATLAB神经网络工具箱使用介绍
      本文介绍MATLAB软件中神经网络拟合(NeuralNetFitting)工具箱的具体使用方法。  在MATLAB人工神经网络ANN代码这篇文章中,我们介绍了MATLAB软件中神经网络(ANN)的纯代码实现;而在MATLAB软件中,其实基于神经网络拟合工具箱,就可以点点鼠标实现神经网络的回归。本文就对基于这一工具......
  • Matlab r2023a v23.2.0 解锁版安装步骤 (工程计算商业数学软件)
    前言Matlab(矩阵实验室)是全球领先的数学计算软件开发商美国MathWorks公司研发的一款面向科学与工程计算的高级语言的商业数学软件,集算法开发、数据分析、可视化和数值计算于一体的编程环境,其核心是仿真交互式矩阵计算,广泛应用于科学计算、数据分析、算法开发和绘图设计等......
  • BERTopic与LLM知识图谱系列之 主题建模:LDA、NMF、BERTopic 和 Top2Vec 之间的比较
    介绍上一篇文章我们介绍了主题建模中应用最为广泛的四种算法的理论基础,本文将从研究成果的角度对它们的模型进行比较。推荐文章《如何使用CodeLlama构建您自己的LLM编码助手,使用CodeLlama-7b-Instruct-hf和Streamlit创建本地LLM聊天机器人》权重1,编程类......
  • 【仿真建模-anylogic】动态生成辊道网络
    Author:赵志乾Date:2024-06-18Declaration:AllRightReserved!!!1.常用函数     辊道网络中可以包含多种元素,在动态生成辊道网络中,最常用到的是Conveyor元素和ConveyorCustomStation元素。本次示例仅说明Conveyor元素的动态生成,其内部对应的Java类为ConveyorPath;每个......
  • 数字信号处理作业 序列的卷积 实现 + MATLAB 源码
    实现有限长序列的基本运算(包括:加法、乘法、累加、移位、翻褶、抽取、插值、卷积和),并以GUI的形式将这些运算整合起来,使用者可通过向GUI输入任意有限长序列得到对应的运算结果。加法:对两个序列中对应位置的元素进行相加,得到一个新的序列,要求两个序列的长度......
  • 数字信号处理之展示 z 变换与 s 变换之间的所有关系 +matlab 源码
    题目分析:要求z变换与s变换的关系,首先考虑z变换与s变换之间运用领域的不同,s域是连续时间表示域,使用连续的时间变量s表示信号的自变量,取值范围为复平面上的所有点。而z域是离散时间表示域,使用离散的时间变量z表示信号的自变量取值范围虽然也为复平面上的所有点,但对于离散信号而......
  • 43、基于神经网络拟合函数的体脂估计(matlab)
    1、神经网络拟合函数的原理及流程神经网络拟合函数是一种基于人工神经元之间相互连接的模型,用来拟合复杂的非线性函数关系。其原理是通过多层次的神经元网络,每一层神经元通过激活函数将输入信号加权求和后输出,经过多次迭代优化权值,使得网络输出与实际值误差最小化。流程如下:......
  • 一种基于非线性滤波过程的旋转机械故障诊断方法(MATLAB)
    在众多的旋转机械故障诊断方法中,包络分析,又称为共振解调技术,是目前应用最为成功的方法之一。首先,对激励引起的共振频带进行带通滤波,然后对滤波信号进行包络谱分析,通过识别包络谱中的故障相关的特征频率,从而判断是否发生故障与故障的类型。然而,包络分析方法的主要难点在于共振频......
  • 基于变异混合蛙跳算法的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘
    1.程序功能描述变异混合蛙跳算法的车间调度最优化,可以任意调整工件数和机器数,输出甘特图。 2.测试软件版本以及运行结果展示MATLAB2022a版本运行                     3.核心程序%初始种群Pop_n=round(sqrt(Npop));......
  • matlab实验3
    一、实验目的掌握共轭梯度法的基本思想及其迭代步骤;学会运用MATLAB编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。二、实验内容 (1)求解无约束优化问题:minf(x)=100(x1^2-x2)^2+(x1-1)^2,x∈R;(2)终止准则取||f(x^k)||<=10^-5,搜索方法采用非精确搜索Armijo;......