MATLAB数学建模(二):评估股票的价值和风险

article/2025/8/29 8:27:32

         以下内容为学习笔记,更多的内容请访问原链接:https://mp.weixin.qq.com/s/fcCxFpiLMT1uFsyTFux_ig?

        以下学习笔记与原链接的不同之处在于:对原链接内容进行了增删,删去了一些题外话,增加了对一些概念的解释,如最大回撤率;对一些函数的各个参数进行了详细说明;对源代码增加了更加详细的注释,确保小白也能完全看懂。

        问题:已知股票的交易数据:日期、开盘价、最高价、最低价、收盘价、成交量和换手率,试用某种方法来评价这只股票的价值和风险。如何用MATLAB去求解该问题?

        数据文件已上传github:https://github.com/xiexupang/mathematical-modeling/tree/master/%E8%82%A1%E7%A5%A8

       如何用MATLAB去完成这个项目呢?

 

第一阶段:从外部读取数据

Step1.1:把数据文件sz000004.xls拖曳进‘当前文件夹区’,选中数据文件sz000004.xls,右键,将弹出右键列表,很快可发现有个“导入数据”菜单,如图 1 所示。

                                       

                                                                  图1. 启动导入数据引擎示意图

Step1.2:单击“导入数据”这个按钮,则很快发现起到一个导入数据引擎,如图 4 所示。

                      

                                                                    图2. 导入数据界面

Step1.3:观察图 2,在右上角有个“导入所选内容”按钮,则可直接单击之。马上我们就会发现在 MATLAB 的工作区(当前内存中的变量)就会显示这些导入的数据,并以列向量的方式表示,因为默认的数据类型就是“列向量”,当然您可以可以选择其他的数据类型,大家不妨做几个实验,观察一下选择不同的数据类型后会结果会有什么不同。至此,第一步获取数据的工作的完成。

 

第二阶段:数据探索和建模

现在重新回到问题,对于该问题,我们的目标是能够评估股票的价值和风险,但现在我们还不知道该如何去评估,MATLAB 是工具,不能代替我们决策用何种方法来评估,但是可以辅助我们得到合适的方法,这就是数据探索部分的工作。下面我们就来尝试如何在 MATLAB 中进行数据的探索和建模。

Step2.1:查看数据的统计信息,了解我们的数据。具体操作方式是双击工具区(直接双击这三个字),此时会得到所有变量的详细统计信息。通过查看这些基本的统计信息,有助于快速在第一层面认识我们所正在研究的数据。当然,只要大体浏览即可,除非这些统计信息对某个问题都有很重要的意义。数据的统计信息是认识数据的基础,但不够直观,更直观也更容易发现数据规律的方式就是数据可视化,也就是以图的形式呈现数据的信息。下面我们将尝试用 MATLAB 对这些数据进行可视化。

由于变量比较多,所以还有必要对这些变量进行初步的梳理。对于这个问题,我们一般关心收盘价随时间的变化趋势,这样我们就可以初步选定日期(DateNum)和收盘价(Pclose)作为重点研究对象。也就是说下一步,要对这这两个变量进行可视化。

对于一个新手,我们还不知道如何绘图。但不要紧,新版 MATLAB 提供了更强大的绘图功能——“绘图”面板,这里提供了非常丰富的图形原型,如图 3 所示。

                            

                                                                                 图3 MATLAB绘图面板中的图例

要注意,需要在工作区选中变量后绘图面板中的这些图标才会激活。接下来就可以选中一个中意的图标进行绘图,一般都直接先选第一个(plot)看一下效果,然后再浏览整个面板,看看有没有更合适的。下面我们进行绘图操作。

Step2.2:选中变量 DataNum 和 Pclose,在绘图面板中单机 plot 图标,马上可以得到这两个变量的可视化结果,如图 4 所示,同时还可以在命令窗口区看到绘制此图的命令:

>> plot(DateNum,Pclose)

                                        

                                                                                       图4 通过 plot 图标绘制的原图

这样我们就知道了,下次再绘制这样的图直接用 plot 命令就可以了。一般情况下,用这种方式绘图的图往往不能满足我们的要求,比如我们希望更改:

(1)曲线的颜色、线宽、形状;

(2)坐标轴的线宽、坐标,增加坐标轴描述;

(3)在同个坐标轴中绘制多条曲线。

此时我们就需要了解更多关于命令 plot 的用法,这时就可以通过 MATLAB 强大的帮助系统来帮助我们实现期望的结果。最直接获取帮助的两个命令是 doc 和 help,对于新手来说,推荐使用 doc,因为 doc 直接打开的是帮助系统中的某个命令的用法说明,不仅全,而且有应用实例,这样就可以“照猫画虎”,直接参考实例,从而将实例快速转化成自己需要的代码。

接下来我们就要考虑如何评估股票的价值和风险呢?

         对于一只好的股票,我们希望股票的增幅越大越好,体现在数学上,就是曲线的斜率越大越好。

         对于风险,则可用最大回撤率来描述更合适,什么是最大回撤率?

         最大回撤率的公式可以这样表达:

D为某一天的净值,i为某一天,j为i后的某一天,Di为第i天的产品净值,Dj则是Di后面某一天的净值

drawdown=max(Di-Dj)/Di,drawdown就是最大回撤率。其实就是对每一个净值进行回撤率求值,然后找出最大的。可以使用程序实现。最大回撤率越大,说明该股票的风险越高。所以最大回撤率越小,股票越好。

           斜率和最大回撤率不妨一个一个来解决。我们先来看如何计算曲线的斜率。对于这个问题,比较简单,由于从数据的可视化结果来看,数据近似成线性,所以不妨用多项式拟合的方法来拟合该改组数据的方程,这样我们就可以得到斜率。

Step2.3:通过polyfit()多项式拟合的命令,并计算股票的价值,具体代码为:

>> p = polyfit(DateNum,Pclose,1); % 多项式拟合

>> value = p(1) % 将斜率赋值给value,作为股票的价值

value =

    0.1212

代码分析:%后面的内容是注释。polyfit()有三个参数,前两个大家都能明白是什么意思,那第三个参数是什么意思呢?它表示多项式的阶数,也就是最高次数。比如:在本例中,第三个参数为1,说明其为一次项,即一次函数。第三个参数为你要拟合的阶数,一阶直线拟合,二阶抛物线拟合,并非阶次越高越好,看拟合情况而定。polyfit()返回阶数为 n 的多项式 p(x) 的系数,p 中的系数按降幂排列。在本例中的P(1)指的是最高项的系数,即斜率。

Step2.4:用相似的方法,可以很快得到计算最大回撤的代码:

>> MaxDD = maxdrawdown(Pclose); % 计算最大回撤

>> risk = MaxDD  % 将最大回撤赋值给risk,作为股票的风险

risk =

    0.1155

代码分析:最大回撤率当然计算的是每天收盘时的股价。最大回撤率越大,说明该股票的风险越高。所以最大回撤率越小,股票越好。

到此处,我们已经找到了评估股票价值和风险的方法,并能用 MALTAB 来实现了。但是,我们都是在命令行中实现的,并不能很方便地修改代码。而 MATLAB 最经典的一种用法就是脚本,因为脚本不仅能够完整地呈现整个问题的解决方法,同时更便于维护、完善、执行,优点很多。所以当我们的探索和开发工作比较成熟后,通常都会将这些有用的程序归纳整理起来,形成脚本。现在我们就来看如何快速开发解决该问题的脚本。

Step2.5:像 Step1.1 一样,重新选中数据文件,右键并单击“导入数据”菜单,待启动导入数据引擎后,选择“生成脚本”,然后就会得到导入数据的脚本,并保存该脚本。

脚本源代码中有些地方要注意:

       %%在matlab代码中的作用是将代码分块,上下两个%%之间的部分作为一块,在运行代码的时候可以分块运行,查看每一块代码的运行情况。常用于调试程序。%%相当于jupyter notebook中的cell。

       %后的内容是注释。

        每句代码后面的分号作用为不在命令窗口显示执行结果。

脚本源代码:

%% 预测股票的价值与风险%% 导入数据
clc, clear, close all
% clc:清除命令窗口的内容,对工作环境中的全部变量无任何影响 
% clear:清除工作空间的所有变量 
% close all:关闭所有的Figure窗口% 导入数据
[~, ~, raw] = xlsread('sz000004.xlsx', 'Sheet1', 'A2:H7');
% [num,txt,raw],~表示省略该部分的返回值
% xlsread('filename','sheet', 'range'),第二个参数指数据在sheet1还是其他sheet部分,range表示单元格范围% 创建输出变量
data = reshape([raw{:}],size(raw));
% [raw{:}]指raw里的所有数据,size(raw):6 x 8 ,该语句把6x8的cell类型数据转换为6x8 double类型数据% 将导入的数组分配列变量名称
Date = data(:, 1); % 第一个参数表示从第一行到最后一行,第二个参数表示第一列
DateNum = data(:, 2);
Popen = data(:, 3);
Phigh = data(:, 4);
Plow = data(:, 5);
Pclose = data(:, 6);  
Volum = data(:, 7); % Volume 表示股票成交量的意思,成交量=成交股数*成交价格 再加权求和
Turn = data(:, 8); % turn表示股票周转率,股票周转率越高,意味着该股股性越活泼,也就是投资人所谓的热门股% 清除临时变量data和raw
clearvars data raw;%% 数据探索figure % 创建一个新的图像窗口
plot(DateNum, Pclose, 'k'); % 'k',曲线是黑色的,打印后不失真
datetick('x','mm-dd'); % 更改日期显示类型。参数x表示x轴,mm-dd表示月份和日。yyyy-mm-dd,如2018-10-27
xlabel('日期') % x轴
ylabel('收盘价') % y轴
figure
bar(Pclose) % 作为对照图形%% 股票价值的评估p = polyfit(DateNum, Pclose, 1); % 多项式拟合
% polyfit()返回阶数为 n 的多项式 p(x) 的系数,p 中的系数按降幂排列
P1 = polyval(p,DateNum); % 得到多项式模型的结果
figure
plot(DateNum,P1,DateNum,Pclose,'*g'); % 模型与原始数据的对照, '*g'表示绿色的*
value = p(1) % 将斜率赋值给value,作为股票的价值。p(1)最高项的次数%% 股票风险的评估
MaxDD = maxdrawdown(Pclose); % 计算最大回撤
risk = MaxDD  % 将最大回撤赋值给risk,作为股票的风险

 


http://chatgpt.dhexx.cn/article/osyALIe5.shtml

相关文章

风险控制之VaR

什么是VaR VaR是value of risk的缩写称为风险价值,或者受险价值,指的是在一定的概率下,一个金融资产在未来一段时间内的最大可能损失。常用于金融机构的风险管理。它的数学定义为: 其中,的含义是金融资产在持有期的时…

拓端tecdat|R语言风险价值VaR(Value at Risk)和损失期望值ES(Expected shortfall)的估计

最近我们被要求撰写关于风险价值VaR的研究报告,包括一些图形和统计输出。 视频:风险价值VaR原理与Python蒙特卡罗Monte Carlo模拟计算投资组合实例 风险价值VaR原理与Python蒙特卡罗Monte Carlo模拟计算投资组合实例 ,时长10:03 风险价值VaR和…

用Flink SQL流化市场数据2:盘中风险价值

本文是一个由多部分组成的系列文章的第二篇,该系列文章展示了FlinkSQL应用于市场数据的功能和可表达性。万一您错过了它,第一部分从计算流VWAP的简单情况开始。该系列的代码和数据可在github上获得。 速度在金融市场上至关重要。无论目标是最大化alpha还…

拓端tecdat|Python计算股票投资组合的风险价值(VaR)

最近我们被要求撰写关于风险价值(VaR)的研究报告,包括一些图形和统计输出。 什么是风险价值(VaR)? 风险价值(VaR)用于尝试量化指定时间范围内公司或投资组合中的财务风险水平。VaR提…

R语言风险价值:ARIMA,GARCH模型,Delta-normal法滚动估计,预测VaR(Value at Risk)和回测分析花旗公司股票时间序列数据

最近我们被客户要求撰写关于风险价值可视化的研究报告,包括一些图形和统计输出。 相关视频:时间序列分析:ARIMA GARCH模型分析股票价格数据 时间序列分析模型 ARIMA-ARCH GARCH模型分析股票价格数据 相关视频:在Python和R语言中建…

蒙特卡洛模拟计算风险价值VAR之R语言实现

一、解析VAR 当在分析方法中计算风险价值(VAR)时,我们需要假设金融工具的返回遵循一定的概率分布。最常用的是正态分布,这也是为什么我们通常称它为delta normal方法。要计算VAR,我们需要找到一个阈值(T&am…

VaR - 风险价值 - 蒙特卡罗法 - Python

风险价值(VaR):即在市场正常波动的条件下,在一定概率水平P%下,某一金融资产或金融资产组合的VaR是在未来特定一段时间Δt内最大可能损失。 现在我们使用蒙特卡罗模拟法进行风险价值的估算。简单来说,蒙特卡…

R语言用GARCH模型波动率建模和预测、回测风险价值 (VaR)分析股市收益率时间序列

最近我们被客户要求撰写关于GARCH的研究报告,包括一些图形和统计输出。 风险价值 (VaR) 风险价值 (VaR) 是金融风险管理中使用最广泛的市场风险度量,也被投资组合经理等从业者用来解释未来市场风险。VaR 可以定义为资产在给定时间段内以概率 θ 超过的市…

VaR风险价值-Python版本

1、VaR简介 2、VaR原理 3、不同VaR实现方法及适用场景 3.1 历史模拟法 3.1.1 使用TUSHARE读入美的复权后估计数据 隆重介绍一下TUSHARE, 非常好的财经数据库, 能获取到国内股价信息 #环境&数据准备 import sys as sy import numpy as np import…

基于蒙特卡罗模拟的股票风险价值VaR测算

基于蒙特卡罗模拟的股票风险价值VaR测算 前言:如果各位观看博客的想学的,可以通过Tushare金融数据注册链接注册账号,在获得相关数据集,这是本人的分享链接注册后,我可以获得50积分,谢谢各位支持。 摘要&…

Python蒙特卡罗(Monte Carlo)模拟计算投资组合的风险价值(VaR)

最近我们被客户要求撰写关于风险价值(VaR)的研究报告,包括一些图形和统计输出。 如何使用Python通过蒙特卡洛模拟自动计算风险值(VaR)来管理投资组合或股票的金融风险。 金融和投资组合风险管理中的VaR? …

Python风险价值计算投资组合VaR(Value at Risk )、期望损失ES(Expected Shortfall)

最近我们被客户要求撰写关于风险价值的研究报告,包括一些图形和统计输出。 Python计算获得多资产投资组合的风险度量。 视频:风险价值VaR原理与Python蒙特卡罗Monte Carlo模拟计算投资组合实例 风险价值VaR原理与Python蒙特卡罗Monte Carlo模拟计算投资…

金融数据分析 实验四 金融风险价值计算

实验原理 VaR的定义:在正常的市场条件下,给定置信水平和持有期,某种投资组合可能发生的最大损失值。 VaR模型不仅描述了损失的大小,还描述了发生损失的概率。 VaR的数学定义:给定置信水平 1 - α 和时间间隔 t ,如果一…

【视频】风险价值VaR原理与Python蒙特卡罗Monte Carlo模拟计算投资组合实例

最近我们被客户要求撰写关于风险价值VaR的研究报告,包括一些图形和统计输出。 什么是风险价值(VaR)? 风险价值 (VaR) 是一种统计数据,用于量化公司、投资组合在特定时间范围内可能发生的财务损失程度。该指标最常被投…

金融分析与风险管理——风险价值(VaR)

金融分析与风险管理——风险价值(VaR) 1. 风险价值(VaR)简述1.1 Python可视化风险价值 2. VaR值的测度方法2.1 方差-协方差法2.2 历史模拟法2.3 蒙特卡洛模拟法 3. 回溯检验4. 压力VaR 1. 风险价值(VaR)简述…

python是动态语言还是静态语言?强类型语言还是弱类型语言

首先要清楚静态类型语言和动态类型语言的判别的标准 定义:如果类型检查发生在编译阶段(compile time),那么是静态类型语言(statically typed languages)中,相反的,如果类型检查发生在运行阶段(run time),那么是动态类型…

Typescript笔记之基础知识(1):强类型语言和弱类型语言、静态语言和动态语言

foreword(前言) 这是本人关于Typescript的第一篇笔记,之所以选择将“强类型语言和弱类型语言、静态语言和动态语言”作为第一个想要去总结的主题,是因为个人觉得它很重要。 如今这个年代,可以供我们选择的编程语言非常…

编程语言的执行方式、静态语言和脚本语言

计算机执行源程序的两种方式是编译和解释 源代码:采用某种编程语言编写的计算机程序,人类可读 目标代码:计算机可以直接执行,大部分人类不可读,如:1110000111001010 编译 编译是讲源代码一次性转换为目标代…

程序的两种执行方式,静态语言和脚本语言

程序的两种执行方式,静态语言和脚本语言 文章目录 程序的两种执行方式,静态语言和脚本语言编译和解释静态语言和脚本语言 编译和解释 编译:将源代码一次性转换成目标代码的过程。(编译一次后,若需再次执行程序就可以直…

静态语言和脚本语言的区别

在计算机编程语言中,可以将编程语言分为静态语言和脚本语言两类,这两类编程语言最主要的区别是执行方式的不同。想要区分静态语言和脚本语言的区别,首先需要区分编译和解释。 编译和解释 编译是指将源代码一次性转换为目标代码的过程&#…