Z = 1.2* X1 + 1.4 X2 + 3.3 *X3 + 0.6 X4 + 1.0* X5
其中 Z 为 Z-SCORE,而 X1 至 X5 为
X1:营运资金除以总资产;
X2:保留盈余除以总资产;
X3:息前税前净利除以总资产;
X4:股东权益市值除以总负债的账面价值;
X5:销售金额除以总资产。
一般而言,一家财务健全的上市公司,其 Z 分数应该高于或等于 2.675;而财务状况不佳(财务危机)的公
司,其 Z 分数则低于或等于 2.675
财务危机预警20家企业样本数据
x1-x5对应企业各项指标,Y为1代表正常公司,为0是代表危机公司。
将 20 家企业的样本数据代入如下 ZSCORE 模型中:
Z = 1.2* X1 + 1.4 X2 + 3.3 *X3 + 0.6 *X4 + 1.0 X5
结果如下,20家企业中有6家预测结果和实际不相符。
由此可知,Z-SCORE 模型侦测财务危机预警的能力尚有改善空间,可能是时空背景的不同,导致该模型的推广能力逐渐减弱,若能将 Z-SCORE 模型中各自变量前的系数加以优化(优化),应该能提升其预测能力。
首先初始5群果蝇群体, 分别指派给p1, p2, p3, p4和p5等参数。 每群有 10 只果蝇,随机初始化果蝇群体位置区间为[0,1],迭代的果蝇搜寻食物的随机飞行方向与距离区间为[-1,1]。 经由 100 次迭代搜寻最
佳的 p1, p2, p3, p4 和 p5 后, Z-SCORE 预测结果逐渐趋近于目标值 Y。
【注】
如何实现Z-SCORE 预测结果逐渐趋近于目标值 Y ?
答:均方根误差(RMSE,root-mean-square error),用来衡量观测值同真值之间的偏差。首先随机产生p1,p2..p5,代入Z-SCORE模型中得到观测值,从而求出RMSE,然后经n次迭代后,求出最小RMSE时p1,p2,..p5值,即为最佳模型参数。
clc
clear
%加载z-score训练数据
load G:\matlab-code\TXY.txt;
[row,col] = size(TXY);
set = row / 5;
row1 = row - set;
tr = TXY(1:row1,1:col-1);
t1 = TXY(1:row1,col);
%tr和t1来得到最优z-score系数
te = TXY(row1+1:row,1:col-1);
t2 = TXY(1:row1,col);
%te和t2来检查优化效果
%一行5列的随机数矩阵,表示5个果蝇群体的初始位置
x_axis = rands(1,5);
y_axis = rands(1,5);
size_pop = 20;
max_gen = 100; %迭代次数
for p = 1 : size_pop
% x[p,:],横坐标位置矩阵的第p行,
% 初始5个果蝇种群中个体飞行方向和距离
x(p,:) = x_axis + 2*rand() - 1;
y(p,:) = y_axis + 2*rand() - 1;
%在原始果蝇种群位置上,每5个果蝇飞行一次计算一次均方根误差
g = 0;
% 求出5个果蝇群体中第p个果蝇个体到原点的距离
d(p,1) = ( x(p,1)^2 + y(p,1)^2 )^0.5;
d(p,2) = ( x(p,2)^2 + y(p,2)^2 )^0.5;
d(p,3) = ( x(p,3)^2 + y(p,3)^2 )^0.5;
d(p,4) = ( x(p,4)^2 + y(p,4)^2 )^0.5;
d(p,5) = ( x(p,5)^2 + y(p,5)^2 )^0.5;
%味道浓度判定值
s(p,1) = 1/d(p,1);
s(p,2) = 1/d(p,2);
s(p,3) = 1/d(p,3);
s(p,4) = 1/d(p,4);
s(p,5) = 1/d(p,5);
%利用味道浓度判定函数求出味道浓度,这里判定函数直接相等了。
a1 = s(p,1);
a2 = s(p,2);
a3 = s(p,3);
a4 = s(p,4);
a5 = s(p,5);
%求RMSE
% 1.根据Z-SCORE模型和随机a1,a2..a5求出观测值。【注】a1,a2..a5是味道浓度,是一个数 tr(:,k)取tr矩阵第k列。 yc是一个row1行1列的矩阵
% 2.利用观测值和真值计算均方根误差
yc = a1 * tr(:,1) + a2 * tr(:,2) + a3 * tr(:,3) + a4 * tr(:,4) + ...
a5 * tr(:,5);
yy = yc - t1; %z-score输出和目标值相减并计算RMSE,
for ii = 1 : row1
g = g + yy(ii)^2;
end
smell(p) = g^0.5/row1; %味道浓度用于记录RMSE,之后果蝇群体便根据该浓度决定下一次飞行
%一次循环表示5个果蝇群体中5只果蝇的共同拟合效果
end
%5次果蝇飞行的拟合效果,选择其中拟合效果最好的一次,即最小均方根误差,表示观测值和实际值最接近
[bestSmell,bestIndex] = min(smell);
%群体移动到最佳味道浓度,x[],y[]一行分别表示5个种群的位置
x_axis = x(bestIndex,:);
y_axis = y(bestIndex,:);
smellBest = bestSmell;
%最佳系数a1,a2...a5其实就是s[bestIndex,:]
%果蝇迭代寻优
for gen = 1 : max_gen
for p = 1 : size_pop
x(p,:) = x_axis + 2*rand() - 1;
y(p,:) = y_axis + 2*rand() - 1;
g = 0;
d(p,1) = ( x(p,1)^2 + y(p,1)^2 )^0.5;
d(p,2) = ( x(p,2)^2 + y(p,2)^2 )^0.5;
d(p,3) = ( x(p,3)^2 + y(p,3)^2 )^0.5;
d(p,4) = ( x(p,4)^2 + y(p,4)^2 )^0.5;
d(p,5) = ( x(p,5)^2 + y(p,5)^2 )^0.5;
s(p,1) = 1/d(p,1);
s(p,2) = 1/d(p,2);
s(p,3) = 1/d(p,3);
s(p,4) = 1/d(p,4);
s(p,5) = 1/d(p,5);
a1 = s(p,1);
a2 = s(p,2);
a3 = s(p,3);
a4 = s(p,4);
a5 = s(p,5);
yc = a1 * tr(:,1) + a2 * tr(:,2) + a3 * tr(:,3) + a4 * tr(:,4) + ...
a5 * tr(:,5);
yy = yc - t1;
for ii = 1 : row1
g = g + yy(ii)^2;
end
smell(p) = g^0.5/row1;
end
[bestSmell,bestIndex] = min(smell);
if bestSmell < smellBest
x_axis = x(bestIndex,:);
y_axis = y(bestIndex,:);
bestS = s(bestIndex,:); %bestS所记录的便是最佳Z-SCORE参数p1,p2,..p5
smellBest = bestSmell;
end
yy_(gen) = smellBest;
xBest(gen,:) = x_axis;
yBest(gen,:) = y_axis;
end
%均方根误差(RMSE)的收敛趋势,从理论上可推应趋向于0
figure(1);
plot(yy_);
title('Optimization process','fontsize',12);
xlabel('Iteration Number','fontsize',12);
ylabel('RMSE','fontsize',12);
%代表Z-SCORE模型参数的5个果蝇种群的飞行路径
figure(2);
plot(xBest,yBest,'b');
title('fruit fly flying route','fontsize',14);
xlabel('x-axis','fontsize',12);
ylabel('y-axis','fontsize',12);
smellBest;
bestS;
smellBest =
0.1176
bestS =
0.2283 0.2584 0.3358 0.2900 0.2192
可以看出,果蝇算法(FOA)优化后,整体正确率由Z-SCORE模型的65%(13/20)提高到了75%(15/20)。但在预测新个体(17-20)时,正确率并不能明显提高,猜测是需要达到一定的规模才可体现FOA优化效果。
附一点疑惑:为什么根据优化后p1,p2,..p5计算FOA-Z-SCORE时,若值小于0.5判定危机公司(0),大于0.5判定正常公司(1)?
参考文献:
[1] 果蝇优化算法.潘文超