前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >批量从pdf中提取基金年报观点

批量从pdf中提取基金年报观点

作者头像
量化小白
发布2023-04-03 20:32:11
4810
发布2023-04-03 20:32:11
举报

上篇,我们已经爬下来了所有的基金年报。这篇我们来说明怎么通过python批量获取全部基金经理的观点,用到的数据就是所有的基金年报,还没爬或者还不知道怎么爬的可以看看上一篇。

我这里只把所有的混合型和股票型基金的年报爬下来了,不嫌慢的话,也可以考虑把其他债券、货币、ETF等等类型的都搞下来。

代码语言:javascript
复制
# 保留股票型和混合型
allpdf['ifstock'] = allpdf.announcementTitle.map(lambda x:'股票型' in x or '混合型' in x)
allpdf1 = allpdf.loc[allpdf.ifstock].reset_index(drop = True)
getFundReportpdf(allpdf1,fpath)

爬下来大概需要一小时吧,1425份,还是挺快的。

先说下我们要干啥,免得有的童鞋云里雾里。

基金年报里有一大章是管理人报告,我们主要针对里面的两小节:管理人对报告期内基金的投资策略和业绩表现的说明、管理人对宏观经济、证券市场及走势的简要展望。

这两节里,前一节基金经理会对过去这一整年的投资逻辑和业绩情况给一个说明,分析赚钱或者赔钱的原因。后一节里投资者会对未来的市场做一个展望。有的基金经理很懒,每年都是复制粘贴上一年的话不变,有的很勤奋,洋洋洒洒写个一两页。总之关注这两节,有助于我们快速了解基金经理的投资逻辑,对基金风格有一个整体的了解。随便贴一个基金的样例。

这次我们做的事情就是把前面爬的1425份报告所有的这两小节都提出来到excel里,方便查看,毕竟只看一两份可能有偏,看得多了才能慢慢有一些自己的体会。

截止目前所有公募基金的年报都已经公布完了,感兴趣可以自己把全部的都爬下来,我这个是前两天爬的,肯定是不全的。最后整理出来到EXCEL里大概是下面这个样子,总共3列,第一列是基金名称,后面两列见下,需要EXCEL和python代码的可以在后台回复“年报观点”获取。1425份年报观点都已经整理到位。

下面来说怎么获取,简单来说,就是先读到python里,然后根据标题去切割,只保留对应部分的内容。基金年报最好的一点就是每一节标题都是一模一样一字不差的标准格式。也就不需要正则表达式之类的复杂操作。

我们需要的是4.4节管理人对报告期内基金的投资策略和业绩表现的说明下面的内容,以及4.6管理人内部有关本基金的监察稽核工作情况上面的内容。所以些代码的时候就直接判断获取到的文字里是不是包含这两部分就可以了,不包含的都踢掉。

唯一需要处理下的就是,目录里有这两段,后面正文里也有这两段,因此第一次出现的时候不要做任何处理,第二次出现的时候再操作。

用python读pdf,因为基金年报都是文本没有图片,直接用pdfplumber就可以了。这部分代码如下

代码语言:javascript
复制
res = []
for fname in tqdm(allf):

    with pdfplumber.open(fpath + fname) as pdf:
        page_count = len(pdf.pages)
        alltext = ''
        n = 0
        for page in pdf.pages:
            
            texts = page.extract_text()
            if '管理人对报告期内基金的投资策略和业绩表现的说明' in texts:
                n += 1
            if n==2:
                alltext += texts
                if '管理人内部有关本基金的监察稽核工作情况' in texts:
                    res.append([fname,alltext])
                    break
                
res = pd.DataFrame(res,columns =['fname','text'])

这部分因为要解析pdf,比较慢,用了两小时。

这部分搞完之后就已经是比较清晰的文本了。

text里是两部分文本合在一起,用函数分开就可以了。另外text里有一些特殊字符,空格之类的,一起删掉。

代码语言:javascript
复制
def getstrategy(x):
    res = re.split('管理人对报告期内基金的投资策略和业绩表现的说明|管理人对宏观经济、证券市场及行业走势的简要展望|管理人内部有关本基金的监察稽核工作情况',x)
    return res[1]

def getmacrodes(x):
    res = re.split('管理人对报告期内基金的投资策略和业绩表现的说明|管理人对宏观经济、证券市场及行业走势的简要展望|管理人内部有关本基金的监察稽核工作情况',x)
    return res[-2]

res['text'] = res.text.map(lambda x:re.sub('[\n ]','',x))

res['管理人对报告期内基金的投资策略和业绩表现的说明'] = res.text.map(getstrategy)
res['管理人对宏观经济、证券市场及行业走势的简要展望'] = res.text.map(getmacrodes)
res = res.drop(['text'],axis = 1)

这部分处理完就是我们上面看到的样子了。

直接存excel就完事。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 量化小白躺平记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档