$ D i9 t& I1 z/ E* A u- r$ R 斜率和最大回撤率不妨一个一个来解决。我们先来看如何计算曲线的斜率。对于这个问题,比较简单,由于从数据的可视化结果来看,数据近似成线性,所以不妨用多项式拟合的方法来拟合该改组数据的方程,这样我们就可以得到斜率。3 `# t. [: g+ o- G) R
. M$ X- r, b1 r4 t$ W, {4 L1 V' zStep2.3:通过polyfit()多项式拟合的命令,并计算股票的价值,具体代码为:6 U7 o* k7 Q- K$ g# R7 D
8 z7 H& O) N \% x# q( O) h
>> p = polyfit(DateNum,Pclose,1); % 多项式拟合2 u# u8 F1 B3 y& B5 B$ f; E
z8 n' J$ h+ u# s9 \
>> value = p(1) % 将斜率赋值给value,作为股票的价值5 G R0 j. y2 n2 w! \- G/ ^1 r, C
( G9 p- w2 X* Z+ b Jvalue = , X; P$ x9 J/ e u. { ! _: c% f9 @) M' L9 K 0.1212% `2 f7 M2 X! p, X
% M3 v/ o3 W+ \( \% r+ J代码分析:%后面的内容是注释。polyfit()有三个参数,前两个大家都能明白是什么意思,那第三个参数是什么意思呢?它表示多项式的阶数,也就是最高次数。比如:在本例中,第三个参数为1,说明其为一次项,即一次函数。第三个参数为你要拟合的阶数,一阶直线拟合,二阶抛物线拟合,并非阶次越高越好,看拟合情况而定。polyfit()返回阶数为 n 的多项式 p(x) 的系数,p 中的系数按降幂排列。在本例中的P(1)指的是最高项的系数,即斜率。 ( w# l1 \1 x ]% e( w8 G6 P ( N9 K/ @# J# x* [; s. VStep2.4:用相似的方法,可以很快得到计算最大回撤的代码: 0 y, l: f2 i5 ? \- B2 t- i * P6 O% d& @% N; W/ D1 d>> MaxDD = maxdrawdown(Pclose); % 计算最大回撤" z- s3 ?* K( Y
+ q5 V$ `# p1 m9 {* W
>> risk = MaxDD % 将最大回撤赋值给risk,作为股票的风险4 `. B+ I \; D I
2 I' y/ v; b$ e" M
risk =4 k1 |, Y$ J, G/ B
* z9 k8 e+ Y5 C9 D 0.1155 2 y5 [: f5 w. q# Q2 | : ^* h9 W6 k' o代码分析:最大回撤率当然计算的是每天收盘时的股价。最大回撤率越大,说明该股票的风险越高。所以最大回撤率越小,股票越好。 ! w' Q. X( o7 n$ w4 p/ `' c+ Z( o! @6 J4 H* I
到此处,我们已经找到了评估股票价值和风险的方法,并能用 MALTAB 来实现了。但是,我们都是在命令行中实现的,并不能很方便地修改代码。而 MATLAB 最经典的一种用法就是脚本,因为脚本不仅能够完整地呈现整个问题的解决方法,同时更便于维护、完善、执行,优点很多。所以当我们的探索和开发工作比较成熟后,通常都会将这些有用的程序归纳整理起来,形成脚本。现在我们就来看如何快速开发解决该问题的脚本。 8 v3 N$ b3 e3 F3 i' E 6 t: k! n' E, R' s- `Step2.5:像 Step1.1 一样,重新选中数据文件,右键并单击“导入数据”菜单,待启动导入数据引擎后,选择“生成脚本”,然后就会得到导入数据的脚本,并保存该脚本。* M/ v( F* g1 j
4 [. o5 p2 F! ?! C脚本源代码中有些地方要注意: ! F4 w5 b# _; `" o; r : P! @1 ]: h$ L; [% n0 ]! x %%在matlab代码中的作用是将代码分块,上下两个%%之间的部分作为一块,在运行代码的时候可以分块运行,查看每一块代码的运行情况。常用于调试程序。%%相当于jupyter notebook中的cell。% }6 J. |2 B. }
$ G4 ]% k3 g& v4 I$ ^ %后的内容是注释。7 o( H$ N* d: Z7 C, a: s8 C. ~* M
; h% n N- G% U$ D/ Q( G
每句代码后面的分号作用为不在命令窗口显示执行结果。 J) C* T& |5 D9 r K2 B6 g t
' S' @3 p1 o% Z
脚本源代码:- k' Y' ~4 |" `
/ S9 s4 q7 ]8 t5 C- z" v- }
%% 预测股票的价值与风险 6 g2 X9 u" p' X G 6 @* G3 P, M1 v+ @$ y* U%% 导入数据9 j9 ]) Y4 _- X7 J
clc, clear, close all" ]% U* V( j% _7 d: V7 c" f
% clc:清除命令窗口的内容,对工作环境中的全部变量无任何影响 ' }( ~5 z: k% x7 Q& s; x
% clear:清除工作空间的所有变量 ; O; B7 p7 k# v: C% k7 P% close all:关闭所有的Figure窗口 " [1 W; L# r, w) b$ N5 D # Z' F' p2 m# S6 l8 H0 O% 导入数据. Y$ X5 W2 B4 A4 b' d6 L8 ~' `1 I
[~, ~, raw] = xlsread('sz000004.xlsx', 'Sheet1', 'A2:H7');- [" `; w, u) C3 q2 G
% [num,txt,raw],~表示省略该部分的返回值 0 ^7 o) ]0 u" k. e+ G6 K5 k3 L% xlsread('filename','sheet', 'range'),第二个参数指数据在sheet1还是其他sheet部分,range表示单元格范围' m* B7 y& y$ [: k% o" C6 W9 Y
3 _- D- U* h: g! E
% 创建输出变量 5 W7 U1 @% U r8 zdata = reshape([raw{:}],size(raw));/ r/ e" h: H d: L
% [raw{:}]指raw里的所有数据,size(raw):6 x 8 ,该语句把6x8的cell类型数据转换为6x8 double类型数据5 J: f% V0 p/ `( A+ u# ]- Y
! n" b7 R' c* t& Y) c: J
% 将导入的数组分配列变量名称 & B) G" U* z% l' PDate = data(:, 1); % 第一个参数表示从第一行到最后一行,第二个参数表示第一列. @7 C0 m1 }+ h; J" \' l* X
DateNum = data(:, 2); 3 u' X8 I f* ~" ?' ], z2 XPopen = data(:, 3); # D2 F% j2 u3 O/ d8 mPhigh = data(:, 4);3 q" {- L! ] q) l6 g0 V% Z1 J
Plow = data(:, 5);. K- L0 w5 y9 i) d; Q1 Y
Pclose = data(:, 6); ( F |" o# ]4 v: jVolum = data(:, 7); % Volume 表示股票成交量的意思,成交量=成交股数*成交价格 再加权求和 & Y& C. U. r# YTurn = data(:, 8); % turn表示股票周转率,股票周转率越高,意味着该股股性越活泼,也就是投资人所谓的热门股 P9 ]% }2 n d) z; w6 V/ [3 u+ d ( y. e' b, n8 U( D% 清除临时变量data和raw ! i. j2 O1 a0 c( Y" _- `# Wclearvars data raw;1 i) _ {. X( x
8 A7 P: Q6 x0 Y, h% n( H该问题是典型的多元回归问题,但能否应用多元线性回归,最好先通过数据可视化判断他们之间的变化趋势,如果近似满足线性关系,则可以执行利用多元线性回归方法对该问题进行回归。具体步骤如下:3 t1 X- p$ R9 r# d
# a. G; H2 X! [5 b, Z
(1)作出因变量 Y 与各自变量的样本散点图, l+ d1 E7 {4 a& \5 k' X
( @$ U) F5 G/ T. Y( K* }; e& S+ R
作散点图的目的主要是观察因变量 Y 与各自变量间是否有比较好的线性关系,以便选择恰当的数学模型形式。图3 分别为年薪 Y 与成果质量指标 X1、研究工作时间 X2、获得资助的指标 X3 之间的散点图。从图中可以看出这些点大致分布在一条直线旁边,因此,有比较好的线性关系,可以采用线性回归。绘制图3的代码如下:! l4 k$ }& c s1 L3 p% I+ n
; S/ X, P* O( j3 w6 U6 c7 S6 r. w 7 S' y* y* b" T% Q3 N5 Tr =$ s" k6 i( e9 U( N' x
0 n# \$ |1 x% X; I$ Q 0.6781' G5 o) h8 l4 b/ S B* S& e/ u
1.9129' Z" U5 y" U0 I
-0.11199 _) V, w9 x# x" V$ G- m
3.3114, a4 \/ J2 @1 G5 _! h1 N
-0.7424: T& N6 q; b" b4 `, M
1.2459 , ~& C: w+ |8 U" _ -2.1022) l. ^4 b+ O {; k, t
1.96504 x: e0 z: m/ r' z, C2 M6 T5 @
-0.3193 0 S7 \: s0 j7 d, Z6 _) s 1.3466 ! Y5 {: ~0 E% Z8 j 0.86912 A' X* c9 f) R* e7 ~( M- m
-3.2637 ; Y5 s2 g# ?9 A0 ^ -0.5115 + }& Q/ v% P+ M9 y1 q -1.1733* p' D" k) j4 d* N. Z
-1.4910 1 p: @- y" x$ C -0.2972 * c+ `0 e' @7 W8 ? 0.1702 5 ?8 f+ \5 B( j 0.5799 4 ~; l! l: _1 ^9 y& g3 j2 ~5 ?8 \ -3.2856 4 g1 ^$ U6 e' z. f, ]1 C8 w 1.1368% P; B$ e0 s: p M A) D B% E* m
-0.8864 ( _. g) z# H$ Q8 y -1.4646 5 z1 i- F+ E. v0 j9 W9 ` |8 [ 0.80326 h7 k) b, Q$ l5 G, f5 j
1.6301" ?6 N0 f. {6 v6 ]
2 g3 R+ P" y5 ~1 N; f
' r2 I; W4 P% X s" h& }
rint =0 T. s) \% r/ @/ e8 c' o
+ _, L- U+ z+ _2 A) v/ l' D* q -2.7017 4.0580% r/ q) h4 H; l2 A7 b' K3 D
-1.6203 5.4461! S5 X/ u9 O1 _6 T5 E4 O& [
-3.6190 3.3951 # w3 q% {+ V! A( t { 0.0498 6.5729 & P0 [& X: u$ q. j0 T -4.0560 2.5712 + X$ w! \& ?# z6 ^ -2.1800 4.67177 l8 f$ q+ g# A$ R, g& F1 D4 ^
-5.4947 1.2902 6 P! O- F1 l. `; @' O. \, H9 S# t -1.3231 5.25317 p9 v# _; G/ t( E
-3.5894 2.95071 t. {1 m) k* E2 E3 ^$ O3 B! f. B
-1.7678 4.46099 P9 n$ J3 W! p% e% u' ]& v
-2.7146 4.4529 ! |4 M0 w6 f: J8 z% n/ D& ~ -6.4090 -0.1183 [2 u! I0 ^7 {5 ] -3.6088 2.5859( n, c5 A; e6 ?( M
-4.7040 2.3575 5 h$ y: b9 o a) j -4.8249 1.8429- ~) x( g% ^: M2 g- Y
-3.7129 3.11851 h7 S' x, B. y0 O5 p: z
-3.0504 3.3907 - W7 p) Y6 m2 h7 b& K9 b) P -2.8855 4.0453 " G( ]' L& X9 `; x* s/ z -6.2644 -0.3067 ( ` _% T }0 r: K( X; p -2.1893 4.46304 c) u2 F" l0 a: Y2 j0 v: N
-4.4002 2.6273+ T1 n, Y1 B' P+ K L
-4.8991 1.9699 * I/ {% i" R. {0 {" J. S- H -2.4872 4.09374 ~, F3 R J& R$ ^
-1.8351 5.0954. E% u5 c3 ?, S- a3 W, f" X* M1 I
" q4 f9 Q- q3 ]6 s4 a. R @ l$ f" g" j# J+ T) N8 Zs = ( p) [- X" e# b 8 w+ X/ K3 O' A( ^ 0.9106 67.9195 0.0000 3.07199 Q- s% A5 @$ [" ~
看到如此长的运行结果,我们不要害怕,因为里面很多数据是没用的,我们只需提取有用的数据。) t4 T5 e+ G, I1 C, H4 G
' ~" ^! `8 ?( X: I" E& I
在运行结果中,很多数据我们不需理会,我们真正需要用到的数据如下: , f; ^ ?- X5 g3 v : M; b* r: G4 Z1 U) ?* B( [( Ab =/ w) k6 z/ [% Z8 {& j. W$ o3 Q
7 R' l- y* x$ H3 x/ _) ^5 M 18.0157 1 v: R' J, {- W6 n, L$ g; P 1.0817 4 q S4 `: I8 z/ h- H 0.32126 }$ K+ P3 j6 P, a7 @% K
1.2835 . d* D s1 G# @; n; V4 S: E# } r
s =; m) t4 R& Z' }, o
8 T2 v# N4 N" v& H$ y2 E/ Q
0.9106 67.9195 0.0000 3.0719 : U* ~6 ?/ }: @! h) S回归系数 b = (β0,β1,β2,β3) = (18.0157, 1.0817, 0.3212, 1.2835),回归系数的置信区间,以及统计变量 stats(它包含四个检验统计量:相关系数的平方R^2,假设检验统计量 F,与 F 对应的概率 p,s^2 的值)。观察表4的数据,会发现它来源于运行结果中的b和s: 3 L$ H1 e/ J5 A X( z, H/ ~# V/ |& J4 [, L! j, ]0 s8 R M2 {
1 f2 F% s' Y, T+ {) s7 E8 P3 h5 r5 h
根据β0,β1,β2,β3,我们初步得出回归方程为: 1 T% @% `3 o2 F: ?2 S ( Z$ ~ Z( I1 t, H. ]# O8 ] * i, i9 U1 \6 B8 {' W$ \; i1 H- d& z3 r- e
如何判断该回归方程是否符合该模型呢?有以下3种方法:# \1 c# z4 m+ u' e
8 U7 p( ^! \6 B6 z4 `
1)相关系数 R 的评价:本例 R 的绝对值为 0.9542 ,表明线性相关性较强。 " q, q5 b( z8 d ) _5 p5 V% g' I2)F 检验法:当 F > F1-α(m,n-m-1) ,即认为因变量 y 与自变量 x1,x2,...,xm 之间有显著的线性相关关系;否则认为因变量 y 与自变量 x1,x2,...,xm 之间线性相关关系不显著。本例 F=67.919 > F1-0.05( 3,20 ) = 3.10。 % N. o {/ f! z8 B! y; Q+ a 7 T, t$ V$ r% Q3 I3 a) f3)p 值检验:若 p < α(α 为预定显著水平),则说明因变量 y 与自变量 x1,x2,...,xm之间显著地有线性相关关系。本例输出结果,p<0.0001,显然满足 p<α=0.05。7 ?$ l' Z/ U0 Q) G
+ u5 R+ ~- V6 C/ ?/ a
以上三种统计推断方法推断的结果是一致的,说明因变量 y 与自变量之间显著地有线性相关关系,所得线性回归模型可用。s^2 当然越小越好,这主要在模型改进时作为参考。, n* T- T5 g+ W
- t3 b+ V$ L g2 m( A3. 逐步回归3 S. w5 B" ]+ L
6 N) |% ~6 h+ l. `6 l5 }
[ 例4 ] (Hald,1960)Hald 数据是关于水泥生产的数据。某种水泥在凝固时放出的热量 Y(单位:卡/克)与水泥中 4 种化学成品所占的百分比有关:: [5 R) U2 L/ F' ^% u- L
- ^/ E, _, x0 z& [- q; y 1 B3 h! B1 L3 X7 u. P8 p0 h/ i: R: R& @; I- r
在生产中测得 12 组数据,见表5,试建立 Y 关于这些因子的“最优”回归方程。 1 m& r6 s& ?1 }) |1 S% n; m% A4 x$ a4 \- V+ l' k) y9 N
+ ]4 g, M9 L% X8 c n$ k; X/ Q5 I; c. I- n3 R% c. T" K
对于例 4 中的问题,可以使用多元线性回归、多元多项式回归,但也可以考虑使用逐步回归。从逐步回归的原理来看,逐步回归是以上两种回归方法的结合,可以自动使得方程的因子设置最合理。对于该问题,逐步回归的代码如下:( u6 `4 ]" Z' I9 K
. E; j- ?6 o |- P4 L$ A%% 逐步回归5 m$ g" G6 I( g7 T! y8 N
X=[7,26,6,60;1,29,15,52;11,56,8,20;11,31,8,47;7,52,6,33;11,55,9,22;3,71,17,6;1,31,22,44;2,54,18,22;21,47,4,26;1,40,23,34;11,66,9,12]; %自变量数据/ k m2 ^: w5 k8 { b0 m
Y=[78.5,74.3,104.3,87.6,95.9,109.2,102.7,72.5,93.1,115.9,83.8,113.3]; %因变量数据. V0 D8 j- t7 X% y9 o3 _2 C
stepwise(X,Y,[1,2,3,4],0.05,0.10)% in=[1,2,3,4]表示X1、X2、X3、X4均保留在模型中- n5 P' k+ q1 r; k3 d6 z
程序执行后得到下列逐步回归的窗口,如图 4 所示。 4 y2 _3 Y6 ]. S: ]4 { & P+ O. S6 y% K. V$ M! t0 e $ i2 v7 J1 O! Y7 `! o! p- t" O0 i $ }2 ^; E2 R) a/ g' L3 m5 Y 图41 K& }( M- s! M* y5 H& Z
# f3 J" R% S a& V在图 4 中,用蓝色行显示变量 X1、X2、X3、X4 均保留在模型中,窗口的右侧按钮上方提示:将变量X4剔除回归方程(Move X4 out),单击 Next Step 按钮,即进行下一步运算,将第 4 列数据对应的变量 X4 剔除回归方程。单击 Next Step 按钮后,剔除的变量 X3 所对应的行用红色表示,同时又得到提示:将变量 X3 剔除回归方程(Move X3 out),单击 Next Step 按钮,这样一直重复操作,直到 “Next Step” 按钮变灰,表明逐步回归结束,此时得到的模型即为逐步回归最终的结果。最终结果如下:7 x; z7 ^( {2 w0 C! R* a
X f& ` M, B