推广 热搜: 采购方式  滤芯  带式称重给煤机  甲带  气动隔膜泵  减速机型号  无级变速机  链式给煤机  履带  减速机 

文本即数据,如何用 NLP 分析财报文本?

   日期:2026-03-21 18:16:39     来源:网络整理    作者:本站编辑    评论:0    
文本即数据,如何用 NLP 分析财报文本?

文本即数据,如何用 NLP 分析财报文本?

想象一下这个场景:2024年某上市公司发布财报后,股价第二天暴涨15%。财报里的净利润增长只有5%,但市场反应却如此剧烈——那些数字之外的文字,到底藏着什么信号?

在日新月异的经管领域实证研究中,传统财务指标可能已经“不够用了”。当所有投资者都能轻松获取 ROE、毛利率、现金流这些数据时,真正的"增量信息"可能就藏在文本里。

今天,和大家聊聊一个当下炙手可热的数据分析方法:文本分析法(Text as Data)

?关注「丘知数据分析」

我们会定期与大家分享高质量社科数据集

和有趣的数据分析知识哦~

?丘知数据分析会员之家

?点击左下角阅读原文
前往丘知数据分析会员之家官网
官网每年更新推送近千个社科数据栏目?
所有数据支持「单独购买?
开通会员则可享受免费下载次数?
欢迎老师同学们浏览订阅!
如果您有定制需求也可以联系我们!


? 为什么说文本是“宝藏”?

中国上市公司每年发布数万份公告:年报、季报、业绩预告、重大事项...这些都是公开的、免费获取的、高频的数据源。

但更重要的是,文本里可能藏有数字无法表达的信息

  • 管理层对未来的"信心"或"担忧"
  • 企业对特定领域风险(如AI、供应链)的暴露程度
  • 行业景气度的微妙变化

案例:Hassan 等(2025)在Journal of Economic Perspectives的最新综述显示,通过分析企业财报文本,可以窥见未来宏观经济走势、测度政策不确定性,甚至预警金融风险。


? 文本即数据的基本逻辑

简单来说,文本即数据就是把非结构化的文字转化为结构化的数值,然后像分析传统数据一样进行分析。

在经管研究中,主要有两大应用场景:

1️⃣ 情感分析Sentiment Analysis

测度文本的"情绪"——是乐观还是悲观?是自信还是焦虑?

2️⃣ 主题建模Topic Modeling

发现文本在"讨论什么"——AI?碳中和?供应链风险?


? 方法 1:情感分析

情感分析的核心是:给每句话打一个情感分数(通常是 -1 到 +1)。

两种主流方法

方法
原理
适用场景
词典法
匹配情感词典Loughran-McDonald金融情感词典
快速、可解释
机器学习法
用BERT等预训练模型理解上下文
准确、能捕捉复杂语义

Stata 实现

* 方法一:使用外部 Python 脚本处理文本后导入* 方法二:调用 sentiment 命令(需安装)* 安装情感分析工具ssc install sentiment, replace* 基本语法sentiment text_variable, generate(sentiment_score)

Python 实现(推荐)

# 安装依赖# pip install jieba snownlp transformersimport jiebafrom snownlp import SnowNLPimport pandas as pd# 读取财报文本数据df = pd.read_csv('earnings_calls.csv')# 方法 1:使用 SnowNLP(快速但简单)defget_sentiment(text):    s = SnowNLP(text)return s.sentiments  # 返回 0-1 的情感分数df['sentiment_snownlp'] = df['text'].apply(get_sentiment)# 方法 2:使用金融专用词典(更准确)# 加载 Loughran-McDonald 中文情感词典positive_words = set(open('lm_positive_cn.txt').read().split())negative_words = set(open('lm_negative_cn.txt').read().split())deflm_sentiment(text):    words = jieba.lcut(text)    pos_count = sum(1for w in words if w in positive_words)    neg_count = sum(1for w in words if w in negative_words)    total = pos_count + neg_countif total == 0:return0return (pos_count - neg_count) / totaldf['sentiment_lm'] = df['text'].apply(lm_sentiment)print(df[['company''date''sentiment_lm']].head())

? 方法 2:主题建模

情感分析告诉我们文本的"情绪如何",LDA主题建模告诉我们文本"在说什么"。

LDA 模型的直觉

想象你有一堆企业财报,每份财报都在讨论多个话题。LDA模型试图回答:

  • 这份财报里,多大比例在讨论"AI"?多大比例在讨论"供应链"?
  • 这些话题的比例随时间如何变化?

Python 实现

# 安装依赖# pip install gensim pyLDAvisimport gensimfrom gensim import corporaimport pyLDAvis.gensim_models# 文本预处理defpreprocess(text):# 分词、去停用词    words = jieba.lcut(text)    stopwords = set(open('stopwords_cn.txt').read().split())return [w for w in words if w notin stopwords and len(w) > 1]# 准备数据processed_docs = df['text'].apply(preprocess).tolist()# 创建词典和语料库dictionary = corpora.Dictionary(processed_docs)corpus = [dictionary.doc2bow(doc) for doc in processed_docs]# 训练 LDA 模型(假设有 5 个主题)lda_model = gensim.models.LdaMulticore(    corpus=corpus,    id2word=dictionary,    num_topics=5,    passes=10,    workers=3)# 查看主题for idx, topic in lda_model.print_topics(-1):    print(f"主题 {idx}{topic}")# 可视化vis = pyLDAvis.gensim_models.prepare(lda_model, corpus, dictionary)pyLDAvis.save_html(vis, 'lda_visualization.html')

? 实战案例:用财报电话会议预测股价波动

让我们把方法结合起来,做一个完整的实证研究。

研究设计

研究问题:财报电话会议的情感指数能否预测次日股价收益率?

数据准备

  • 文本数据:上市公司财报电话会议文本
  • 股价数据:采用上市公司数据库数据
  • 控制变量:常用指标(SIZE、ROE、营收增长率等)

模型设定

Return_t+1=β₀+β₁×Sentiment_t+β₂×Controls_t+ε

示例代码

import pandas as pdimport numpy as npfrom scipy import statsimport statsmodels.api as sm# 1. 数据准备# 假设 df 包含:company, date, text, return_next_day, roe, revenue_growth# 2. 计算情感指数df['sentiment'] = df['text'].apply(lm_sentiment)# 3. 描述性统计print(df['sentiment'].describe())print(f"情感与次日收益相关系数: {df['sentiment'].corr(df['return_next_day']):.4f}")# 4. 回归分析X = df[['sentiment''roe''revenue_growth']]X = sm.add_constant(X)  # 添加常数项y = df['return_next_day']model = sm.OLS(y, X).fit()print(model.summary())

Stata 实现

* 假设数据已导入,变量:sentiment, return_next_day, roe, revenue_growth* 描述性统计sum sentiment return_next_day, detailpwcorr sentiment return_next_day, sig* 基准回归reg return_next_day sentiment roe revenue_growth, robust* 加入固定效应xtset company datextreg return_next_day sentiment roe revenue_growth i.year, fe robust* 结果输出esttab using "results.rtf", replace ///    star(* 0.1 ** 0.05 *** 0.01) ///    b(%9.3f) se(%9.3f) ///    r2 ar2 N

⚠️ 3 个常见误区

误区 1:词典选择不当

❌ 错误:使用通用情感词典分析金融文本✅ 正确:使用 Loughran-McDonald 等金融专用词典原因:"风险"在通用语境中是负面的,但在金融语境中可能是中性甚至正面的(如风险管控)

误区 2:忽视上下文

❌ 错误:简单统计关键词出现次数✅ 正确:考虑否定词、程度副词的影响例子:"业绩理想" vs "业绩非常理想"

误区 3:内生性问题

❌ 错误:直接回归,不考虑样本选择偏差✅ 正确:好公司才愿意披露更多信息,需要工具变量或 Heckman 两阶段建议:加入公司固定效应、年份固定效应,或使用滞后变量


? 总结

今天我们一起探索了文本分析方法:

核心要点

  1. 公开文本是免费的宝藏,藏着数字无法表达的信息
  2. 情感分析测度"情绪",主题建模发现"话题"
  3. Python + Stata 可以实现完整流程
  4. 注意词典选择、上下文理解和内生性问题

推荐阅读

  • Hassan, T. A., et al. (2025). "Text as Data in Economic Analysis." Journal of Economic Perspectives.
  • Loughran, T., & McDonald, B. (2011). "When is a Liability not a Liability?" Journal of Finance.

下一步

  • 尝试用文本数据做你研究领域的探索
  • 关注大语言模型(LLM)在文本分析中的新应用
  • 结合传统计量方法,讲好"文本+数字"的故事

互动话题:你的研究领域适合用文本数据吗?欢迎在评论区分享你的想法!

丘知数据分析 | 专注分享经管领域实证研究方法,让数据分析更简单可靠!您的点赞、分享、在看,就是我们创作的动力!

?丘知数据分析会员之家

?点击左下角「阅读原文
前往丘知数据分析会员之家官网
官网每年更新推送近千个社科数据栏目?
所有数据支持「单独购买」?
开通会员则可享受免费下载次数?
欢迎老师同学们浏览订阅!
如果您有定制需求也可以联系我们!

 
打赏
 
更多>同类资讯
0相关评论

推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  皖ICP备20008326号-18
Powered By DESTOON