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,或许哪一天就撞上了。
领取专属 10元无门槛券
私享最新 技术干货