从零开始做量化(0)—— 引言
从零开始做量化(1)—— 交易框架
从零开始做量化(2)—— 开发环境搭建
从零开始做量化(3) —— 框架实现
从零开始做量化(4) —— 财经数据接口
本节介绍财经数据接口的实现,目前可用的财经数据接口繁不胜数,财经数据的接口主要分为三类:一类是由第三方社区提供的专门用于量化交易的财经接口,这类API返回的数据可读性、可操作性非常好,可以直接拿来用,但是“天下没有免费的午餐”,这些接口有些功能收费或者免费使用受限,如频次限制、权限限制、单日调用量限制等;第二类接口一般由国内外的财经证券大厂如新浪财经、腾讯财经、雅虎、东方财富等提供,实时性较强、免费且不受限制,但是请求返回的数据无法直接使用,需要额外进行解析处理。除此之外,还有极少数些信息比较冷门,上述两种API都不提供,这时可以通过网络爬虫的方式获取。三类API的实现难易程度上依次增加、稳定性和易用性依次降低,所以我们应该充分利用第一类接口,第一类无法提供的数据由第二类补充,迫不得已时才会使用爬虫的方式获取一些关键信息。本节先来介绍第一类、第二类数据接口的使用,爬虫方式只有在需要的时候我们再单独介绍。
第一类接口我们介绍两个,分别是 歪枣网和挖地兔tushare ,之所以介绍主要是因为它们提供的信息比较全面,而且它们的使用方式比较有代表性,如果后面用到其他第三方社区提供的财经API,我们也能按照同样的调用方式使用。
歪枣网是一个开放自由的社区,能够快速获取沪深股票、港股、大盘指数、基金净值、基金排行等财经数据,提供免费的财经数据下载接口。接口将提供txt、json、csv文件等多种数据形式,我们可以直接拿来使用。该网站需要注册,然后才能获取服务。如下图所示:
该接口最大的特点就是直接通过URL就可以请求到相应的数据,且能够自定义返回数据类型,支持json数据和txt数据。更方便的是,该接口支持根据需求在线生成示例代码!我们以获取某只/某些股票的基本信息为例,介绍该平台生成示例代码、返回请求数据的操作。如下图:
上面的Python示例代码是基于Python2.x的,我们只需要它生成的URL即可,代码我们重新自己编写,那么上面的示例代码就可以写为:
import requests
import json
def getStockBaseInfo(stock_code, ret_type = '1'):
'''
获取股票基本信息。
传入参数:
stock_code: 传入股票代码
ret_type: 返回结果类型 0: txt-string,
1: json-string,
2: txt file
3: json file
4: csv file
返回:
若请求成功,返回相应的结果;
请求失败,返回 None
'''
url_base = "http://api.waizaowang.com/doc/getStockHSABaseInfo?"
url_code = stock_code
url_fields = "all"
url_exports = ret_type # json-string
url_token = "" #填充自己的Token
url = url_base + \
"code=" + url_code + "&" + \
"fields=" + url_fields + "&" + \
"export=" + url_exports + "&" + \
"token=" + url_token
request = requests.get(url)
request_text = json.loads(request.text)
if request_text["code"] == 200 and request_text["message"] == "成功":
return request_text["data"]
else:
return None
if __name__ == '__main__':
print(getStockBaseInfo('000001'))
执行结果:
除了获取股票基本信息之外,我们还可能需要获取A股/港股/美股等列表、每日行情、指数成分股等,所有相关接口我们可以做成一个python模块备用,除此之外如果需要基金等接口,我们也可以按照同样的方式做成模块,最终的代码可在文末获取。
与歪枣网不同,挖地兔直接提供了Python第三方开发包,通过 “pip install tushare” 即可安装该包,然后可以直接使用里面的接口。为方便开发人员使用,Tushare社区网站提供了非常详细的开发说明文档。与歪枣网一样,该网站也需要注册才能使用接口,也支持在线生成示例代码,且生成的代码可直接使用!如下:
# 导入tushare
import tushare as ts
# 初始化pro接口
pro = ts.pro_api('') # 填充自己的token代码
# 拉取数据
df = pro.stock_basic(**{
"ts_code": "",
"name": "",
"exchange": "",
"market": "",
"is_hs": "",
"list_status": "",
"limit": "",
"offset": ""
}, fields=[
"ts_code",
"symbol",
"name",
"area",
"industry",
"market",
"list_date"
])
print(df)
执行结果:
美中不足的是,上述两类接口尽管提供的数据接口非常丰富且稳定,但是二者都采用了积分制,导致无法完全免费、无限制地获(bai)取(piao)数据,因此还需要其他接口。
第二类API最大的优势就在于免费、可无限制使用,而且实时性也不错。本节以新浪财经接口为例,演示如何获取金融数据。
获取某港股股票涨跌幅:
import requests
def HK_market_getStkUpdowns(stk_list):
'''
获取港股股票涨跌幅。
输入参数:
stk_list: 港股股票代码列表;
返回:
若请求失败,返回None;否则按照传参顺序返回相应的涨跌幅。
'''
url_base = "http://hq.sinajs.cn/list=hk"
headers={'Referer':'https://finance.sina.com.cn/'}
res = []
for stk in stk_list:
url = url_base + stk
request_text = requests.get(url,headers = headers).text # return
li_text = request_text.strip().split(",")
if len(li_text) > 2:
res.append(li_text[8])
else:
print("请求港股数据失败")
res.append("None")
return res
if __name__ == "__main__":
print(HK_market_getStkUpdowns(['00700']))
需要注意的是,新浪财经接口最近有新的变动,如果不加headers,返回的将是“Kinsoku jikou desu!”字样!
新浪财经接口非常齐全,不仅有A股、港股的数据,甚至还有国外股市数据。再贴一个新浪财经获取美股涨跌幅的代码:
def US_market_getStkUpdowns(stk_list):
'''
获取港股股票涨跌幅。
输入参数:
stk_list: 港股股票代码列表;
返回:
若请求失败,返回None;否则按照传参顺序返回相应的涨跌幅。
'''
url_base = "http://hq.sinajs.cn/list=gb_"
headers={'Referer':'https://finance.sina.com.cn/'}
res = []
for stk in stk_list:
url = url_base + stk.lower()
request_text = requests.get(url,headers = headers).text # return
li_text = request_text.strip().split(",")
if len(li_text) > 2:
res.append(li_text[2])
else:
print("请求美股数据失败")
res.append("None")
return res
当然除了新浪财经接口,还有腾讯财经、东方财富等,这些数据请求方式类似,后面仍会封装成一个独立的模块开源出来。
在开源网站上,许多优秀的前辈们分享了自己实现的金融数据接口,由于数量较多,只挑选了一部分并统一整理成下表,具体使用方法请移步至相应的网址:
名称 | 网址 | 简介 |
---|---|---|
yfinance | https://github.com/ranaroussi/yfinance | 雅虎金融数据接口 |
stock_extractor | https://github.com/ZachLiuGIS/stock_extractor | 提取最新的股票信息和股市数据 |
wallstreet | https://github.com/mcdallas/wallstreet | 实时股票和期权数据 |
iexfinance | https://github.com/addisonlynch/iexfinance | 实时金融数据 |
exchange | https://github.com/akarat/exchange | 货币汇率 |
chinesestockapi | https://pypi.org/project/chinesestockapi/ | 国内股价 |
easyquotation | https://github.com/shidenggui/easyquotation | 快速获取新浪/腾讯的全市场行情 |
findatapy | https://github.com/cuemacro/findatapy | 用于通过 Bloomberg、Quandl、Yahoo 等下载市场数据 |
googlefinance | https://github.com/hongtaocai/googlefinance | 从 Google Finance API 获取实时股票数据 |
yahoo-finance | https://github.com/lukaszbanasiak/yahoo-finance | 雅虎金融数据接口 |
APIpyhoofinance | https://github.com/innes213/pyhoofinance | 快速查询 Yahoo Finance 的多个股票代码并返回键入的数据进行分析 |
yfinance-api | https://github.com/Karthik005/yfinance-api | 金融API |
yql-finance | https://github.com/slawek87/yql-finance | 简单快捷,返回当前时间段的股票收盘价和当前股票代码 |
ystockquote | https://github.com/cgoldberg/ystockquote | 从雅虎财经检索股票报价数据 |
Stockex | https://github.com/cttn/Stockex | 雅虎金融数据接口 |
finsymbols | https://github.com/skillachie/finsymbols | 获取 SP500、AMEX、NYSE 和 NASDAQ 的股票代码和相关信息 |
tiingo | https://github.com/hydrosquall/tiingo-python | 实时数据 |
iexfinance | https://github.com/addisonlynch/iexfinance | 实时数据 |
上表摘自《和金融相关的python包汇总》,作者“ SharkFin.top ” 。(非商业引用,如有侵权,联系删除!)
在搜索相关资料时发现的一个开源宝藏,感谢efinance作者“顺手牵羊”提供的开源代码和开发文档(如有侵权,联系删除),一款非常非常好用的财经接口!
获取方式很简单:
pip install efinance
开发文档分享出来,感谢作者的无私奉献!
拿到第一手的数据还不够,因为我们实现的接口是为后面的策略服务的,所以还需要把它们组织起来,必要的信息还需要本地化缓存下来。下一篇文章介绍数据的本地化缓存与API实现。
感谢您的耐心阅读,文章创作不易,转发请注明出处!系列文章首发于个人微信公众号“24K纯学渣” ,学习资源与源码将第一时间共享在该平台,欢迎关注!