文献

Cohen, L., Malloy, C. and Nguyen, Q., 2020. Lazy prices. The Journal of Finance, 75(3), pp.1371-1415.


摘要

使用1995年-2014年所有美国公司季度和年度申报的完整历史记录,研究发现当公司对报告进行积极更改时,这种行为蕴含着公司未来运营的重要信号

财务报告的语言和结构的变化也对公司的未来收益产生重大影响:做空"变化"的公司(持有的公司,如果其报告发生变化的,做空该公司股票),买入“不变化”的公司,使用这样的投资组合策略,在2006年的每月alpha值高达1.88%的收益(每年超过22%)。报告中涉及执行官(CEO和CFO)团队的话语风格的变化,或者有关诉讼(风险部分)的话语的变化,都对投资的未来收益有重要作用。

研究发现,对10-K的变化可以预测未来的收益、获利能力、未来的新闻公告,甚至未来的公司破产。同时,不做任何变化的公司将获得显著的异常收益。与资产价格典型的反应不足研究不同,我们发现没有任何与这些变化相关的公告效应–仅在后来通过新闻,事件或收益披露信息时才产生回报–暗示投资者并未注意到整个公众领域的这些变化。


研究背景

之前的研究认为,尽管投资者一次对包含重大变化的财务报表的发布作出了迅时反应,但随着时间的流逝,这种公告作用是会减弱的(Brown and Tucker, 2011 and Feldman et al., 2010)。这表示10-K报告会随着时间推移,信息价值大打折扣。尽管我们复现了这个事实,即与常规文件的变更没有重大的公告效应,但我们认为,前人的研究忽略了更重要部分(如MD&A)对对资产价格的影响。

确切的说,并不是报告的披露效应的信息价值变低了,而是投资者越来越难以发现报告中微妙的信息变化, 比如因为报告变得越来越冗杂。投资者只有看到某些新闻后,才会逐渐意识到之前公司报告内容变化的的真正价值

例如Baxter公司

  • 纽约时报在 2010年4月23日 发了一条FDA将有对输液泵(infusion pumps)更严格对审批管理规定的新闻,新闻中提到了Baxter公司。新闻公布当天,Baxter股价大跌
  • 10天后的(2010年5月4日),Baxter宣布召回问题的输液泵产品,股价当天再次大跌。

两次负面新闻导致Baxter股价大跌超过20%,最有意思的是Baxter公司一个多月前(2010年2月23日)10-k报告中 提到 了与这两条新闻类似的 线索

截图中写着 Baxter的产品COLLEGUE未来可能面脸额外的处罚,而且相关销售面临着FDA、OIG、DOI和FTC越来越严格的审批,面临的执法强度也越来越大

因纽约时报发布的消息,股价大跌。但是大跌之前Baxter的10-k报告中似乎提示未来公司可能面临的风险,但是投资者怎么没有注意到这个重要线索呢?


数据获取与分析方法

这篇文章用到了很多 文本数据挖掘 方法,如

  • 数据采集(报告下载和信息监测)
  • 正则表达式(数据分割与抽取)
  • 文本相似度(计算报告变化程度)

我大致说下这几部分技术在这篇论文中的应用。

1. 数据采集

这篇论文研究者认为,只有投资者意识到本期报告和上一期报告做对比,才能发现报告变化,进而对股价有影响。所以当有新公告公布后,投资者是否下载本期报告的同时顺带着下载上一期报告,下载量又是多少。

下载量可以从Freedom of Information Act下载,

可以拿到的信息包括:

  • 报告文件
  • 报告下载时间
  • 报告下载的IP地址(可以通过这个ip来当作投资者的id)

2. 正则表达式

一个公司报告文件会有不同部分,我们需要将不同的部分分别识别出来。这里用到正则表达式,可以进行快速的数据清洗和数据抽取。


3. 文本相似度

文本转为向量后就可以进行相似度计算,

这里使用我开发的cntext包,可以实现cosine和jaccard相似度的计算。

import cntext as ct

A = 'We expect demand to increase.'
B = 'We expect worldwide demand to increase.'
C = 'We expect weakness in sales'

print(ct.cosine_sim(A, C))
print(ct.jaccard_sim(A, B))

Run

0.40
0.83

如果对Baxter公司多个年度对报告进行相似度计算,绘制成图就会发现2010年与前后变化很大。相似度越低,说明公司报告前后变化很大,应该引起投资者注意,如果能注意到就会避免纽约时报导致到股价暴跌。如下图



案例实现

由于没有完全一样的数据,这里使用政府工作报告数据类比,使用cosine相似度画出趋势线条。

使用相似性识别变化的时间点

准备数据

政府工作报告 http://www.gov.cn/guowuyuan/zfgzbg.htm

prc_reports.xlsx 链接:https://pan.baidu.com/s/1sVU3mkEcP7Z3_hbG5AVNUA 密码:zjrq

将下载好后的 prc_reports.xlsx 文件放置于 .ipynb文件 所在的文件夹内。

import pandas as pd

df = pd.read_excel('prc_reports.xlsx')
df.dropna(inplace=True)
df.head(10)

Run

计算相似度

运行时间大概30s, 运算结果是列表数据 cosines

import cntext as ct

cosines = []
#row  Series
for idx, row in df.iterrows():
    text1 = df.loc[idx, 'report']
    text2 = df.loc[idx, 'report2']
    simi = ct.cosine_sim(text1, text2)
    cosines.append(simi)
    
cosines

Run

[0.44', '0.39', '0.35', ... '0.62', '0.61', '0.60']

绘制柱状图

from pyecharts.charts import Bar
from pyecharts import options as opts
from pyecharts.globals import CurrentConfig, NotebookType
CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_NOTEBOOK

bar = Bar()

bar.add_xaxis(xaxis_data=[str(y) for y in df['year'].values])
bar.add_yaxis("相似度", 
               cosines, 
               label_opts=opts.LabelOpts(is_show=False))

bar.set_global_opts(title_opts=opts.TitleOpts(title="政府工作报告相似度可视化"))
bar.load_javascript()

bar.render('政府工作报告相似度可视化1.html')
bar.render_notebook()

Run

解读

从图中可以看到除1959年异常外,其他方面能挖掘出很多信息。从相似度整体趋势,

1959-1992 第一阶段, 1992-至今 第二阶段

1992年附近,第一次确立社会主义市场经济制度。之后的岁月里一直围绕着经济建设高速发展。

同时也可以看出在第一阶段前期相似度异常的低,可以理解为新中国初建,百废待兴,对于建设者而言,组着和管理这个国家的政府也在学习如何建设新中国。而90年代后,相似度越来越高,体现了政府越来越熟悉如何治理国家,如何搞经济建设。



广而告之