% U& S* X$ V2 @' X8 R% 创建输出变量% l ^2 S" z3 X- k! z O6 ^
data = reshape([raw{:}],size(raw)); 5 V( r0 r Y& z; n- X( g, ^. I% [raw{:}]指raw里的所有数据,size(raw):6 x 8 ,该语句把6x8的cell类型数据转换为6x8 double类型数据8 P. f# m. f" Q, F( _
% i, z6 D" n: C
% 将导入的数组分配列变量名称+ J! z, }% o* S3 X; r$ j
Date = data(:, 1); % 第一个参数表示从第一行到最后一行,第二个参数表示第一列: G6 q* E) r9 ?3 E c' ^) Q
DateNum = data(:, 2);) A. C! J+ s" G
Popen = data(:, 3);7 U& W* Y/ Y' [, N
Phigh = data(:, 4); 1 \& S( R* i) }" k& P% G6 Y) mPlow = data(:, 5); 4 h" F1 R* q9 W0 {) N2 |- q# kPclose = data(:, 6); + ~6 W# p( H' ?4 M2 m
Volum = data(:, 7); % Volume 表示股票成交量的意思,成交量=成交股数*成交价格 再加权求和! k3 I- ?7 t2 K- \: i) d
Turn = data(:, 8); % turn表示股票周转率,股票周转率越高,意味着该股股性越活泼,也就是投资人所谓的热门股 1 u. w7 g% C! b& C) f, b% Q2 [3 y& j) h1 d: F1 d5 l8 A
% 清除临时变量data和raw" a; h9 j! Q: Q3 e7 Y
clearvars data raw; ; j0 f+ Z. P: j8 Q* }* j; n: S4 L+ g
%% 数据探索 , T" y* l4 A* t6 C, y2 X# @ $ M) Z% Q U5 O1 s) H# [figure % 创建一个新的图像窗口- e# |/ u+ V- g
plot(DateNum, Pclose, 'k'); % 'k',曲线是黑色的,打印后不失真 2 R) c- o1 }& ]9 Y& E; \$ U# o8 Mdatetick('x','mm-dd'); % 更改日期显示类型。参数x表示x轴,mm-dd表示月份和日。yyyy-mm-dd,如2018-10-27 $ Q# z z! }4 u9 Qxlabel('日期') % x轴 * Y- g( \* z8 J2 g/ W) a) b& hylabel('收盘价') % y轴* I5 n4 Q, E, E. N1 [) g9 l
figure0 k; j* g0 k: M
bar(Pclose) % 作为对照图形 0 X/ P$ v4 j% i; K, k- z8 K ) p3 A; `; j: @4 O! N+ ~" f& C! q8 C%% 股票价值的评估8 p7 g5 C( G* w+ C" `+ v
: P2 N/ F* h1 b1 \
p = polyfit(DateNum, Pclose, 1); % 多项式拟合9 T( x1 A: D3 @1 C! v- s" d
% polyfit()返回阶数为 n 的多项式 p(x) 的系数,p 中的系数按降幂排列/ Y1 a# Y7 R4 B
P1 = polyval(p,DateNum); % 得到多项式模型的结果 ! V ^) r. I3 ~. ?figure9 A; `1 y# J5 u, b, T! N
plot(DateNum,P1,DateNum,Pclose,'*g'); % 模型与原始数据的对照, '*g'表示绿色的*: X$ O, [0 y8 m5 e; U3 |
value = p(1) % 将斜率赋值给value,作为股票的价值。p(1)最高项的次数' W6 I0 S U5 K+ p; W' b) d$ _
7 d- W6 H& t) }/ Q$ K, g3 y( {%% 股票风险的评估 _- k( ^: B K N. _( q9 pMaxDD = maxdrawdown(Pclose); % 计算最大回撤 7 [9 L. ]! z, rrisk = MaxDD % 将最大回撤赋值给risk,作为股票的风险* Q! G4 B6 p8 U* F7 k
3、回归算法演练。% W! s: _1 u& ` F. ^8 F4 i
& {6 V7 k* M: n2 v3 o(1)一元线性回归% O. O9 a, v6 @9 w
1 X, \0 P, E6 U[ 例1 ] 近 10 年来,某市社会商品零售总额与职工工资总额(单位:亿元)的数据见表1,请建立社会商品零售总额与职工工资总额数据的回归模型。 , k: c2 D( q) s6 R" @, h Z S1 m ; E! ?9 u" t3 h - J. e" G0 Y2 B6 M/ E+ W- L; r$ H* V$ l- M- f
该问题是典型的一元回归问题,但先要确定是线性还是非线性,然后就可以利用对应的回归方法建立他们之间的回归模型了,具体实现的 MATLAB 代码如下: & ^ \# ]" Q6 l. J5 A4 h * d/ s' z3 a6 E, {# P1 _; o(1)输入数据 ) t+ P3 ^1 f. u# \! | 6 H ] q: T, X%% 输入数据! ` B6 L% `" M5 n" K, R
clc, clear, close all 8 I5 ~9 y8 v: B) D; Y% 职工工资总额 4 X+ P' l/ D* X- E; N7 w6 f8 a. \' Kx = [23.8,27.6,31.6,32.4,33.7,34.90,43.2,52.8,63.8,73.4];' d0 V0 [9 _0 S+ n9 d9 w
% 商品零售总额$ y- J" Q2 e# O7 m
y = [41.4,51.8,61.7,67.9,68.7,77.5,95.9,137.4,155.0,175.0];8 N* Q6 Y1 W) E7 ^
(2)采用最小二乘回归3 D x5 i' x& ?+ B. I2 {
9 \3 O7 H% E( M+ p" x, ~' [%% 采用最小二乘法回归: V! q# }" |* s
% 作散点图1 V8 P4 n. f) x/ _1 R. g& o7 g
figure7 j( Y$ k" z5 N; R2 w3 C
plot(x,y,'r*') % 散点图,散点为红色0 F0 E5 m) _0 s5 l
xlabel('x(职工工资总额)','fontsize',12) ) X0 q l+ |; G6 Y* x$ B9 M" hylabel('y(商品零售总额)','fontsize',12); j1 Y/ F$ e7 c3 L; I
set(gca, 'linewidth',2) % 坐标轴线宽为29 D! P4 Y' b8 K0 w n
% N8 [6 N& Z" q% N5 }3 a: B) [! ]* N
% 采用最小二乘法拟合 2 K% L0 c( }" F9 M* ULxx = sum((x-mean(x)).^2); %在列表运算中,^与.^不同9 i4 G' Q) U. Y$ r
Lxy = sum((x-mean(x)).*(y-mean(y))); , j( H* V% \4 ^) z* `' b- fb1 = Lxy/Lxx; ) S0 o% L0 h0 w, b- l& lb0 = mean(y) - b1 * mean(x);2 U* V) f2 M7 `( P6 M. |9 |
y1 = b1 * x + b0;5 U1 @9 h( p# @$ l
& _' d) R/ `8 m+ L }8 A3 dhold on % hold on是当前轴及图像保持而不被刷新,准备接受此后将绘制的图形,多图共存 5 g* G2 b9 C$ dplot(x,y1, 'linewidth',2);. ~. p' q4 C% Q/ ?
运行本节程序,会得到如图5所示的回归图形。在用最小二乘回归之前,先绘制了数据的散点图,这样就可以从图形上判断这些数据是否近似成线性关系。当发现它们的确近似在一条线上后,再用线性回归的方法进行回归,这样也更符合我们分析数据的一般思路。 % q2 t- f% U8 y+ T, g# q 9 a6 a( u" S# d3 h b' L' m" ~/ L# S) Y
# ]; A! _2 k( N" p# X
图5 6 A. H5 s9 O% j4 [, u& l$ }7 J/ f% n+ A" A3 X6 m3 {
(3)采用 LinearModel.fit 函数进行线性回归 6 Z( s2 M! d& A5 x % Y. H0 N- d6 i6 V%% 采用 LinearModel.fit 函数进行线性回归1 J1 k1 I# j9 m) {3 j# D; l( M
m2 = LinearModel.fit(x, y). q, Z# V/ B) R
运行结果如下: 2 }0 }8 l5 \- p j" R" r) X; V0 F" E9 F' W" o+ U V
m2 = 3 N& q3 l) J( p& y: M 3 P' J K0 |) z& D' U5 `8 JLinear regression model: ' J! A. x6 K; Z8 H6 C- b3 C7 b1 _+ A1 ~9 u- Z0 |* b
y ~ 1 + x18 P) S9 g& q' j7 ^/ ]0 D
Estimated Coefficients: 4 M2 {9 z" Z; X) l/ {' m& ]1 ^: L K( _7 Y. e0 F4 G
Estimate SE tStat pValue 1 k- ]6 A! M0 z
5 K/ ?) ~2 z: Q0 Y# `7 C# Z+ k
(Intercept) -23.549 5.1028 -4.615 0.0017215 # v, p4 t) d, q0 U# Y7 n# V : w! Z6 v B' o x1 2.7991 0.11456 24.435 8.4014e-09 ; h9 B9 j5 ~! x$ ]* y. H# V2 z( p 8 i3 g4 [) J* V; O- |R-squared: 0.987, Adjusted R-Squared 0.985 / j" ^9 A7 c3 g/ c2 [- P; ^: K ~3 _0 |9 i( j3 _( h" P6 F) h1 ?
F-statistic vs. constant model: 597, p-value = 8.4e-09: f- Y; R) z( x9 e( {' m6 Y$ s' e
: d* y( k( M# _3 @
如下图,我们只需记住-23.594是一次函数的中x的系数,2.7991是一次函数中的常数项即可,其它的不用理会。 9 n! a7 }" ]" ?! J, p . i/ C* M/ d B( m) U9 I8 a7 {. {5 I; A1 y# m: w/ W
: Y" H9 ?4 V5 `& u7 Z
4)采用 regress 函数进行回归- m4 b1 h* @. M: G: z: {0 L! h
$ y% o; v/ k9 W5 m! B: I/ H# @
%% 采用 regress 函数进行回归 - s3 W7 P3 @8 e% j! XY = y' 1 @# x+ L6 ^8 N0 E5 D3 L1 w; }2 D9 O8 mX = [ones(size(x,2),1),x']* t% [! c+ w# B8 V" m
[b,bint,r,rint,s] = regress(Y,X)6 S3 d7 J' F& K: S) ?7 {2 r: z7 [
运行结果如下:. j8 f7 m7 F" w; I5 \7 l
0 z0 X: @" s: D0 r8 h$ nb =! C, \8 J/ y. p5 o6 I3 Y. \# ~
5 e. a2 l$ o( J -23.5493 7 y* K* u- s7 z( O/ S( _3 Q+ l( c+ g0 O% w! } o |: d; }
2.7991 ( `# s! n$ H# T0 j4 _1 h& W2 H6 P: d9 w: n; U ]. a4 A
我们只需记住-23.594是一次函数的中x的系数,2.7991是一次函数中的常数项即可,其它的不用理会。 - m1 Q: ~; ~" w* G, s0 V5 u S& D5 x. K; A8 Y* @
(2)一元非线性回归 # b D1 m x; J* m! k # C. }5 x4 ~4 X& ? i[ 例2 ] 为了解百货商店销售额 x 与流通率(这是反映商业活动的一个质量指标,指每元商品流转额所分摊的流通费用)y 之间的关系,收集了九个商店的有关数据(见表2)。请建立它们关系的数学模型。 : a( ?/ a0 d- ]& h% D" S0 U; L& r4 H7 O M9 Z2 X6 Y1 B
/ }9 A, U4 e: o" A, J
! Q: ?& {% K4 T, t 1 m* V N9 F/ k' J# G0 C1 A" ? 2 {* x' b2 N! |. d' q F1 T 为了得到 x 与 y 之间的关系,先绘制出它们之间的散点图,如图 2 所示的“雪花”点图。由该图可以判断它们之间的关系近似为对数关系或指数关系,为此可以利用这两种函数形式进行非线性拟合,具体实现步骤及每个步骤的结果如下: ) k4 f: G) O$ [+ k" y # n. e1 G0 A+ O3 F' Q* c(1)输入数据" `' ~% B" A, D3 }, G d
2 T: z7 z4 g: Y5 D3 x0 C%% 输入数据 9 p( K: G8 O; H1 ~clc, clear all, close all 5 ?1 F8 y, f' P) @) n: ix = [1.5, 4.5, 7.5,10.5,13.5,16.5,19.5,22.5,25.5]; t8 I9 q& {& I% b Cy = [7.0,4.8,3.6,3.1,2.7,2.5,2.4,2.3,2.2]; : w a" m+ v5 ~$ ]. l7 ~0 splot(x, y, '*', 'linewidth', 1) % 这里的linewidth指的是散点大小& u" C/ E/ ~) h/ Y
set(gca,'linewidth',2) % 设置坐标轴的线宽为2 2 {4 R* Z7 }" hxlabel('销售额x/万元','fontsize',12)( Q+ ~- q. D2 j; H- G7 h& S: O6 ?
ylabel('流通率y/%','fontsize',12) ' \) a) ?6 Z$ \(2)对数形式非线性回归 ; ?8 m! G; Z$ D( v% n/ K6 L7 i+ r6 R# I: A2 }2 |! g
%% 对数形式非线性回归7 w, K' w4 K: t+ b7 I
m1 = @(b,x) b(1) + b(2)*log(x);+ L0 W# T! u2 |! _/ u! s. u
nonlinfit1 = fitnlm(x,y,m1,[0.01;0.01]) ! s" R0 ^# V- }( a2 L7 y% O3 Ab = nonlinfit1.Coefficients.Estimate; % v; ]' ~* n" h T/ UY1 = b(1,1) + b(2,1)*log(x);1 B6 Q% O; S( [' w
hold on 1 [# Z% X1 t8 F6 E" s
plot(x, Y1, '--k', 'linewidth',2) 0 i& l9 V" k" N2 |% w" e& m; g: ^' Q运行结果如下: 2 L% D5 ~: F2 I* a3 m% d9 L1 w 8 l L {- e' i7 l# nnonlinfit1 =$ B: C; a) X. p
6 z3 C+ S! b3 U; Q
Nonlinear regression model:; _3 w9 C+ G2 G! U& g: ]
$ h* j# [( H+ Q q y ~ b1 + b2*log(x) . H; c1 M. E) U( ]/ q * r7 Z! r6 p0 q6 }Estimated Coefficients: # w: H+ B! _- p6 v, L$ I ' K" O2 I2 ~# L/ L Estimate SE tStat pValue + S7 Z$ A, X; Q3 w' S C 6 r; @7 {8 E# c1 \9 X9 @3 t b1 7.3979 0.26667 27.742 2.0303e-08$ i: H$ ~7 W! `1 s& L
5 D& U4 X' l* H X- O+ \
b2 -1.713 0.10724 -15.974 9.1465e-07. x( P1 z0 o% U+ u% M