MATLAB数学建模(二):评估股票的价值和风险
以下内容为学习笔记,更多的内容请访问原链接: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,作为股票的风险
MATLAB数学建模(二):评估股票的价值和风险相关推荐
- 数学建模专栏 | 第二篇 :MATLAB 数学建模快速入门
MATLAB 虽然功能很强大,但上手却很容易,尤其是 R2013a 以后的版本, 使用起来更加容易. 现在使用 MATLAB 的一个理念就是像 Word 一样去使用 MATLAB.本讲将通过一个实例介 ...
- matlab快速入门案例及常用技巧 | 《matlab数学建模方法与实践(第三版)》学习笔记
目录 快速入门案例: 解决流程: 具体实现: 一.获取数据 二.数据探索和建模 三.分享结果 常用技巧 一.常用标点功能 二.常用操作指令 三.指令编辑操作键 四.matlab数据类型 五.开发模式 ...
- matlab数学建模方法与实践 笔记1:快速入门
入门案例 1.导入数据 2.数据探索 3.多项式拟合 4.发布功能 5.数据类型 6.全部代码 代码在Cha2文件夹下 1.导入数据 2.数据探索 3.多项式拟合 4.发布功能 5.数据类型 6.全部 ...
- 《MATLAB数学建模方法与实践(第3版)》第2章学习笔记
第2章 MATLAB数学建模快速入门 2.1 MATLAB快速入门 2.1.1 MATLAB概要 MATLAB是矩阵实验室(Matrix Laboratory)的缩写.MATLAB的基本数据单元是矩阵 ...
- 数学建模二:TOPSIS法(优劣解距离法) 附代码详解
数学建模二:TOPSIS法(优劣解距离法)附代码详解 TOPSIS法(优劣解距离法)用于评价类问题. 层次分析法因为受限于一致性检验指标的数量,最多只能选择15个准则或方案.同时层次分析法也难以处理已 ...
- 排课系统matlab,matlab数学建模排课
matlab数学建模排课Tag内容描述: 1.TOMLAB课表编排问题 我们老师让我们做一个课表编排问题 题目见 我试图用基于MATLAB的一个软件TOMLAB做 因为他有一个例子 见 由于我对MAT ...
- 【MATLAB数学建模算法代码(六)之遗传算法】
MATLAB数学建模算法代码(六) 遗传算法: 根据自己需要修改参数即可!!! %遗传算法主程序 %Name:genmain05.m function genmain() tic; clear clf ...
- 在matlab中以图像中心为旋转轴逆时针旋转30度自编程序,MATLAB数学建模习题
MATLAB数学建模习题1 一.单项选择题(将选择答案写在答题纸上,每小题2分共20分) 1.在MATLAB命令窗口中键入命令,Vname=prod(7:9)/prod(1:3),可计算组合数 如果省 ...
- matlab球落点的数学建模,MATLAB数学建模:智能优化算法-人工鱼群算法
MATLAB 数学建模: 人工鱼群算法 1. 基本原理 人工鱼群算法是一种受鱼群聚集规律而启发的优化算法. 在人工鱼群算法中, 我们假定鱼群的活动行为分为: 觅食行为, 群聚行为, 追随行为和随机行为 ...
最新文章
- hanlp中的N最短路径分词
- linux脚本开机自动执行脚本文件,如何让linux开机自动执行sata里头的脚本文件
- 纯Python模块发布setup脚本编写示例
- JavaScript中的匿名函数及函数的闭包
- shiro学习(15):使用注解实现权限认证和后台管理
- dva/dynamic
- 书单|互联网企业面试案头书之数据分析师篇
- MyBatis使用foreach批量插入一个含List<实体>成员变量的实体类
- 如何使用计算机管理员账户,如何使用管理员身份运行程序【图解】
- 飞鱼星流控王VF12路由器使用体验
- 阿里云香港服务器带宽太贵怎么办?香港节点全球CDN加速你值得拥有
- MapReduce实现订单商品的统计
- bzoj4444: [Scoi2015]国旗计划(线段树+倍增)
- java接口如何有效防止恶意请求
- 创业遇到困难怎么解决,解决困难是创业成功的关键
- 数据库如何修改编码格式?
- mysql.lib 是mtd mdd_VS运行时 /MD、/MDd 和 /MT、/MTd之间的区别
- 【Acm】算法之美—Crashing Balloon
- 在Vue中Promise.all的使用
- ProSpec BCA-1人重组 (CXCL13)说明书