Python与财务「上」——数据采集篇

内容提要

1) 获取需要下载数据的股票代码列表
2) 寻找可以下载数据的数据接口
3) 下载并保存数据

拿手机看股票和股票证券交易背景

关于使用Python分析财务报表的场景,我认为主要有:1)同业分析:批量计算、比较,也就是将同业财务指标显示或者导出;2)选股:比如筛选近三年roe大于15%的公司、最近一期所有roe大于15%的公司等。如果是针对单个公司进行分析,给大家安利一下我之前提供的《一个财务分析小工具(Excel版) - 知乎专栏》,这个工具已经将主要科目及变动,增长分析等已经涵盖了,我自己现在也在用这个工具。一般来说选对工具也可以达到事半功倍的效果。。

本文分文上下两篇,上篇主要说数据采集,下篇主要讲通过财务指标进行比较和分析

有人问为什么不直接分享代码,其实完成财务分析所需代码简单到爆,任何一个程序员写的都比我漂亮百倍(我只是网工狗里面代码写的较好的,也可能是网工狗里面财务分析较好的),但是一方面当心别有用心的人滥用接口导致接口失效,另一方面爬取别人网站的数据终归是不太好的,所以里面涉及的财务接口并不适合公开出来。基于这些考虑,我之前分享的EXCEL工具也对代码部分加了密。同样,这一篇我也不打算公开分享代码而只分享思路,如果你有心,在主要财经网站都能找的到下载接口。接口都找到了,按照本文思路,很容易获得全市场上市公司财务数据。

本文虽然简单,但还是需要一定Python基础的,如果大家对Python一无所知但又比较感兴趣的话,建议看一下我得别的文章!本文示例代码基于Python3.5,演示平台为JupyterNotebook。关于环境的搭建,Windows系统可直接安装Anconda,啥都给你安装好。至于Linux等其他系统,我就默认你为IT人士了,想来部署个开发环境应该是小菜一碟。我不准备进行详细介绍。

财务数据的采集

啰嗦完了,言归正传,网络爬虫要解决问题主要有三个:

1) 怕什么?

2) 到哪里去爬?

3) 数据清洗、储存?

一、获取所有股票代码

为了爬取所有上市公司财务数据,我们首先需要取得所有上市公司的公司代码。这个在Python里面已经有了不错的解决方法。那就是使用Tushare财经库,可以获得所有股票代码、沪深300成份股等。如果没有安装,请使用 pip install tushare安装tushare财经库。官网:http://tushare.org

1)看看是tushare是否装好:

新建一个Notebook,在一个cell中键入Python代码

import tushare as t t.__version__

输入后按SHIFT+ENTER运行,显示

这里是最新的0.8.2版。

2) 获取股票列表(在另一个cell中输入代码):

stocks_df=t.get_stock_basics()stocks_df

这两句代码的作用,一是通过tushare财经库获取所有股票列表以及基本信息,并返回一些股票基本信息,如区域、行业、总资产这些数据,返回结果是一个pandas.DataFrame表格。取决于网络环境,该代码大概耗时5-6秒时间。返回结果:

返回值有20多个字段,我们只需要其中的一部分数据,可以使用ix切片,把股票代码,名称,区域,行业切出来。(比如我们只截取 name,area,industry字段)

stock_df=stock_df.ix[:,['name','industry','area']]# ix[行条件,列条件],这里表示截取所有行,name,industry,area字段,返回一个DATAFRAMEstock_df

如果你对一些新股不敏感,可以把数据保存为csv/xls文件方便多次使用

注意:将股票列表从文件中读出来后,股票代码前的‘0’会被自动处理掉,在做循环下载数据时要将‘0’加上去。

自此股票列表就拿到了。

二、寻找合适财务数据接口

由于Python能够直接处理的文件格式为xml/csv/json/xls文件,因此我们尽量查找能够提供此类格式的文本的数据接口。

另,我比较喜欢csv格式的文本,这种文本内容紧凑,可以说一个无用字节都没有。但是取得的数据可能并非自己所需的格式,所以需要将数据转换为自己需要的内容(为了说明数据清洗及转换过程,我这里专门选择了一个xls格式的财务接口)

2.1. 查找数据接口

很多财经网站都有提供下载财务报表的接口,由于我们已经拿到了所有股票列表,将股票代码依次传入下载接口,就可以获得所有股票财务数据了,我们先来查找可用的财务数据接口。

1) 打开任意财经网站股票专栏

2) 输入任意股票代码,比如600660,进入股票详情页

3) 查找诸如财务报表财务数据财务分析之类的字样,进入细分栏目。

4) 在这个栏目应该能够找到,下载或者导出之类的功能。现在重点来了,右键点击链接,选择复制链接地址

如果,下载数据 处是一个按钮而不是链接,可以使用Chrome先把数据下载下来,然后按Ctrl+J查看下载历史,就能看到下载地址了,如果还是不行,可能就要使用抓包工具之类的方式了。

5) 分析链接地址,查看传入股票代码的位置,比如,链接地址是:http://www.stock.com/report.jsp?id=600660 那么这个600660就是传入的股票代码了。

2.2. 通过程序下载数据

拿到接口地址后,我们可以通过程序下载数据了。

import requests as ro stock_code = '600660'bs_url='http://soft-f9.eastmoney.com/soft/gp15.php?code={co}01&exp=1'.format(co=stock_code) ct = ro.get(bs_url).text ct

看到一堆乱码(其实不是乱码,是xml,稍后就说说转化为csv文本)

三、数据的清洗及保存

1) 数据清洗

获取的数据结构太过复杂,我们还需要将其进行清洗及转换,之前我在《几行代码获取EXCELL有效数据》这篇文章演示了数据的清洗,请参考原文,这里不再重复说明。

2) 数据保存

财务报表是有效期比较长的数据,为了避免每次使用时反复下载,可以将数据存储到本地。存储方式一般有文件方式或数据库方式。由于数据量不大,直接存为文件csv就可以了。不过为了方便取用,文件命名方式可以稍微注意下,比如命名为报表类型-股票代码.csv,这样以便于读取。

四、编写Python程序下载数据

#!/usr/bin/py# filename=RPDownloader.pyfrom modules.Utils import e2csvfrommodules.Fi import tcodeimport pandas as Pdimport requests as ro# 下载资产负债表defdownloadBSRP(stocklist): num = 0 for c in stocklist: bs_url='http://soft-f9.eastmoney.com/soft/gp15.php?code={co}01&exp=1'.format(co=tcode(c)) ct = ro.get(bs_url).text to_file='bs{co}.csv'.format(co=tcode(c)) open(to_file,'w').write(e2csv(ct)) num = num + 1 return num

函数返回值为成功下载报表数目(这里没有做容错处理,如果下载量比较大,需要做容错处理,另外,还须解决程序异常退出后,下次再次进入后避免反复下载已经下载的数据,另外,为了避免IP地址被封,须在下载一个后加上一个延迟,这些内容就留给大家下面去研究了),测试一下代码:

显示成功下载了两个股票资产负债表。

根据以上内容,利润表和现金流量表也就可以下载了。

写到这里,财务数据采集篇就算结束了。下一篇是说说如何使用这些数据进行财务分析。

(0)

相关推荐