文本即数据,如何用 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)。
两种主流方法
| 词典法 | ||
| 机器学习法 |
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 两阶段? 建议:加入公司固定效应、年份固定效应,或使用滞后变量
? 总结
今天我们一起探索了文本分析方法:
? 核心要点:
公开文本是免费的宝藏,藏着数字无法表达的信息 情感分析测度"情绪",主题建模发现"话题" Python + Stata 可以实现完整流程 注意词典选择、上下文理解和内生性问题
? 推荐阅读:
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)在文本分析中的新应用 结合传统计量方法,讲好"文本+数字"的故事
? 互动话题:你的研究领域适合用文本数据吗?欢迎在评论区分享你的想法!
丘知数据分析 | 专注分享经管领域实证研究方法,让数据分析更简单可靠!您的点赞、分享、在看,就是我们创作的动力!


