前言

本文是刊载于《中国工业经济》2017年第12期《管理层讨论与分析披露的信息含量与股价崩盘——基于文本向量化方法的研究》关于文本分析构建变量的阅读笔记。原文借鉴Hanley and Hoberg (2010)的研究思路,基于文本向量化的信息构建回归模型测量文本的MD&A信息含量。本笔记主要记录指标构建思路,并且运用Python和Stata进行粗略复刻。

信息含量的定义

上市公司的MD&A不仅包括公司经营状况等历史信息,也包括与其他公司相似的信息,如外部环境、市场格局、风险因素等内容。一方面,所有上市公司都处于相同的宏观经济环境、风险因素和政治、政策背景之下;另一方面,同一行业的上市公司面临着相似的产业政策、竞争环境和市场特征。因此,上市公司的MD&A不可避免地在某种程度上与同行业其他上市公司以及市场其他行业上市公司存在一定相似性,甚至可能有直接参考其他公司MD&A的表述。

可以将与行业其他公司或其他行业的公司重复或相似的信息定义为不具有信息含量的内容,同时将不同的信息定义为真正具有信息含量的内容,简称为信息含量

如何定义重复或相似信息?

上市公司MD&A的用词种类以及频率与行业其他公司或其他行业的公司在多大程度重合。

指标构建过程

  1. 剔除金融行业、ST和*ST类企业,以及上市时间不足一年的企业

  2. 从年报中提取MD&A文本内容

  3. 分词处理,语料清洗

  4. 文本向量化

  5. 向量标准化

  6. 构建回归模型

复刻过程

数据准备
# 读取MD&A内容
mda = pd.read_excel('管理层讨论与分析.xls', sheet_name = 0)
# 读取行业数据
industry = pd.read_excel('证监会2012年版行业分类.xlsx',sheet_name = 0)
# 与行业数据进行合并
data = pd.merge(mda, industry,on=['股票代码','会计年度'], how = 'inner')
# 仅作剔除金融行业处理
data = data[~data["industrycode2"].str.contains("J")]
# 仅处理2019年的文本
data = data[data["会计年度"] == 2019]
# 重置索引
data.reset_index(drop=True)

设定分词及清理停用词函数
import jieba
import restoplist = [i.strip() for i in open('停用词.txt', encoding = 'utf-8').readlines()]
def m_cut(intxt):word = [w for w in jieba.cut(intxt) if w not in stoplist and len(w) > 1 and not re.match('^[a-z|A-Z|0-9|.]*$',w)]strword = " ".join(word)return strword
MD&A分词处理
data['cut'] = data['经营讨论与分析内容'].apply(m_cut)
文本向量化

词袋模型:将所有文档的词条生成语料库,对每个词条进行编号,统计每份MD&A出现的词频,生成每份MD&A的词频矩阵,格式类似于[0, 1, 4, 0, 3,…0, 5],表示对于公司iii的MD&A文本中,编号为1的词出现0次,编号为2的词出现1次,以此类推。

from sklearn.feature_extraction.text import CountVectorizer
# 在50份以上以及在1000份MD&A出现term的才保留,看实际情况处理
countvec = CountVectorizer(min_df = 50, max_df = 1000)
# 生成稀疏bow矩阵
res = countvec.fit_transform(data.cut)
# 生成标准文档词条矩阵
doc_term_matrix = res.toarray()
向量标准化

为了避免文本长度不同导致词频结果不可比问题,需要对以上向量进行标准化处理,即向该向量除以该文本中词条的总数。

import numpy as np
def normalizer(vec):denom = np.sum(vec)return [el / denom for el in vec]
doc_term_matrix_normalizer = []
for vec in doc_term_matrix:doc_term_matrix_normalizer.append(normalizer(vec))

宽数据转换为长数据,并计算行业标准化向量和市场标准化向量

以上的得到的结果为宽数据,但是我们回归的数据格式为长数据,需要进行转换。

公司iii的MD&A标准化向量NormiNorm_iNormi​

行业标准化向量NormINorm_INormI​:将公司i所在行业除之该公司之外其他所有公司的标准化向量的算术平均得到的向量

市场标准化向量NormMNorm_MNormM​:将公司i所在行业之外其他行业所有公司的标准化向量的算术平均得到的向量

for index in range(0,3568): # 2019年公司数量df_code = df[index:index+1]df_code = df_code.melt(id_vars=['code','year','ind'],    # 要保留的字段var_name="wordid",   # 拉长的分类变量value_name="freq")   # 拉长的度量值名称
# 计算行业标准化向量dct_ind = dict(df[df["ind"] == df.iloc[index]["ind"]][df["code"] != df.iloc[index]["code"]].iloc[:,0:7308].mean(axis=0))lt_ind = [dct_ind]df_ind = pd.DataFrame(lt_ind)df_ind = df_ind.melt(var_name="wordid", value_name="freq_ind")
# 计算市场标准化向量    dct_market_ind = dict(df[df["ind"] != df.iloc[index]["ind"] ].iloc[:,0:7308].mean(axis=0))lt_market_ind = [dct_market_ind]df_market_ind = pd.DataFrame(lt_market_ind)df_market_ind = df_market_ind.melt(var_name="wordid",value_name="freq_market_ind")
# 合并数据df_code["freq_ind"] = list(df_ind["freq_ind"])df_code["freq_market_ind"] = list(df_market_ind["freq_market_ind"])
# 保存每家公司的词条文件    df_code.to_excel("F:/Rawdata/管理层讨论与分析/文档词条矩阵/{}词条.xls".format(df.iloc[index]["code"]),index=None)

构建回归模型

Normi=α0+α1×NormI+α2×NormM+εiNorm_i=\alpha_0+\alpha_1\times Norm_I+\alpha_2\times Norm_M+ \varepsilon_iNormi​=α0​+α1​×NormI​+α2​×NormM​+εi​

其中,α1\alpha_1α1​代表公司iii的MD&A信息中能够被同行业其他公司所解释的部分,α2\alpha_2α2​代表公司iii的MD&A信息中能够被市场其他行业公司所解释的部分,残差εi\varepsilon_iεi​为行业和市场信息所不能解释的部分。将残差向量各维度绝对值之和定义为信息含量(InfoInfoInfo)。

小结

从回归结果可以看出,行业和市场信息较好地解释了公司MD&A的信息,说明在一定程度上公司的部分文本内容与行业和市场重合了,而残差部分可能包含的未重合的信息含量,因此可以使用残差度量公司MD&A的信息含量。需要指出的是,本文在语料的细节处理上略显粗糙,详细的信息需要进一步复核分析。此外,由于目前笔者知识限制,以上的处理过程可能存在一些问题或者有更简便的方法,欢迎读者指出阅读过程中发现的问题,分享建议!

以上是笔者的第一篇推送文章。作为经管在读研究生兴趣驱动,未来会不定期推送经管相关Python和Stata数据分析和文本挖掘学习内容和笔记。在学习中实践,自娱自乐!

参考文献

[1]孟庆斌,杨俊华,鲁冰.管理层讨论与分析披露的信息含量与股价崩盘风险——基于文本向量化方法的研究[J]. 中国工业经济, 2017(12): 132-150.

[2]Hanley, K. W., and G. Hoberg. The Information Content of IPO Prospectuses[J]. Review of Financial Studies, 2010, 23(7): 2821-2864.

经管文本分析 | 基于年报文本构建管理层讨论与分析披露的信息含量相关推荐

  1. [数据集] CNRDS上市公司管理层讨论与分析数据(1999-2020年)

    [数据集] 上市公司管理层讨论与分析数据(1999-2020年) 数据描述: 数据包括股票代码.公司简称.会计年度.经营分析时间.经营讨论与分析内容.正面词汇数量.负面词汇数量.句子数量.文字数量.净 ...

  2. 大学计算机基础 试卷分析,基于SPSS大学计算机基础考试试卷分析.doc

    基于SPSS大学计算机基础考试试卷分析 基于SPSS大学计算机基础考试试卷分析 摘要:试卷分析包括成绩分析和试卷质量分析两部分.该文以西南林学院2007-2008级的消防工程专业的大学计算机基础考试为 ...

  3. 上市公司年报可读性:财务报告可读性管理层讨论与分析可读性(2001-2021年)

    数据来源:自主整理 时间跨度:2001-2021年 区域范围:沪深A股 指标说明: 可读性是文本分析的重要维度.上市公司的年报文本可读性,既可以直接作为解释变量,来分析一系列企业行为,如李春涛老师发表 ...

  4. 基于MATLAB的声信号的采集与分析,基于Matlab的声音信号采集与分析处理

    2005年第6期 文章编号:100622475(2005)0620091202 计算机与现代化 JISUANJI YU XIANDAIHUA 总第118期 基于Matlab的声音信号采集与分析处理 陈 ...

  5. 网页设计css分析,基于CSS技术的网页制作实例分析

    21世纪我国科学技术水平大幅提高,计算机网络技术成为了推动各行各业事业发展的助推器,可以利用计算机网络快速发布和获取信息,同样在人们的政治生活.经济生活等多个方面发挥着无可比拟的作用.网页设计与计算机 ...

  6. 文本分析 | 管理层讨论信息含量原理与代码实现

    前言 受读者建议,再次详细论述我们写的第一篇推文,讲讲管理层讨论信息含量这个指标如何构建.本文的主要内容分为管理层讨论信息含量的定义.计算原理.python和stata实现以及计量拓展 定义 参考孟庆 ...

  7. 基于ArcGIS模型构建器在第三次全国国土调查数据处理中的应用方法总结

    摘要:本文针对第三次全国国土调查中存在的数据处理,基于ArcGIS模型构建器对其进行耕地二级类变化.新增耕地.种植属性.石漠化标注以及入库前的数据进行不一致检查,本文对实现这几项数据处理功能进行方法探 ...

  8. R语言构建文本分类模型:文本数据预处理、构建词袋模型(bag of words)、构建xgboost文本分类模型、基于自定义函数构建xgboost文本分类模型

    R语言构建文本分类模型:文本数据预处理.构建词袋模型(bag of words).构建xgboost文本分类模型.基于自定义函数构建xgboost文本分类模型 目录

  9. R语言构建文本分类模型并使用LIME进行模型解释实战:文本数据预处理、构建词袋模型、构建xgboost文本分类模型、基于文本训练数据以及模型构建LIME解释器解释多个测试语料的预测结果并可视化

    R语言构建文本分类模型并使用LIME进行模型解释实战:文本数据预处理.构建词袋模型.构建xgboost文本分类模型.基于文本训练数据以及模型构建LIME解释器解释多个测试语料的预测结果并可视化 目录

  10. NLP之TEA:基于SnowNLP实现自然语言处理之对输入文本进行情感分析(分词→词性标注→拼音简繁转换→情感分析→测试)

    NLP之TEA:基于SnowNLP实现自然语言处理之对输入文本进行情感分析(分词→词性标注→拼音&简繁转换→情感分析→测试) 目录 NLP分词 NLP词性标注 NLP情感分析-TEA NLP常 ...

最新文章

  1. Ionic实战 自动升级APP(Android版)
  2. iphone打字怎么换行_库克扎心!12年iPhone老用户换机小米10 Pro,每天玩机七八小时...
  3. 【es6】谈谈Promise
  4. 感知算法论文(七):DFANet: Deep Feature Aggregation for Real-Time Semantic Segmentation(2019)
  5. Hadoop入门(二十四)Mapreduce的求TopK程序
  6. ad10怎么挖铺的铜_黄金怎么验真假,简单易行方法多。
  7. 为什么说任何基于比较的算法将 5 个元素排序都需要 7 次?
  8. oracle mysql增量迁移_深入浅出XTTS:Oracle数据库迁移升级利器
  9. VB:设定 MsgBox 在若干时间之后若无回应则自动关闭
  10. 图像局部特征(十)--BRIEF描述子
  11. CAD文件如何转JPG图片?分享两种转换方法
  12. python自动化测试工程师面试题(转载师傅:上海悠悠)
  13. 练习1000 scanf 用法
  14. 联想H61主板BIOS刷新(启天M7100系列)
  15. macOS更新失败解决
  16. 百新谷PCB在线下单+ERP智能生产管理系统--陪跑篇
  17. Makefile编写和使用技巧
  18. unity背景设置透明,显示ios原生ui背景
  19. (转)段永平的投资思想:56 个要点
  20. 集体智慧编程——提供推荐

热门文章

  1. Unity小地图中点击角色移动功能 (附上demo)
  2. Android Bmob后端云—数据库、服务器!
  3. Android Room 数据库使用记录
  4. 计算机中如何隐私保护,隐私保护!我们的电脑该怎么设置开机密码呢?
  5. 图像算法---白平衡AWB
  6. 利用Python开发一个微信定时发送器
  7. LayerPagerDemo - 双层可拖拽式布局界面
  8. select后面的子查询
  9. 扰动分析 matlab,扰动材料力学有限元分析:基于MATLAB编程
  10. Handler同步屏障