Z计分模型2

本文描述的是Z计分模型,该模型主要用于预测企业财务失败或破产的可能性,也可用于判定企业经营的状况,是目前在财务分析中最常用的一种模型。

目录

1.Z计分模型简介:主要说明Z计分模型是什么,里的特征含义,解决什么问题。
2. Z计分模型应用分析的前期准备:主要说明Z计分模型里Z值的用途。
3. Z计分模型程序分析:主要说明Z计分模型数据来源和最终的结果分析
4. 总结:总结一下该模型的优势和劣势,再与之前的KMV模型比较看看有何优劣势。

1. Z计分模型简介

1.1 Z计分模型初版

1968年,关国纽约大学教授爱德华·奥特曼利用多变量分析技术对企业的财务状况进行判别分析,他首先选择了1946年至1965年间33家破产的制造业企业,再通过抽样选取了跟其配对的33家正常经营的企业作为样本,运用22个财务指标通过数理统计进行分析筛选,最终建立了从企业资产的流动性、获利能力、财务结构、偿债能力和发展能力等方而综合反映企业财务状况的著名5变量模型,即Z计分模型。研究表明,我国上市公司大部分支持Z计分模型的有效性,企业管理者可运用Z计分模型进行财务分析,促进其改善经营管理,防范财务风险,避免企业发生财务危机甚至破产;外部投资者、债权人等利益相关者可利用其评价企业,并可作为投资等相关决策的依据。
此时的Z计分模型的判别函数如下:
Z = 0.012 * X1 + 0.014 * X2 + 0.033 * X3 + 0.006 * X4 + 0.999 * X5
其中:
(1)X1=营运资金/资产总额=(流动资产一流动负债)/资产总额
该比率反映企业资产的流动性和分布状况,比率越高说明资产的流动性越强,财务失败的可能越小
(2)X2=留存收益/资产总额=(股东权益一股本一资本公积)/资产总额
该比率反映企业的积累水平,比率越高说明企业的积累水平越高,财务失败的可能越小
(3)X3=息税前利润/资产总额=(利润总额+利息费用)/资产总额
该比率反映企业的获利水平,比率越高说明企业的获利能力越强,财务失败的可能越小
(4)X4=股东权益市价/负债总额=(已上市流通股数收盘价+未上市流通股数每股净资产)/负债总额
该比率反映企业所有者权益(或净产)与企业债务之间的关系,比率越高,说明企业所有者权益越高或净资产越高,企业财务失败的可能性就越小
(5)X5=营业收入/资产总额:
该比率反映企业总资产的周转速度或营运能力,比率越高说明企业的资产利用率越高,效果也越好。

PS:X3中的利息费用无法直接从年报中获取,故以财务费用代替,对结果应无实质性影响;X4中的每股市价以股票当年股市收盘价计算。

1.2 Z计分模型的修正

随后爱德华·奥特曼又对该模型进行了修正, 删除了X5, 这是因为X5这一指标行业敏感性较强, 不利于不同行业间的比较。 Z计分模型经修正后, 构建了适合非制造企业的模型, 其表达式为:
Z=0.065 × Xl + 0.326 × X2 + 0.01 × X3 + 0.067 × X4

其中: X1= (营运资产 / 总资产) × 100
X2= 留存收益 / 总资产 = (盈余公积 + 未分配利润)/总资产 × 100
X3=税息前利润 / 总资产 × 100
X4= 资本市值 / 总负债 × 100

PS:本次模型使用时,资本市值使用股票市值替代。

总的来说,Z计分模型是根据企业的财务指标数据,经过各种数理统计后得到5个变量并确定相关系数的一个著名多变量模型,并且该模型对我国大部分上市公司有一定效果。

2. Z计分模型应用分析的前期准备

Z计分模型主要用于预测企业财务失败或破产的可能性,也可用于判定企业经营的状况,是目前在财务分析中最常用的一种模型,故本文首先用z计分模型来进行判别分析。先根据Z计分模型分别计算餐饮业、水利和交通行业的上海A股上市公司的Z值,再按Z值对企业进行比较和分析。

Z值的判断规则如图所示:


在本次模型使用中,将灰色的带判断为正常以方便计算。

3. Z计分模型程序分析

3.1 模型数据

上面已经介绍了模型特征的定义,那么接下来就是准备这些数据了,所需数据如下:

X1:流动资产流动负债资产总额
X2:盈余公积未分配利润资产总额
X3:税息前利润资产总额
X4:股票市值/总债务

数据从锐思数据库得到,在数据库查询中使用到的表有财务指标财务指标比率年度股票综合数据,最后将这些查询到的数据下载成excel格式。部分数据如下图所示:

图 3.1.1 水利上市公司
图 3.1.2 水利上市公司

可以清楚的看到这都是一些水利行业的上市公司,并且数据是16年~18年的第三季报。数据都是直接从表中得到。因为面板有限,更多具体的数据就不一一展示了。

3.2 模型执行结果分析

该模型代码比较简单,代码和数据可以从最下方码云链接下载。
代码主要分四部分,一是读取和处理数据;二是编写Z值函数;三是计算和统计结果,最后绘制图形。这四部分都挺简单的,读取数据和绘制图形时使用到了pandas库和matplotlib库。
具体代码如下:

"""
    功能:Z评分模型
    作者:hwang_zhicheng
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 读取上市公司数据
# data_xls_1 = pd.read_excel("白酒上市公司交易额表.xls")
# data_xls_2 = pd.read_excel("白酒上市公司营收.xls")
# data_xls_1 = pd.read_excel("ST+上市公司交易额表.xls")
# data_xls_2 = pd.read_excel("ST+上市公司营收1.xls")
# data_xls_3 = pd.read_excel("ST+财务比率.xls")
# data_xls_1 = pd.read_excel("餐饮1.xls")
# data_xls_2 = pd.read_excel("餐饮2.xls")
# data_xls_3 = pd.read_excel("餐饮4.xls")
# data_xls_1 = pd.read_excel("水利1.xls")
# data_xls_2 = pd.read_excel("水利2.xls")
# data_xls_3 = pd.read_excel("水利3.xls")
data_xls_1 = pd.read_excel("交通_Q3_1.xls")
data_xls_2 = pd.read_excel("交通_Q3_2.xls")
data_xls_3 = pd.read_excel("交通_Q3_3.xls")
# data_xls_1 = pd.read_excel("交通_Q4_1.xls")
# data_xls_2 = pd.read_excel("交通_Q4_2.xls")
# data_xls_3 = pd.read_excel("交通_Q4_3.xls")

# 读取上市公司数据
data_1 = data_xls_1.ix[:,
         ["上市状态_Listedstate"]].values

data_2 = data_xls_2.ix[:,
         ['流动负债合计(元)_Totcurlia', '负债合计(元)_Totlia', '盈余公积(元)_Surres',
          '流动资产合计(元)_Totcurass', '资产总计(元)_Totass', "最新公司全称_Lcomnm", "未分配利润(元)_Retear"]].values

data_3 = data_xls_3.ix[:,
         ['息税前利润_EBIT', '股票市值/总负债(Ⅰ)_MarkValtotdb1']].values

# print("data_2", data_2)
# print(data_2)
# print(data_3)

# 公司数据

# 公司年份数量
com_num = 2
# 上市状态_Listedstate
State_list = data_1[:, 0]
# print("State_list", len(State_list))

# 流动负债合计(元)_Totcurlia
SD_list = data_2[:, 0]
# print(SD_li)
# 负债合计(元)_TotLia
D_list = data_2[:, 1]
# 盈余公积(元)_Surres
Surres_list = data_2[:, 2]
# print("D_list:", D_list)
# 流动资产合计(元)_Totcurass
Totcurass_list = data_2[:, 3]
# 资产总计(元)_Totass
Totass_list = data_2[:, 4]
# 最新公司全称_Lcomnm
Lconnm_list = list(data_2[:, 5][::com_num])
# len(Lconnm_list)
# 未分配利润(元)_Retear
Retear_list = data_2[:, 6]
# 息税前利润_EBIT
EBIT_list = data_3[:, 0]
# 股票市值/总负债(Ⅰ)_MarkValtotdb1
MarkValtotdb1_list = data_3[:, 1]


def Z_count(X):
    """
        功能:计算Z值并返回
    """
    # print("Z_X:", X)
    Z = 0.065 * X[0] + 0.326 * X[1] + 0.01 * X[2] + 0.067 * X[3]
    return Z



def X_count(i):
    """
        功能:计算x1~x5的值
        Z=0.065×Xl+0.326×X2+0.01×X3+0.067×X4
        其中:X1= (营运资产 / 总资产)×100
        X2= 留存收益 / 总资产 = (盈余公积 + 未分配利润)/总资产×100
        X3=税息前利润 / 总资产×100
        X4= 资本市值 / 总负债×100
    """
    x1 = (Retear_list[i] - SD_list[i]) / Totass_list[i] * 100
    x2 = (EBIT_list[i] + Surres_list[i]) / Totass_list[i] * 100
    x3 = EBIT_list[i] / Totass_list[i] * 100
    x4 = MarkValtotdb1_list[i] * 100
    # print("[x1, x2, x3, x4", [x1, x2, x3, x4])
    return [x1, x2, x3, x4]


def main():
    """
        主函数
    """
    Company_name = Lconnm_list

    Z_list = []
    number = 0

    for i in range(int(data_1.shape[0])):
        X = X_count(i)
        Z = Z_count(X)

        Z_list.append(Z)
        Z_list_length = len(Z_list)

        # print("Z_list_length = {}".format(Z_list_length))
        # print("i = {}".format(i))

        # print("Z_list = {}".format(Z_list[i - 2: i]))
        #

        # 绘制每一个公司的16-18年的条形图
        if Z_list_length % com_num == 0 and Z_list_length != 0:
            # print("Z_list", Z_list)
            plt_tle = Company_name[number] + "16年到18年Z值统计"
            height_list = Z_list[i - 2: i + 1]
            # 绘制条形图
            rects1 = plt.bar(x=range(1, 6, 2), height=height_list, width=1, alpha=0.8, color='red')
            # plt.ylim(0, 1)  # y轴取值范围
            # 设置x轴坐标点显示
            tick_labels = ["2016", "2017", "2018"]
            # tick_labels = ["2016", "2017"]
            tick_pos = np.arange(1, 7, 2)
            plt.xticks(tick_pos, tick_labels)
            plt.title(plt_tle, size=16)
            plt.xlabel("年份", size=10)
            plt.ylabel("Z值", size=10)
            # plt.legend()     # 设置题注

            for a, b in zip(tick_pos, height_list):
                plt.text(a, b + 0.002, '%.4f' % b, ha='center', va='bottom', fontsize=10)

            plt.show()
            # Z列表初始化
            # Z_list = []
            number += 1

    print("Z_list = {}".format(Z_list))
    predict_list = []
    error_num = 0
    correct_num = 0
    for i in range(len(Z_list)):
        if Z_list[i] >= 1.23:
            predict_list.append("Norm")
        elif Z_list[i] < 1.23:
            predict_list.append("ST")
        else:
            # 当有缺失值无法判断时设置为正常状态
            predict_list.append("Norm")

    # 给标签是*ST的公司转换为ST方便判断
    for i in range(len(State_list)):
        if State_list[i] == "*ST":
            State_list[i] = "ST"

    # print("State_list = {}".format(State_list))
    for i in range(len(predict_list)):
        if predict_list[i] == State_list[i]:
            correct_num += 1
        else:
            error_num += 1

    print("准确率 = {}%".format(correct_num / (correct_num + error_num) * 100))

    # 绘制条形图
    print("predict_list = {}".format(predict_list))
    plt_tle = "预测结果"
    height_list = [correct_num, error_num]
    rects1 = plt.bar(x=range(0, 3, 2), height=height_list, width=1, alpha=0.8, color='red')
    # plt.ylim(0, 1)  # y轴取值范围
    # 设置x轴坐标点显示
    tick_labels = ["correct_num", "error_num"]
    tick_pos = np.arange(0, 3, 2)
    plt.xticks(tick_pos, tick_labels)
    plt.title(plt_tle, size=16)
    plt.xlabel("结果", size=10)
    plt.ylabel("计数", size=10)
    # plt.legend()     # 设置题注

    for a, b in zip(tick_pos, height_list):  # 设置题注
        plt.text(a, b + 0.02, '%.4f' % b, ha='center', va='bottom', fontsize=10)

    plt.show()


if __name__ == '__main__':
    # 执行主函数
    main()

分析一下结果,餐饮、水利和交通行业预测结果如下图:

PS:图的左边条为预测和实际相符的公司数量,右边为不符合的公司数量

图 3.2.1 餐饮条形结果图
图 3.2.2 水利条形结果图
图 3.2.3 交通条形结果图

可以看到,模型对餐饮水利交通行业的上市公司预测正确率为:85%、94%和99%。
但是对ST状态公司预测时,有一半的ST公司被模型判断成正常公司,即当公司为ST时,这时候无法准确判断该公司是否为ST。因此判断本模型只能进行一些初步的预测上市公司的财务情况,当Z值很大时可以判断为良好,但是如果Z值仅为临界值的3-4倍时,可能还需要进一步的观察和实验。

4. 总结

4.1 Z评分模型的优势

Z评分模型是一个为以会计资料为基础的多变量信用评分模型。
(1)由Z评分模型所计算出的z值可以较为明确地反映借款人(企业)在一定时期内的信用状况(违约或不违约、破产或不破产),因此,他可以作为借款人经营前景好坏的早期预警系统
(2)由于Z评分模型具有较强的操作性、适用性以及较强的预测能力,它们一经推出便在许多国家和地区得到推广和使用并取得了显著效果,成为当代预测企业违约或破产的核心分析方法之一。

4.2 Z评分模型的不足

Z评分模型的优势在于它的便捷性,只要通过财务数据的分析就可以得到该公司的风险状况。但是该模型却忽略了对市场数据因素的分析,造成了该模型在多个方面存在不足:
(1)首先,由于该模型缺少对市场数据的分析使该模型的预测结果存在滞后性,不能及时反映评价公司的信用变化。
(2)其次,该模型仅考虑了两个比较极端的情况(违约与不违约),而对于负债重整或是虽然发生违约但是回收率很高的情况就没有做另外较详细的分类。
(3)其次,该模型的理论基础不强,比如为什么这几个财变量值得考虑而另外一些因素则不值得考虑。虽然该模型在实证上得到了一定的支持,但是并不能在理论上给出合理的解释。
(4)再次,权数显然不是固定的,必须经常调整。就算调整,那又该多长时间调整,调整的频率如何确定这些问题模型本身无法给出合理的答案。同时这种调整需要较大的数据库作为支撑,而这又是一件很费时效的工作。
(5)最后,该模型没有考虑系统性风险的影响,该模型根本无法预测像2008年的金融危机这样的系统风险,而这种危机显然会对企业的违约率造成不同程度的影响。

总的来说,该模型简单易操作,但相关变量需要及时调整。因此该模型适合早期使用,当需要具体违约概率时需要其他更好的模型,比如KMV模型等等。

4.3 Z评分模型与KMV模型的优劣分析

Z评分模型是一个相对简单而有效的风险管理工具,能够粗略地估计出公司的经营状况,但是无法达到很精确的程度。而KMV模型具有较好的应用前景,能够满足我国风险量化管理的要求,但是就目前我国信用风险KMV与Z评分模型在我国信用风险管理中的应用市场的现状来看,该模型还无法取得大规模的应用。KMV模型若要在我国取得更广泛更深远的应用,还需要对模型本身做进一步的改进,同时也需要我国金融市场的进一步发展。

本文章的数据、代码和参考文章码云地址:https://gitee.com/hwang_zc/zscore_model

参考文献:KMV与Z评分模型在我国信用风险管理中的应用——基于我国一般上市公司的实证比较;刘义超

你可能感兴趣的:(Z计分模型2)