数模 · 2020年1月29日 0

Matlab&数模-03开始实战

首先呢,祝大噶鼠年大吉!

由于最近sari肆虐,被迫宅在家里终于不得不学习学习hhh,既然说是实战,我在我网上找了一个简单的小问题:

评估股票的价值和风险

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

(PS:github官网原来的IP好像变了,如果曾经修改过hosts文件,记得把改成192.30.253.112 github.com,害得我文件找半天…)

问题相关文件的URL:https://github.com/xiexupang/mathematical-modeling/tree/master/股票

一、导入数据

有这么个图标⬇

选择完文件后:

点击导入,效果图????

 

二、数据分析与建模

matlab只是一个工具,就像你做神经网络,py也只是实现你思想的一个途径,它不会给你建模的建议,具体选择什么样的网络,用什么样的函数本质还是靠你自己。所以就像做神经网络一样,我们先对数据进行分析,观察数据的特征,再根据分析结果结合问题进行建模。

然鹅对于一个对数字没那么敏感的小可怜而言,单纯看表格数据是没什么用的,所以我们最好进行数据可视化

plot函数即可,当然也可以用现成的工具栏中的绘图。

在这之后我们就要考虑如何评估股票的价值和风险呢?

股票的增幅越大越好,体现在数学上,就是曲线的斜率越大越好。对于风险,则可用最大撤回率来描述更合适。

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

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

drawdown=max(Di-Dj)/Di,

drawdown就是最大回撤率。

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

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

这里我得说一下,我这里得到的数据文件非常不齐全,以至于它只是数据中的一小部分,甚至可以说它只能算是一个小小的特征点,不过反正我们也不是真的想做什么,所以既然是一个练习就继续把操作和该有的流程走完,好吧,下次一定是一个像样的实操(下次一定下次一定????

通过polyfit()多项式拟合的命令,并计算股票的价值,具体代码大概是这样:

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

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

value =

0.1212

那么第三个冒出来的参数1是什么意思呢?

它表示多项式的阶数,也就是最高次数

比如:在本例中,第三个参数为1,说明其为一次项,即一次函数。第三个参数为你要拟合的阶数,一阶直线拟合,二阶抛物线拟合,并非阶次越高越好,看拟合情况而定。

polyfit()返回阶数为 n 的多项式 p(x) 的系数,p 中的系数按降幂排列。在本例中的P(1)指的是最高项的系数,即斜率。

计算最大回撤的代码:

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

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

risk =

0.1155

我去了解了一下,发现最大回撤率计算的是每天收盘时的股价。最大回撤率越大,说明该股票的风险越高。所以最大回撤率越小,从风险这个角度来说股票越好。

三、生成脚本

所以接下来做什么?流程告诉我们该用脚本…WHY?

Matlab最经典的一种功能就是其脚本,不仅能够完整地呈现整个问题的解决方法,同时更便于维护、完善、执行。所以当我们的探索和开发工作比较成熟后,通常都会将这些有用的程序归纳整理起来,形成脚本。

我们要做的就是:

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

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

%%在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 ,该语句把6×8的cell类型数据转换为6×8 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,作为股票的风险