分享好用强大的数据接口Tushare

发布于: 雪球转发:0回复:1喜欢:2

Tushare是国内现有的免费数据接口中,最好的股票/基金数据获取方式(膜拜米哥,感谢大佬让我们的工作轻松了许多)。这篇文章的主要目的是介绍tushare的基本使用方法。

推荐的IDE是PyCharm, 另外Anaconda自带的Spyder也是不错的IDE

下面正式开始看代码:

先读取包,pandas和numpy都是tushare的必备包,请记得读取。
额外读取了一个叫做time的包。用来绕开提取次数限制。
import numpy as np
import pandas as pd
import tushare as ts
import time

下面这段代码读取了沪深300成分股的基本信息而且设定了pro接口

hsdata = pd.read_excel("C:完整路径/hs300Basic.xlsx") #请在完整路径这里填上你自己的文件路径pro = ts.pro_api('your token here') #tushare pro官网上注册自己的账号,成功之后就有了token

沪深300成分股基本信息的数据是我自己整合的,因为tushare对输入数据的要求会比较高,所以前期的数据整合是必不可少的。这部分数据最重要的就是股票代码以及它的格式。
新版的tushare pro对于提取数据有积分要求,具体要求详见tushare pro官网。(水积分也是我写文章的主要动力)
贴上整合后的数据样式:

沪深300指数的数据我没有想到很好的方法分享给大家请各位找度娘自己搞定吧。也许我还可以水一篇这方面的文章?
这些工作完成后就可以开始正式提取数据啦:
先看一下代码总览:

for i in range(1,301):
   name = hsdata.iloc[i-1,3]
   code = hsdata.iloc[i-1,1]
   temp_income = pro.income(ts_code=code,
                   fields='''
                   ts_code,ann_date,f_ann_date,end_date,report_type,
                   total_revenue,revenue,total_cogs,oper_cost,
                   sell_exp,admin_exp,fin_exp,oper_exp,operate_profit,
                   non_oper_income,total_profit,ebit,ebitda,
                   undist_profit,distable_profit,
                   comp_type,basic_eps,diluted_eps
                   ''')
   
   temp_balance = pro.balancesheet(ts_code = code,
                                   field = '''
                                   ts_code,ann_date,f_ann_date,end_date,
                                   report_type,comp_type,cap_rese,
                                   total_cur_assets,total_cur_assets,
                                   ''')
   temp_cf = pro.cashflow(ts_code = code,
                          fields = '''
                          ts_code,ann_date,f_ann_date,end_date,
                          net_profit,c_inf_fr_operate_a,
                          c_paid_for_taxes,st_cash_out_act,
                          free_cashflow,n_incr_cash_cash_equ,
                          prov_depr_assets,depr_fa_coga_dpba,
                          amort_intang_assets,lt_amort_deferred_exp,
                          c_pay_dist_dpcp_int_exp,decr_deferred_exp,
                          c_pay_acq_const_fiolta
                          ''')
   temp_cf.to_excel("C:完整路径/HS300 CF/%s CF.xlsx"%name,index = False)
   temp_balance.to_excel("C:完整路径/HS300 BS/%s BS.xlsx"%name,index = False)
   temp_income.to_excel("C:完整路径/HS300 Income/%s Income.xlsx"%name,index = False)
   print('we are geting stock %d\n\a' % i + name)

这部分代码依然是用一个for loop跑,这样虽然效率比较低下但因为格式简单而且便于理解,需要处理的数据量不大,所以for loop肯定是够用的。追求速度的朋友可以考虑一下用迭代的方式来写代码,我这里就不再多说了。以后有机会的话我会单独讲一讲for loop和迭代的方式跑代码的速度差距。(又可以水一篇文章)

为了方便讲解,我将代码拆分成不同部分:

name = hsdata.iloc[i-1,3] #获取股票的名称         #.iloc是整合在dataframe这个class里的一个函数
         #iloc[1,3]是读取dataframe里的第2行,第4列。         #Python数数默认是从0开始数的,注意别踩坑。
         
    code = hsdata.iloc[i-1,1] #获取股票的代码,这行代码尤为重要。            #建议在形成loop之前确认code这个变量的格式
            #如果操作不当有可能是非字符的形式(e.x. factor)

上面这个片段是整个loop的基础,将股票的名称和代码单独存作变量。

    temp_income = pro.income(ts_code=code,                    fields='''                    ts_code,ann_date,f_ann_date,end_date,report_type,                    total_revenue,revenue,total_cogs,oper_cost,                    sell_exp,admin_exp,fin_exp,oper_exp,operate_profit,                    non_oper_income,total_profit,ebit,ebitda,                    undist_profit,distable_profit,                    comp_type,basic_eps,diluted_eps                    ''')                    #这部分代码是在获取利润表的数据,因为输出的变量比较多,所以看起来很复杂
                    #但内容其实超级简单,就是输入ts_code和fields这两个变量而已。                    #关于具体的输出请查阅tushare pro的技术文档。

剩余的资产负债表部分(temp_balance)和现金流量表部分(temp_cf)部分和上述利润表的部分非常类似,我就不做多余的论述了。
链接:tushare利润表接口技术文档

下面聊一聊文档输出部分:
这一部分会用到pandas自带的功能来进行文档输出。
这部分内容的主要功能是将从接口处读取到的数据输出到本地,每一次调用接口都会给米哥的服务器造成一定的压力存在本地也可以在断网的时候进行数据操作。像财务报表这种一个季度才会更新一次的数据存在本地完全就够用了。
关于本地数据的读取问题我再找时间单独水一篇。嗯,我忘掉的可能性会比较大。


#将temp_cf这个文件通过调用.to_excel这个整合在class内部的函数进行输出#在实际运行代码的过程中记得将完整路径4个字替换成实际的路径  

#%这个符号使得输出的字符里可以带有变量    temp_cf.to_excel("C:完整路径/HS300 CF/%s CF.xlsx"%name,index = False)    temp_balance.to_excel("C:完整路径/HS300 BS/%s BS.xlsx"%name,index = False)    temp_income.to_excel("C:完整路径/HS300 Income/%s Income.xlsx"%name,index = False)        #print是用来提醒我进行到第几个。因为要大量调取数据,没有print提示的话可能会跑1-2分钟。
    #tushare 的服务器偶尔会遇到被挤爆的情况(特别是股市一片绿的时候)    #没有print无法判断是网络问题还是代码在运行,只是速度很慢。
    print('we are geting stock %d\n\a' % i + name)

结果大概就是这样:
在这里插入图片描述
不得不承认pandas在输出数据方面集成得真好。相比之下R里的readxl和excel.link包在整合、输出效果上都略差一筹。

最后单独插入一个小环节,time包里的函数:time.sleep()

#这个函数是让代码停止运行60秒
time.sleep(60)

使用这个函数是为了绕开调取限制。pro的接口内,在获得足够多的积分之前,很多接口都有每分钟调取次数的限制,我现在的积分每分钟调取次数为80(我到现在都没搞懂这个80应该怎么算,不过不重要想办法规避掉就好)。限制调取次数是为了防止恶意调取数据对服务器造成的压力。
但手工每隔一分钟跑一次实在太难受了,所以自动暂停就变成了一个很不错的选择。
在for loop的最后加上一个if判断,在i == 80的整数倍时,连接上面的函数就可以完美避开每分钟调取限制。
话说我在这儿公开说这个米哥应该不会封我号吧…
当然,如果你的积分够高上述部分你可以不看…
这个小技巧在写爬虫类代码的时候也会派上用场的,记在心里总是没错的。

最后闲聊两句:
1.上述所有操作在你有了Wind/Bloomberg终端之后都会变得一点没必要,因为操作会超级简单。但是,这个简单是有价格的,而且还很贵。

2.这篇文章相比上篇其实更有实践意义。基于财务报表的几种定价方法(DCF,EV/EBIT等等)所需数据都可以采集到。
对价值投资者来说,财务报表可以说是重中之重,tushare分享的财务数据让价值投资者可以进行一系列的价值投资分析。不过现阶段可以获取到的数据质量算不上特别好,缺失值之类的情况颇为普遍。在真正进行建模分析之前还需要进行数据清理。
另外我个人认为价值学派在现在的A股市场不太行得通。包括机构投资者在内的许多资金,投资股票的目的不是长期持有而是短期投机。价值学派的很多想法也并不被认可,总体来说,价值投资在国内不是很受欢迎也难以在短期内实现超额收益。
现阶段的数据分析对价值投资者们的作用是免去大海捞针的时间,选出一些被明显低估或者高估的股票,供各位投资者进行进一步分析。距离直接依靠算法进行价值投资还有较远的距离。

感谢大家看完这篇文章!希望对你们的学习/工作有一点点的帮助。

最后贴上tushare的官网,更多的数据接口和范例代码可以在官网上查到:

网页链接

全部讨论

2022-09-08 16:21

Tushare数据接口注册网址:网页链接