简介
数据是机器学习的核心,garbage in garbage out
,而金融数据是量化的基础,对数据提出了更高的要求。不仅是数据准确高速(稳定),而且要求数据丰富全面。
金融数据
考虑到金融数据非常丰富,能快速入门,降低门槛,因此,本专栏仅对国内A股金融数据入手,熟悉整个量化流程。公开的金融数据可以通过平台API的方式或爬虫抓取的方式获得,也不排除收费的金融平台提供高质量数据。
数据平台
目前国内数据平台主流有以下几个,BaoStock,tushare,akshare,efina 下面分别讲解各平台优缺点,以及使用方法。
为了便于以后的使用说明,将所有的数据保存为本地csv格式。
baostock (证券宝)
- 官方网址:http://www.baostock.com/
- Baostock 是 一个免费、开源的证券数据平台(无需注册)。
- 完整的证券历史行情数据、上市公司财务数据。
- python API 方式,数据返回格式pandas DataFrame类型
- 优点是免费,缺点是数据不全
安装
默认安装
pip install baostock --upgrade
国内安装
pip install baostock -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn
使用
以下以日K线为例,官方文档的内容,值得注意的事,下面的代码是老版本,新版本可以提升速度。
获取历史A股K线数据:query_history_k_data_plus()
方法说明:通过API接口获取A股历史交易数据,可以通过参数设置获取日k线、周k线、月k线,以及5分钟、15分钟、30分钟和60分钟k线数据,适合搭配均线数据进行选股和分析。
返回类型:pandas的DataFrame类型。
能获取1990-12-19至当前时间的数据;
可查询不复权、前复权、后复权数据。
import baostock as bs
import pandas as pd#### 登陆系统 ####
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond error_msg:'+lg.error_msg)#### 获取沪深A股历史K线数据 ####
# 详细指标参数,参见“历史行情指标参数”章节;“分钟线”参数与“日线”参数不同。“分钟线”不包含指数。
# 分钟线指标:date,time,code,open,high,low,close,volume,amount,adjustflag
# 周月线指标:date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg
rs = bs.query_history_k_data_plus("sh.600000","date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",start_date='2017-07-01', end_date='2017-12-31',frequency="d", adjustflag="3")
print('query_history_k_data_plus respond error_code:'+rs.error_code)
print('query_history_k_data_plus respond error_msg:'+rs.error_msg)#### 打印结果集 ####
data_list = []
while (rs.error_code == '0') & rs.next():# 获取一条记录,将记录合并在一起data_list.append(rs.get_row_data())
result = pd.DataFrame(data_list, columns=rs.fields)#### 结果集输出到csv文件 ####
result.to_csv("D:\\history_A_stock_k_data.csv", index=False)
print(result)#### 登出系统 ####
bs.logout()
====================================
以下为修改后的新版本,并精简一些打印信息。
import baostock as bs
import pandas as pd#### 登陆系统 ####
lg = bs.login()
# 显示登陆返回信息#### 获取沪深A股历史K线数据 ####
# 详细指标参数,参见“历史行情指标参数”章节;“分钟线”参数与“日线”参数不同。“分钟线”不包含指数。
# 分钟线指标:date,time,code,open,high,low,close,volume,amount,adjustflag
# 周月线指标:date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg
rs = bs.query_history_k_data_plus("sh.600000","date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",start_date='2000-01-01', end_date='2023-3-1',frequency="d", adjustflag="1")### 直接获得 DataFrame对象
result= rs.get_data()#### 结果集输出到csv文件 ####
result.to_csv("./data/sh.600000.csv", index=False)
print(result)#### 登出系统 ####
bs.logout()
小伙伴,先不要急着执行上面的代码,先把上面的修改部分的代码,作一下说明。
参数含义: code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空;
fields:指示简称,支持多指标输入,以半角逗号分隔,填写内容作为返回类型的列。详细指标列表见历史行情指标参数章节,日线与分钟线参数不同。此参数不可为空;
start:开始日期(包含),格式“YYYY-MM-DD”,为空时取2015-01-01;
end:结束日期(包含),格式“YYYY-MM-DD”,为空时取最近一个交易日;
frequency:数据类型,默认为d,日k线;d=日k线、w=周、m=月、5=5分钟、15=15分钟、30=30分钟、60=60分钟k线数据,不区分大小写;指数没有分钟线数据;周线每周最后一个交易日才可以获取,月线每月最后一个交易日才可以获取。
adjustflag:复权类型,默认不复权:3;1:后复权;2:前复权。已支持分钟线、日线、周线、月线前后复权。
BaoStock提供的是涨跌幅复权算法复权因子,具体介绍见:复权因子简介或者BaoStock复权因子简介。
- 修改了 start 和 end ,这里的时间格式就行,如“2020-01-01” 和 “2023-3-1” 都没有问题;
- 修改了 adjustflag=“1” 即修改为向后复权,为什么要选择“后复权”?如果采用“前复权”,最大好处,可以很直观的看到当前真实价格,但之前的数据可能会出负值,同时,一旦除权,需要重新采集数据。若采用“后复权”的方式,以后获得新数据可以追加的方式进行,减少维护成本;
- 将 while 循环修改为 get_data() 对象,这句话是提升效率关键,之前版本没有,后来新增;
- 另外要注意,baostock 原始数据包含停牌记录,而backtrader不需要停牌记录,所以
以上程序中要删除停牌记录。
关于复权数据的说明:
BaoStock使用“涨跌幅复权法”进行复权,详细说明参考上文“复权因子简介”。不同系统间采用复权方式可能不一致,导致数据不一致。
“涨跌幅复权法的”优点:可以计算出资金收益率,确保初始投入的资金运用率为100%,既不会因为分红而导致投资减少,也不会因为配股导致投资增加。
与同花顺、通达信等存在不同。
不同来源的复权数据有时候不一致,tushare 和baostock中600000浦发银行在2006年5月12日的后复权收盘价相差4元多,大家要自己评估哪个是正确的。baostock 是16. 18,tushare 是21. 03,而雪球网站上是21. 03,同花顺软件里是20.75。
官方baostock的后复权是分红再投,其他软件后复权都是现金分红,用同花顺选择红利再投资,结果和baostock一致。如果是这样,那么这种方法是可以接受的。
根据baostock文档,它采用涨跌幅复权法,假设投资者在除权日前一天卖出全部的股票,然后在除权日用全部资金以昨收盘价买回,即不参加分配。这样的假设基于如下目的,确保初始投入的资金100%得到使用,既不会因为分红而导致投资减少,也不会因为配股而导致投资增加。
返回数据说明
参数名称 | 参数描述 | 算法说明 |
---|---|---|
date | 交易所行情日期 | |
code | 证券代码 | |
open | 开盘价 | |
high | 最高价 | |
low | 最低价 | |
close | 收盘价 | |
preclose | 前收盘价 | 当日发生除权除息时,“前收盘价”不是前一天的实际收盘价,而是根据股权登记日收盘价与分红现金的数量、配送股的数里和配股价的高低等结合起来算出来的价格。 |
volume | 成交量(累计 单位:股) | |
amount | 成交额(单位:人民币元) | |
adjustflag | 复权状态(1:后复权, 2:前复权,3:不复权) | |
turn | 换手率 | [指定交易日的成交量(股)/指定交易日的股票的流通股总股数(股)]*100% |
tradestatus | 交易状态(1:正常交易 0:停牌) | |
pctChg | 涨跌幅(百分比) | 日涨跌幅=[(指定交易日的收盘价-指定交易日前收盘价)/指定交易日前收盘价]*100% |
peTTM | 滚动市盈率 | (指定交易日的股票收盘价/指定交易日的每股盈余TTM)=(指定交易日的股票收盘价*截至当日公司总股本)/归属母公司股东净利润TTM |
pbMRQ | 市净率 | (指定交易日的股票收盘价/指定交易日的每股净资产)=总市值/(最近披露的归属母公司股东的权益-其他权益工具) |
psTTM | 滚动市销率 | (指定交易日的股票收盘价/指定交易日的每股销售额)=(指定交易日的股票收盘价*截至当日公司总股本)/营业总收入TTM |
pcfNcfTTM | 滚动市现率 | (指定交易日的股票收盘价/指定交易日的每股现金流TTM)=(指定交易日的股票收盘价*截至当日公司总股本)/现金以及现金等价物净增加额TTM |
isST | 是否ST股,1是,0否 |
tushare
- 官方网址:https://www.tushare.pro/
- 一个半收费的数据平台,下载数据需要
token
。 - 数据丰富:拥有丰富的数据内容,如股票、基金、期货、数字货币等行情数据,公司财务、基金经理等基本面数据
- 获取简单:SDK开发包支持语言,同时提供HTTP Restful接口,最大程度方便不同人群的使用
- 落地方便: 提供多种数据储存方式,如Oracle、MySQL,MongoDB、HDF5、CSV等,为数据获取提供了性能保证
tushare pro 在原来老版的基础上升级的,老版api只提供基础日线数据。tushare pro现金积分充值比例是1:10,比如充值50获取500积分,积分有效期一年, 使用数据积分不减少。A股数据2000积分可以使用,但限频次,每分钟限200次请求,每天限10w次api请求。 港美股日线需至少5000积分。
安装
默认安装
pip install tushare--upgrade
国内安装
pip install tushare -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host=mirrors.aliyun.com --upgrade
使用
import tushare as ts
pro = ts.pro_api('6a0899533f8a5996f738183dbdf63c0afb3fcc931f08e1233575a339') #token,请注册后替换为自己的token。
df = pro.daily(ts_code='600000.SH', adj='hfq', start_date='20000101', end_date='20230301')
#颠倒顺序,使得按日期升序排。backtrader要求日期升序
df.sort_index(inplace=True, ascending=False)
print('Tushare行情获取\n',df)
df.to_csv("./data/sh.600000tuhfq.csv", index=False)
值得注意的是按日期降序排列的,所以以上代码把它转换了一下,使得按日期升序排列,以符合backtrader的要求。另外,获取的数据应该是后复权的(参数adj=‘hfq’),这样保证数据的一致性。
以下是返回数据格式。比 Baostock 要少好几列。
ts_code | trade_date | open | high | low | close | pre_close | change | pct_chg | vol | amount | |
---|---|---|---|---|---|---|---|---|---|---|---|
5492 | 600000.SH | 20000104 | 24.98 | 25.78 | 24.75 | 25.57 | 24.75 | 0.82 | 3.3100 | 44961.00 | 113946.783 |
5491 | 600000.SH | 20000105 | 25.57 | 25.98 | 25.15 | 25.28 | 25.57 | -0.29 | -1.1300 | 52528.00 | 134465.427 |
5490 | 600000.SH | 20000106 | 25.18 | 26.30 | 25.05 | 25.99 | 25.28 | 0.71 | 2.8100 | 62297.00 | 160059.798 |
5489 | 600000.SH | 20000107 | 26.30 | 27.50 | 26.12 | 26.90 | 25.99 | 0.91 | 3.5000 | 213553.00 | 575751.082 |
5488 | 600000.SH | 20000110 | 27.00 | 27.85 | 26.71 | 27.25 | 26.90 | 0.35 | 1.3000 | 165397.00 | 450453.518 |
… | … | … | … | … | … | … | … | … | … | … | … |
akshare
- 官方网址:https://github.com/akfamily/akshare
- 基于 Python 的财经数据接口库, 目的是实现对股票、期货、期权、基金、外汇、债券、指数、加密货币等金融产品的基本面数据、实时和历史行情数据、衍生数据从数据采集、数据清洗到数据落地的一套工具。
- akshare api接口变动较频繁,数据格式不通用
安装
默认安装
pip install akshare --upgrade
国内安装
pip install akshare -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com --upgrade
使用
import akshare as akdf = ak.stock_zh_a_hist(symbol="300750", period="daily", start_date="20210101", end_date='20220715', adjust="qfq")print('AKshare行情获取\n',df)
日期 | 开盘 | 收盘 | 最高 | 最低 | 成交量 | 成交额 | 振幅 | 涨跌幅 | 涨跌额 | 换手率 | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2000-01-04 | 24.98 | 25.57 | 25.78 | 24.75 | 44960 | 113946000.0 | 4.16 | 3.31 | 0.82 | 1.41 |
1 | 2000-01-05 | 25.57 | 25.28 | 25.98 | 25.15 | 52528 | 134465000.0 | 3.25 | -1.13 | -0.29 | 1.64 |
2 | 2000-01-06 | 25.18 | 25.99 | 26.30 | 25.05 | 62296 | 160059000.0 | 4.94 | 2.81 | 0.71 | 1.95 |
3 | 2000-01-07 | 26.30 | 26.90 | 27.50 | 26.12 | 213553 | 575751000.0 | 5.31 | 3.50 | 0.91 | 6.67 |
4 | 2000-01-10 | 27.00 | 27.25 | 27.85 | 26.71 | 165397 | 450453000.0 | 4.24 | 1.30 | 0.35 | 5.17 |
… | … | … | … | … | … | … | … | … | … | … | … |
这个返回
的字段是中文的。
‘日期’, ‘开盘’, ‘收盘’, ‘最高’, ‘最低’, ‘成交量’, ‘成交额’, ‘振幅’, ‘涨跌幅’, ‘涨跌额’, ‘换手率’
其他平台
yfinace – yahoo财经数据获取,需要使用代理访问。
easyquotation– python实时获取新浪/腾讯的全市场行情,无法获取历史数据
efinance – 用于获取股票、基金、期货、债券数据的免费开源 Python 库。
总结
- 上述三个平台均可以满足我们入门级需求,根据个人喜好进行选择,如后续想对基金,期货做量化研究,不建议使用 baostock;专栏仅仅是A股,因此就选择 baostock 工具进行研究。
- 小伙伴们肯定不会仅仅研究一两支股票,如进行选股操作,因此需要下载大量的本地数据,所以这里有两种方式,一种下载保存为
csv
格式文件;另一种方式,用数据库的方式保存。
下一节,我将带大家学习保存数据的两种方式。