查看原文
其他

金融研究 | 文本相似度计算与可视化

大邓 大邓和他的Python
2024-09-09


姜富伟,胡逸驰,黄楠.央行货币政策报告文本信息、宏观经济与股票市场[J].金融研究,2021,(06):95-113.

摘要: 本文利用金融情感词典和文本分析技术,分析中国人民银行货币政策执行报告的文本情绪、文本相似度和文本可读性等多维文本信息,刻画央行货币政策执行报告的文本特征,探究货币政策报告的文本信息与宏观经济和股票市场的关系。实证研究发现,货币政策报告的文本情绪的改善会引起显著为正的股票市场价格反应, 报告文本相似度的增加会引起股票市场波动性的显著降低, 报告可读性对公布后股票市场的波动性影响不显著。货币政策报告文本情绪还与诸多宏观经济指标显著相关。进一步研究发现,引起股票市场显著反应的是报告文本情绪中反映货币政策指引的部分,而反映宏观经济历史状态的部分对股票市场的影响不显著。本文从文本大数据分析角度证明了我国央行沟通的有效性,对国内央行沟通相关研究形成了有益补充。


文文相似度很好用,下图是该论文中绘制的2001-2018年间的货币政策报告文本相似度前后相邻两个季度的货币政策文本相似度越高,说明政策相似性高,政策连贯性强(变化小)。如果相似度较低,则政策变动的风险较大,政策连贯性差(变化大)。


复现相似度

本文只实现文本相似度的度量、文本相似度趋势的可视化。

  1. 准备数据
  2. 计算相似度
  3. 可视化

1. 准备数据

首先先手动从 中国人民银行 下载货币政策报告。


下图是我下载好的报告


之后将其整理到csv中

import os
import csv
from pdfdocx import read_pdf


with open('pbc_reports.csv''a+', encoding='utf-8', newline=''as csvf:
    #年份、季度、报告文本
    fieldnames = ['year''q''text']
    writer = csv.DictWriter(csvf, fieldnames=fieldnames)
    writer.writeheader()

    pdfs = ['data/{}'.format(f) for f in os.listdir('data')]
    for pf in pdfs:
        data = {
            'year':  pf.split('/')[-1][:4],
            'q':  pf.split('/')[-1][5],
            'text': read_pdf('data/2013-3.pdf'),
        }
        writer.writerow(data)

2. 读取数据

下载pdf时,遗漏了货币政策报告日期数据,将 pbc_reports.csv 修改为 pbc_reports.xlsx ,增加了 date 字段。

import pandas as pd
import warnings
warnings.filterwarnings('ignore')

df = pd.read_excel('pbc_reports.xlsx')
df.head()



#让每一行含有前后两个季度的报告文本
df['text2'] = df['text'].shift(1)
df = df[1:]
df.head()


3. 计算相似度

水平(行)方向,计算每一行中的 text 与 text2 两者的文本相似度。

import cntext as ct

def cosine_similarity(row):
    #row 为 pd.Series 类型数据,类似于字段
    try:
        sim = ct.cosine_sim(row['text'], row['text2'])
        return float(sim)
    except:
        #异常标记为1
        return 1

#计算结果存储到 similarity 字段中
df['similarity'] = df.apply(lambda row: cosine_similarity(row), axis=1)
df.head()



4. 绘制折线图

这里为了方便,使用 pandas_bokeh 库。注意: 绘图不限于Python,各位也可以用excel、R。

参数:

  • kind 图表类型,折线图line
  • x 横轴字段
  • y 纵轴字段
  • xlabel 横轴标签
  • ylabel 纵轴标签
  • title 图标题
import pandas_bokeh

pandas_bokeh.output_notebook()

#选择折线图line
#
df.plot_bokeh(kind = 'line',
              x = 'date',
              y = 'similarity',
              title = '2001~2022央行货币政策相似度趋势',
              xlabel = '报告发布日期',
              ylabel = '相似度')


刚刚生成的图没有经过移动平滑处理,所以锯齿比较多。论文中使用三季度移动平均线处理了 similarity ,我在此将其命名为 ma3_similarity

import pandas_bokeh

pandas_bokeh.output_notebook()

#三季度移动平均线
df['ma3_similarity'] = df['similarity'].rolling(window=3, center=True, min_periods=1).mean()

df.plot_bokeh(kind = 'line',
              x = 'date',
              y = 'ma3_similarity',
              title = '2001~2022央行货币政策相似度趋势',
              xlabel = '报告发布日期',
              ylabel = '相似度')

基本复刻论文原图相似度的变化趋势



代码下载


精选文章

管理世界 | 使用文本分析词构建并测量短视主义

管理世界 | 使用 经营讨论与分析 测量 企业数字化指标

支持开票 | Python实证指标构建与文本分析

转载 | 社会计算驱动的社会科学研究方法

推荐 | 社科(经管)文本分析快速指南

视频分享 | 文本分析在经管研究中的应用

转载 | 金融学文本大数据挖掘方法与研究进展

文本分析 | MD&A信息含量指标构建代码实现

转载 | 大数据驱动的「社会经济地位」分析研究综述

FinBERT | 金融文本BERT模型,可情感分析、识别ESG和FLS类型

JM2022综述 | 黄金领域: 为营销研究(新洞察)采集网络数据

可视化 | 绘制《三体》人物关系网络图

长期征稿 | 欢迎各位前来投稿

17G数据集 | 深交所企业社会责任报告

70G数据集 | 上市公司定期报告数据集

27G数据集 | 使用Python对27G招股说明书进行文本分析

数据集 | 585w企业工商注册信息

数据集 | 90w条中国上市公司高管数据

可视化 | 绘制《三体》人物关系网络图

MS | 使用网络算法识别创新的颠覆性与否

认知的测量 | 向量距离vs语义投影

Asent库 | 英文文本数据情感分析

PNAS | 文本网络分析&文化桥梁Python代码实现

PNAS | 使用语义距离测量一个人的创新力(发散思维)得分

tomotopy | 速度最快的LDA主题模型

100min视频 | Python文本分析与会计

安装python包出现报错:Microsoft Visual 14.0 or greater is required. 怎么办?

如何正确读入文本数据不乱码(解决文本乱码问题)

Faker库 | 生成实验数据

继续滑动看下一个
大邓和他的Python
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存