【量化交易笔记】1.数据来源

本文介绍了金融数据在量化交易中的重要性,特别是A股数据。文中提到了几个主要的国内数据平台,包括baostock、tushare和akshare,对比了它们的优缺点和使用方法。通过PythonAPI,展示了如何从这些平台获取历史K线数据,并讨论了复权类型的选择。此外,文章还提及了数据保存的两种方式,为后续的量化研究打下基础。
摘要由CSDN通过智能技术生成

简介

数据是机器学习的核心,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_codetrade_dateopenhighlowclosepre_closechangepct_chgvolamount
5492600000.SH2000010424.9825.7824.7525.5724.750.823.310044961.00113946.783
5491600000.SH2000010525.5725.9825.1525.2825.57-0.29-1.130052528.00134465.427
5490600000.SH2000010625.1826.3025.0525.9925.280.712.810062297.00160059.798
5489600000.SH2000010726.3027.5026.1226.9025.990.913.5000213553.00575751.082
5488600000.SH2000011027.0027.8526.7127.2526.900.351.3000165397.00450453.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 ak
    df = ak.stock_zh_a_hist(symbol="300750", period="daily", start_date="20210101", end_date='20220715', adjust="qfq")
    print('AKshare行情获取\n',df)    
日期开盘收盘最高最低成交量成交额振幅涨跌幅涨跌额换手率
02000-01-0424.9825.5725.7824.7544960113946000.04.163.310.821.41
12000-01-0525.5725.2825.9825.1552528134465000.03.25-1.13-0.291.64
22000-01-0625.1825.9926.3025.0562296160059000.04.942.810.711.95
32000-01-0726.3026.9027.5026.12213553575751000.05.313.500.916.67
42000-01-1027.0027.2527.8526.71165397450453000.04.241.300.355.17

这个返回

的字段是中文的。
‘日期’, ‘开盘’, ‘收盘’, ‘最高’, ‘最低’, ‘成交量’, ‘成交额’, ‘振幅’, ‘涨跌幅’, ‘涨跌额’, ‘换手率’

其他平台

yfinace – yahoo财经数据获取,需要使用代理访问。
easyquotation-- python实时获取新浪/腾讯的全市场行情,无法获取历史数据
efinance – 用于获取股票、基金、期货、债券数据的免费开源 Python 库。

总结

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

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

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值