基于MySQL和Python的美股财报数据获取和交互

Brief

获取美股财报数据并导入MySQL,然后建立Python和MySQL之间的连接,最后进行数据交互。

1

因为最近开始接触美股,而财报是全面了解上市公司很好的方法,所以想先学习一下财报数据处理,方便后面进一步做分析。

为避免浪费读者的时间,先说明一下,这篇文章并不能告诉你如何进行企业基本面分析,我也不认为拿了三大报表数据简单对比一下就叫财报分析,这些我会在进一步学习后再来分享。

整个处理过程,基本思路是获取财报数据excel,把excel数据放到数据库中,然后建立Python与数据库的连接,最后掌握Python与MySQL数据交互的方法。

2

如何获取美股财报?

如果只是想浏览一下公司概况和财务数据,通过雪球、雅虎等美股板块就可以快速获取信息。如果是想获取完整的财务报告的话有2个方法:

通过美国证监会SEC的EDGAR 系统,输入公司英文名搜索,点击搜索结果就可以出来公司所有的SEC报告列表,Filing Type可以输入搜索条件,季报从6-K文件找,年报看20-F。https://www.sec.gov/edgar/searchedgar/companysearch.html

通过上市公司投资者关系(Investor Relationship)栏目找到财务信息披露并下载。像百度的话是http://ir.baidu.com/phoenix.zhtml?c=188488&p=irol-irhome

我个人的话比较喜欢直接去公司官网找,因为界面比较友好(产品经理职业病发作),像百度官网有word、excel、pdf多种格式,任君选择,而SEC貌似只能下载htm和excel。

3

下载的报告,拿资产负债表为例,原始Excel表长这样:

我们需要进行一些预处理才能符合数据库表的要求:删除空白行,转置,简化字段名,增加一个“名字+日期+货币”的数据作为唯一标识Data_id,我还根据需要增加了公司名、财报日期、货币3个字段,得到一个新表:

4

接下来就要导入数据库了。我用的数据库管理工具是MySQL wrokbench,新建一个schema并建立好balance_sheet表。

然后打开刚刚的excel表,编码方式选择utf-8,另存为csv(逗号分隔)格式,MySQL通过“Table Data Import Wizard”按键导入应该就可以了。

然而并不是

MySQL导入的时候报错:can’t analyze file……maybe the file is not csv。查了一下,可能是因为表格含中文,改了之后又报:”ascii” codec can’t encode characters in position 15-16:ordinal not in range(128)。再搜了一下,有人说直接用import record from an external file按钮可以解决,然后又报:data truncated for column at row 1。

这个时候我内心已经是崩溃的。突然,我想通了,sometimes we should know how to give up.

不用一条路走到黑的,所以我换了个方式,用python 把excel转化成csv,再导入MySQL就成功了。

import pandas as pd

# index_col指定列索引,否则系统会自动添加索引列

data = pd.read_excel('Financial_Report-baidu.xlsx','Sheet1',index_col=0)

data.to_csv('balance_sheet.csv',encoding='utf-8')

同样的方法可以在MySQL导入利润表、现金流量表等,最后不要忘记创建对应的数据字典。

5

接着是创建Python和数据库之间的连接,我们需要用到pymysql库,只要进行相关参数配置就可以了。

import pymysql

# 数据库配置信息

config = {

'host': '127.0.0.1', # 服务器地址

'port': 3306, # 端口

'user': 'root', # 用户名

'password': '123456', # 密码

'db': 'financialreport', # 数据库名

'charset': 'utf8' # 连接时的编码方式

}

# 连接数据库

# 按关键字把多余的值以字典的方式传送

conn = pymysql.connect(**config)

6

然后我们就可以通过Python直接操作数据库了。这里需要先解释一下数据库的操作方法。

创建连接后,需要创建cursor对象,并通过cursor.execute执行sql语句。cursor是一个指针对象,可以理解为Python为用户开设的一个数据缓冲区,存放最近一次execute的SQL语句的返回结果,指针指向返回数组开始的位置。

而execute方法只是获取数据库执行SQL语句后的处理结果并缓存在Python本地,并没有对数据库生效,所以还需要执行commit方法把代码提交数据库系统执行,才真正把变动应用到数据库上。

最后是关闭cursor和connection,释放内存。

举个栗子:

# 创建游标指针对象

cursor = conn.cursor()

# 执行sql语句

sql = "select Currency from balance_sheet"

cursor.execute(sql)

# 获取数据后指针由0指向1

r = cursor.fetchone()

print(r)

# 获取数据后指针由1指向3

r = cursor.fetchmany(2)

print(r)

输出是:

('CNY',)

(('CNY',), ('USD',))

再举个栗子:

# 插入数据

sql2 = "INSERT INTO balance_sheet(Data_id, Company,Date,Currency)VALUES('alibaba-2018-12-31', 'alibaba','2018-12-31','USD')"

cursor.execute(sql2)

这个时候通过MySQL workbench查看数据并没有新增,需要执行以下代码后才能从数据库里看到变动:

commit()

最后是关闭连接,释放空间。

7

至此我们就完成了Python和MySQL之间的连接和数据交互,总结一下:

经过这篇文章的学习,我深刻体会,要善待程序员同学呀,解bug真的很不容易的,特别是新手!老同志还能凭经验,我完全是靠缘分和灵感找到的解决方案嘛。

这次就分享到这里吧

喜欢山本耀司的一句话:“自己,这个东西是看不见的,撞上一些别的什么,反弹回来,才会了解,然后才知道自己是什么。”我告诉自己,keep open-minded, keep learning,或许哪一天就撞上了。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20190114G01E9400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券