简介

数据是机器学习的核心,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复权因子简介。

  1. 修改了 start 和 end ,这里的时间格式就行,如“2020-01-01” 和 “2023-3-1” 都没有问题;
  2. 修改了 adjustflag=“1” 即修改为向后复权,为什么要选择“后复权”?如果采用“前复权”,最大好处,可以很直观的看到当前真实价格,但之前的数据可能会出负值,同时,一旦除权,需要重新采集数据。若采用“后复权”的方式,以后获得新数据可以追加的方式进行,减少维护成本;
  3. 将 while 循环修改为 get_data() 对象,这句话是提升效率关键,之前版本没有,后来新增;
  4. 另外要注意,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 库。

总结

  1. 上述三个平台均可以满足我们入门级需求,根据个人喜好进行选择,如后续想对基金,期货做量化研究,不建议使用 baostock;专栏仅仅是A股,因此就选择 baostock 工具进行研究。
  2. 小伙伴们肯定不会仅仅研究一两支股票,如进行选股操作,因此需要下载大量的本地数据,所以这里有两种方式,一种下载保存为 csv 格式文件;另一种方式,用数据库的方式保存。

下一节,我将带大家学习保存数据的两种方式。