最近想取一些股市的数据分析,却遇到了不少的坑,把过程记录下来,见到这方面还是有不少的需求,希望给后来者一个参考。
股市数据获取途径不少,有一些慢慢退出,如新浪、雅虎等接口;有一些接口不明,很难利用。
由于本人不是专业人士,所以无法获知各种证券公司内部的数据,只能说说普通用户可以获得的几种途径。
总结大致上就是从各种开源途径提供的接口或者专业软件本地数据或者网站上爬取数据。归纳有以下几种途径(对于这些途径网上已经有不少文章介绍,这里就不详细介绍其使用办法,作为股市分析必不可少的前复权数据,对这几种途径进行一些简单的比较):
=== 本文不详细介绍代码,代码的接口可参考各自的文档,如果有问题可私信交流。
根据以前的留言需求,也赠送一个小小福利,如果不想写代码,可直接下载数据,请关注微信号“材数科技”并回复“通达信数据格式”,会得到最近转换为excel文件格式的数据包;回复“除权数据” 可获得近期的各股(A股)除权信息。
1、Tushare
Tushare是网上推荐最多的开源接口,确实也是公认数据比较齐全的接口。
也是本人开始接触使用的数据来源,可惜自从推出收费专业版后,原来的版本几乎没有维护,一些接口莫名其妙就用不了。
本人也为了保持数据稳定,升级到专业版并获得了一定积分。
**这里吐槽一下:至今仍然说是免费,但不断收费,特别可恶的是很多接受收费标准(积分)调整了也不告知,今天还可以明天就不行了。所以今天开始宣布放弃该接口 **
对于前复权日线行情, 按照Tushare 提示一次说120积分能满足23年历史数据,其实只是指一只股票,如果需要全部分析,就歇菜了(如下图本人积分远超120积分,还是用的很不爽)。而且不得不吐槽的每个接口积分要求不一样,如果要取得一点其他数据,都要研究半天,太烦人了。商业化可以理解,但只考虑自己不考虑使用者,就有点令人不爽了。
另外,即使专业版至今只有A股的数据,没有提供港股等的数据。
2、akshare
akshare 是完全开源的接口,可以获取的数据似乎也不比tushare少,从介绍看,数据应该是来源于一些开源数据,如新浪和东方财富等。也提供了港股、美股的数据(没有亲测,不能说结果如何)
不过本人也遇到几个问题:(1)没有找到除权信息的接口。(2)北交所的部分个股调用接口出错,发现是没有找到相应的数据。(3)写的太技术了,估计是专业人士才能使用,对于非IT专业人士,要做量化分析,需要好好读懂其提供的示例。
3、baostock
网上对baostock的评价似乎不是很高。但我自己用起来,感觉还是很不错,容易上手,文档也浅显易懂。
当然也有几个不足之处:
(1)只有A股数据,没有其他市场的数据;(2)对于停牌的日子,居然也列入其中,还好有csdn的码农甲等大神指路,避免了一个大坑(如下图),建议对成交量为0 的数据进行过滤(rs.drop(rs[rs.volume == ‘0’].index, inplace = True))。(3)北交所的数据似乎没有更新,调用不到数据(如下图)。
另外,需要注意的是调用函数 bs.query_history_k_data_plus 获得前复权日线数据时,需要再调用.get_data()才能获得DataFrame格式数据。
4、通达信等软件
通达信等交易软件可以使用盘后数据下载后,把数据下载到本地,这种方法获得数据应该是比较快的一种。不过,这种方法一般不太推荐使用,主要有几个问题:
(1)下载的数据格式就需要研究半天,软件本身并不提供;(2)交易软件一般不会保留完整数据,大约会保留使用前几年开始的数据;(3)并不直接提供前复权数据,需要自己计算,但通达信等对于除权数据是加密不可取。(4)数据内容十分有限。
获取数据的办法可见本人前一篇文章(在csdn和微信号“材数科技”都有发表)
5、东方财富(类似财经类网站还不少,但本人使用后感觉还是东方财富靠谱,其他的如同花顺等就不在这里讨论)
作为程序员一枚,当打开东方财富等网站,都会有一种忍不住的冲动,上面的数据能不能存下来?太丰富了。事实上确实基本是可以的,而且速度也比接口法可能更快(估计是现在采用这种办法的人不多,网站对于抓取数据没有太多的限制)。
当然,这种方法的麻烦之处,是需要逐个接口去分析,每种数据的接口都是不同,没有标准格式,获得数据还要自己分析后进行解析,工作量 会比较大。
但只要知道了方法,代码还是很简单,如获得前复权数据,可以用如下代码(该方法数据完整、可靠,本人使用后觉得该方法优于其他方法,建议使用):
def GetKlines(sCode='000001.SZ',begDate='202001',endDate='20500101',fqtType='1'): # scode: 股票代码(需要转换为市场+代码格式) begDate:开始时间,endDate 结束时间 fqtType:0不复权 1 前复权 2后复权
nDot = sCode.find(".")
sMarket = "0"
if(sCode[-3:]==".SZ"):
sMarket = "0"
elif(sCode[-3:]==".BJ"):
sMarket = "0"
elif(sCode[-3:]==".SH"):
sMarket = "1"
elif(sCode[-3:]==".HK"):
sMarket = "116"
urlCode = sMarket+"."+sCode[:nDot] # 变成 市场代码+股票代码的模式
url = "https://push2his.eastmoney.com/api/qt/stock/kline/get?fields1=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13&fields2=f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61&beg="+begDate+"&end="+endDate+"&ut=fa5fd1943c7b386f172d6893dbfba10b&rtntype=6&secid="+urlCode+"&klt=101&fqt="+fqtType+"&cb=jsonp1652504244851"
response=requests.get(url)
a = response.content
a = str(a.decode('utf-8'))
ret = re.match("json.*\(\{",a)
ls = []
if(ret):
nr = ret.end()-1
a = a[nr:]
a = a[:-2]
# print(a)
items = json.loads(a)
jsonData=items["data"]
for line in jsonData["klines"] :
ls.append(line.split(","))
df = pd.DataFrame(ls,columns=["sDate","open","close","high","low","vol","amount","amplitude","pctchg","change","turnover"])
df["scode"]=sCode
return df
类似的可以获得除权信息、年报信息等数据,例如 想获得年报数据,可以用以下的接口(为了避免发送链接被误认为广告,只能截图表示):
以上仅仅是个人的经验,欢迎大家指正。
=== 本文不详细介绍代码,代码的接口可参考各自的文档,如果有问题可私信交流。
根据以前的留言需求,也赠送一个小小福利,如果不想写代码,可直接下载数据,请关注微信号“材数科技”并回复“通达信数据格式”,会得到最近转换为excel文件格式的数据包;回复“除权数据” 可获得近期的各股(A股)除权信息。
本文同步发布于微信号。