如今,越来越多的小伙伴们开始用Python搞股票和基金的数据分析,不仅是为了提升投资技能,还想深挖一下硬核编程的知识。初学者们一开始都是靠爬虫从东方财富等网站扒数据,但随着时间推移,大家发现了一个新世界——有些小伙伴已经贡献出了一些金融数据的开源库。当然,有些开源数据可能会因为运营成本之类的原因收点小费,但这也是情理之中的事。
现在,让我带你们认识三个超酷的开源金融数据接口库:Akshare、Baostock和Tushare。
Akshare是一个基于Python的开源金融数据接口库。它的目标是给金融数据科学家和喜欢搞金融数据的小伙伴们提供一套工具,包括股票、期货、期权、基金、外汇、债券、指数、数字货币等金融产品的基本面数据、实时和历史行情数据,以及各种衍生数据。Akshare的牛点在于它通过爬虫直接从权威的金融数据网站搞来原始数据。
Baostock提供一堆又准又全的证券历史行情数据和上市公司财务数据。通过API拿证券数据信息,适合量化交易投资者、热爱数据的金融迷们、还有搞计量经济的同学。数据格式返回得是pandas的DataFrame类型,方便用pandas来搞数据分析和可视化。
Tushare是一个超级开源的Python财经数据接口包。它主要搞股票等金融数据的从采集、清洗到加工再到存储的全套服务,能够给金融分析人员提供快速、整洁、多样的数据,而且容易分析。Tushare返回的绝大部分数据格式都是pandas的DataFrame类型,非常方便用pandas/NumPy/Matplotlib来搞数据分析和可视化。有需要的话,你还可以通过Tushare的数据存储功能,把数据都保存到本地,方便后续分析。不过,得注意一下,Tushare-Pro版的高级数据接口是要收费的。收费是希望你通过积分的方式来获取更多数据和接口调用次数。
这些开源的数据库真是给我们省去了一堆精力,不用自己写爬虫去抓数据了。虽然这三个库在API上有点像,但它们各自都有优点和缺点。Tushare的股票类的数据最全,但目前Tushare-Pro版高阶数据接口是要收费的。而Akshare是免费使用的,并且包含的期货数据更加全面。这一篇我们主要介绍了用Akshare来搞期货的基本面数据。
Akshare有标准的文档(https://akshare.akfamily.xyz/),里面详细介绍了怎样使用Akshare,以及具体包含的数据有哪些。它的安装非常简单。
pip install akshare -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com --upgrade
云端公用的服务器是不包含这个包的,所以在优宽回测系统安装想使用这个包,我们需要使用本地的托管者,在本地环境安装完成这个包,然后进行回测。
包安装完成以后,接下来我们介绍下怎样使用这个包获取期货的基本面数据,仓单。仓单是库存的一个实时的指标,具体代表的是交易所的交割仓库入库现货后开具的标准仓单,它反映的是交易所公布的库存数量。当期货价格较高时,现货商就是注册仓单然后在市场上销售。另外,还可以利用仓单来判断库存。仓单既可以注册也可以注销,当期货主力想要价格上涨时,会把持有的注册仓单注销掉,改变交易所公布的库存数量,来达到交割货物不足的假象,进而影响期货价格上涨的预期。当期货主力想要价格下跌时,会注册仓单,造成交割货物增多的假象,使得被动影响期货价格下跌。所以根据这个原理我们可以反推出在期货中的交易方向。
需要注意的是,这个包不是直接给我们提供数据,而是提供了一个爬虫的框架,所以在爬取数据的过程中,经常会出现各种的error,我们需要做好容错的处理。
from datetime import datetime
from dateutil.relativedelta import relativedelta
date_format = "%Y%m%d"
start_date = datetime.strptime("20201118", date_format)
end_date = datetime.strptime("20231119", date_format)
date_list = []
current_date = start_date
while current_date <= end_date:
date_list.append(current_date.strftime(date_format))
current_date += relativedelta(days=1)
print(date_list)
receiptDf = pd.DataFrame(columns=['var', 'receipt', 'receipt_chg', 'date']) # 初始化 DataFrame
for i in date_list:
while True:
try:
data = ak.get_receipt(start_day=i, end_day=i, vars_list=["RB", "SP", "SA", "PG", "TA", "EG", "FU", "PP"])
receiptDf = pd.concat([receiptDf, data])
break # 成功获取数据后跳出循环
except Exception as e:
print(f"Error processing date: {i}. Error: {e}")
continue # 当错误发生时,继续下一个日期,重新尝试获取数据
这段代码主要执行了以下操作:
使用datetime和dateutil.relativedelta库来定义了一个开始日期start_date和一个结束日期end_date。创建了一个date_list,其中包含了从开始日期到结束日期的每一天的日期字符串,按照"%Y%m%d"的格式。
对于date_list中的每一个日期字符串(从开始日期到结束日期),尝试获取数据。使用ak.get_receipt()函数获取数据。此函数需要开始日和结束日,以及一系列的品种列表。如果数据获取成功,则将这个数据与receiptDf合并,并跳出循环。如果在获取数据时发生错误,则打印错误信息,并继续下一个日期,重新尝试获取数据。 这段代码的主要目的是为了从指定的日期范围内,按天获取一些交易或收据的数据,并将这些数据存储在一个pandas DataFrame中。
这就是我们利用开源数据库获取基本面数据的一个实际应用。基本面数据作为期货策略的一个重要的指标,可以开发出很多的策略。比如大名鼎鼎的蜘蛛网策略,就是利用每日公布的结算会员之间的多头和空头持仓的差异进行的策略。我们可以使用这些基本面数据进行很多的期货有关的基本面的策略,大家有兴趣都可以尝试下。