用 Python 读取巴菲特最近的持仓数据

各位同学早上好,我是 Lemonbit ,最近关注巴菲特的同学比较多,结合2020年巴菲特致股东信,我也去了解了下伯克希尔最近的持仓情况 。

—  01 

数据表格情况

持仓情况的披露文件发布在美国证监会网站上,在美国, 13F 文件是机构公布季度持仓时需要披露的文件。这个文件可能跟国内的有点不一样,我们一起来看看吧。


在官方网站上,是以网页格式进行披露的(html和xml),点击上图中红色箭头所指的 “html” 文件后,在会在网页格式中打开持仓情况。如下:

从上面的表格中,可以清晰的看出伯克希尔的持仓情况。如果我们想对伯克希尔的持仓情况进行分析,则可以将数据保存到本地,然后进行分析,尤其是涉及多份数据进行对比和分析的时候,对这些数据的读取和梳理就有必要了。

—  02 

数据读取与保存

下面我们来看看如何用 Python 进行读取。首先,我们将下面红色箭头所指的 “xml” 文件下载到本地,名称为 “test.xml” 。


初步观察网页格式上的数据,可以看出,这个数据表格是一个嵌套型的表格,我们在数据分析的时候,最好进行转化为 二维的 dataframe 。


本来我是想用 Pandas 直接进行数据读取的,后来发现是 嵌套表格之后,有点麻烦。于是改用 BeautifulSoup 来读取,可以将嵌套的数据也单独提取出来,方便后续分析。用 BeautifulSoup 进行解析的时候,思路其实比较简单:

  1. 读取 XML 文件的内容

  2. 构造一个 pandas 的 dataframe ,用来保存解析出来的数据

xml 格式内容读取

我们知道, BeautifulSoup 可以用来解析 html、xml 等网页的标记语言内容。因此,对于 XML 文件,我们可以直接进行读取。下面的代码中的 “test.xml” 文件是我们保存的本地的文件,在本文结尾处也提供了获取方式。

  1. # -*- coding: utf-8 -*-

  2. """

  3. @Author: Lemonbit

  4. @出品:Python数据之道

  5. @Homepage: liyangbit.com

  6. """


  7. from bs4 import BeautifulSoup

  8. import pandas as pd


  9. path = r'./test.xml'


  10. htmlfile = open(path, encoding='utf-8')


  11. htmlhandle = htmlfile.read()


  12. soup = BeautifulSoup(htmlhandle, 'xml')


  13. print(soup)

读取标记语言的内容后,我们再来通过 BeautifulSoup 的 find_all 和 find 功能来读取所需要的数据即可。对数据进行封装和保存的方法有多种,我们这里采取的是构造一个空的 Pandas 的 DataFrame 来进行封装,然后用 Pandas 的 to_excel 来保存文件,这种方法还是比较方便的,有兴趣的同学可以研究下。

  1. count = 0

  2. # 构造一个空的 dataframe

  3. result = pd.DataFrame({}, index=[0])


  4. # 根据持仓数据表格,添加需要保存的字段(dataframe 的 列名称)

  5. result['nameOfIssuer'] = ''

  6. result['titleOfClass'] = ''

  7. result['cusip'] = ''

  8. result['value'] = ''

  9. result['sshPrnamt'] = ''

  10. result['sshPrnamtType'] = ''

  11. result['investmentDiscretion'] = ''

  12. result['otherManager'] = ''

  13. result['votingAuthority-Sole'] = ''

  14. result['votingAuthority-Share'] = ''

  15. result['votingAuthority-None'] = ''


  16. new = result

  17. for item in soup.find_all('infoTable'):

  18.    nameOfIssuer = item.find('nameOfIssuer').get_text()

  19.    new['nameOfIssuer'] = nameOfIssuer

  20.    titleOfClass = item.find('titleOfClass').get_text()

  21.    new['titleOfClass'] = titleOfClass

  22.    cusip = item.find('cusip').get_text()

  23.    new['cusip'] = cusip

  24.    value = item.find('value').get_text()

  25.    new['value'] = value

  26.    sshPrnamt = item.find('shrsOrPrnAmt').find('sshPrnamt').get_text()

  27.    new['sshPrnamt'] = sshPrnamt

  28.    sshPrnamtType = item.find('shrsOrPrnAmt').find('sshPrnamtType').get_text()

  29.    new['sshPrnamtType'] = sshPrnamtType

  30.    investmentDiscretion = item.find('investmentDiscretion').get_text()

  31.    new['investmentDiscretion'] = investmentDiscretion

  32.    otherManager = item.find('otherManager').get_text()

  33.    new['otherManager'] = otherManager

  34.    Sole = item.find('votingAuthority').find('Sole').get_text()

  35.    new['votingAuthority-Sole'] = Sole

  36.    Shared = item.find('votingAuthority').find('Shared').get_text()

  37.    new['votingAuthority-Share'] = Shared

  38.    Non = item.find('votingAuthority').find('None').get_text()

  39.    new['votingAuthority-None'] = Non


  40.    count += 1

  41.    result = result.append(new, ignore_index=True)


  42. print(count)


  43. print(result)


  44. # 保存数据到 Excel 表格

  45. result.to_excel('BRKA-2019-Q4.xlsx')

如果后续需要对数据进行分析和可视化,可以借助 Pandas、Matplotlib、Plotly 等 Python 库来处理。当然,如果你只是想看看或分析这一份文件,也可以直接从网页上复制内容到 Excel 表格中即可,获取数据的方法有多种,选择适合自己的就好哈。最后,为方便大家进行操作,Lemonbit 给大家提供了 源代码和数据文件,可以在公众号「Python数据之道」后台回复数字 「690」进行获取。



-------------------End-------------------


©著作权归作者所有:来自51CTO博客作者mb5fe18e7c44408的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Python探索性数据分析,这样才容易掌握
  2. 全息金融行业数据安全解决方案
  3. 用Excel、SQL、Python做数据分析有何不同?
  4. 如何正确的获取数据?
  5. 数据分析和数据科学的四个时代
  6. 用Python分析5187位CSDN博主数据,顺便把昨天扒掉的裤子穿上
  7. 2019年1-5月文章汇总 | Python数据之道
  8. 用 Python 分析了 20 万场吃鸡数据
  9. 谁为你的健康数据负责?

随机推荐

  1. 世界上有哪些代码量很少,但很牛逼很经典的
  2. LeetCode 题解 | 406 号问题:根据身高重建
  3. 【最新】iPhone X 交互设计官方指南
  4. 如何利用寒假的时间来准备 2020 年的蓝桥
  5. 五分钟学算法:什么是线段树?
  6. Pyecharts 组合图形绘制实践
  7. LeetCode 图解 | 232.使用栈实现队列
  8. 「 LeetCodeAnimation 」动画是如何做出
  9. LeetCode 图解 | 237.删除链表中的节点
  10. 一个我超喜欢的动态博客系统,五分钟即可部