以下内容为学习笔记,更多的内容请访问原链接: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数学建模(二):评估股票的价值和风险相关推荐

  1. 数学建模专栏 | 第二篇 :MATLAB 数学建模快速入门

    MATLAB 虽然功能很强大,但上手却很容易,尤其是 R2013a 以后的版本, 使用起来更加容易. 现在使用 MATLAB 的一个理念就是像 Word 一样去使用 MATLAB.本讲将通过一个实例介 ...

  2. matlab快速入门案例及常用技巧 | 《matlab数学建模方法与实践(第三版)》学习笔记

    目录 快速入门案例: 解决流程: 具体实现: 一.获取数据 二.数据探索和建模 三.分享结果 常用技巧 一.常用标点功能 二.常用操作指令 三.指令编辑操作键 四.matlab数据类型 五.开发模式 ...

  3. matlab数学建模方法与实践 笔记1:快速入门

    入门案例 1.导入数据 2.数据探索 3.多项式拟合 4.发布功能 5.数据类型 6.全部代码 代码在Cha2文件夹下 1.导入数据 2.数据探索 3.多项式拟合 4.发布功能 5.数据类型 6.全部 ...

  4. 《MATLAB数学建模方法与实践(第3版)》第2章学习笔记

    第2章 MATLAB数学建模快速入门 2.1 MATLAB快速入门 2.1.1 MATLAB概要 MATLAB是矩阵实验室(Matrix Laboratory)的缩写.MATLAB的基本数据单元是矩阵 ...

  5. 数学建模二:TOPSIS法(优劣解距离法) 附代码详解

    数学建模二:TOPSIS法(优劣解距离法)附代码详解 TOPSIS法(优劣解距离法)用于评价类问题. 层次分析法因为受限于一致性检验指标的数量,最多只能选择15个准则或方案.同时层次分析法也难以处理已 ...

  6. 排课系统matlab,matlab数学建模排课

    matlab数学建模排课Tag内容描述: 1.TOMLAB课表编排问题 我们老师让我们做一个课表编排问题 题目见 我试图用基于MATLAB的一个软件TOMLAB做 因为他有一个例子 见 由于我对MAT ...

  7. 【MATLAB数学建模算法代码(六)之遗传算法】

    MATLAB数学建模算法代码(六) 遗传算法: 根据自己需要修改参数即可!!! %遗传算法主程序 %Name:genmain05.m function genmain() tic; clear clf ...

  8. 在matlab中以图像中心为旋转轴逆时针旋转30度自编程序,MATLAB数学建模习题

    MATLAB数学建模习题1 一.单项选择题(将选择答案写在答题纸上,每小题2分共20分) 1.在MATLAB命令窗口中键入命令,Vname=prod(7:9)/prod(1:3),可计算组合数 如果省 ...

  9. matlab球落点的数学建模,MATLAB数学建模:智能优化算法-人工鱼群算法

    MATLAB 数学建模: 人工鱼群算法 1. 基本原理 人工鱼群算法是一种受鱼群聚集规律而启发的优化算法. 在人工鱼群算法中, 我们假定鱼群的活动行为分为: 觅食行为, 群聚行为, 追随行为和随机行为 ...

最新文章

  1. hanlp中的N最短路径分词
  2. linux脚本开机自动执行脚本文件,如何让linux开机自动执行sata里头的脚本文件
  3. 纯Python模块发布setup脚本编写示例
  4. JavaScript中的匿名函数及函数的闭包
  5. shiro学习(15):使用注解实现权限认证和后台管理
  6. dva/dynamic
  7. 书单|互联网企业面试案头书之数据分析师篇
  8. MyBatis使用foreach批量插入一个含List<实体>成员变量的实体类
  9. 如何使用计算机管理员账户,如何使用管理员身份运行程序【图解】
  10. 飞鱼星流控王VF12路由器使用体验
  11. 阿里云香港服务器带宽太贵怎么办?香港节点全球CDN加速你值得拥有
  12. MapReduce实现订单商品的统计
  13. bzoj4444: [Scoi2015]国旗计划(线段树+倍增)
  14. java接口如何有效防止恶意请求
  15. 创业遇到困难怎么解决,解决困难是创业成功的关键
  16. 数据库如何修改编码格式?
  17. mysql.lib 是mtd mdd_VS运行时 /MD、/MDd 和 /MT、/MTd之间的区别
  18. 【Acm】算法之美—Crashing Balloon
  19. 在Vue中Promise.all的使用
  20. ProSpec BCA-1人重组 (CXCL13)说明书

热门文章

  1. 欧拉回路(简单判断是否有欧拉回路存在)
  2. 简述php的特点,PHP语言有哪些优势和特点(三)
  3. 二维码的扫描和生成二维码
  4. 微信小程序云开发CMS内容管理平台csv上传乱码或失败的解决方法
  5. 微信小程序——本地存储
  6. NorFlash和NandFlash区别
  7. .ipynb如何转为.py
  8. 【IEEE754制32位浮点数】与十进制相互转换
  9. 泽塔云:紧盯用户需求,用差异化竞争和技术创新赢得超融合云计算市场
  10. 一份应聘者所写的外链推广规划