Appearance
股票数据获取-差异化分析常用股票数据接口
差异化分析常用股票数据接口
前言
上一节我们了解了Pandas获取数据的方法和特性。不过Pandas获取数据速度上有点慢,本小节我们再扩展介绍几个常用获取股票交易数据的接口。接下来我们以差异化对比的方式来分析下Tushare、AkShare获取股票交易数据的方法。
Tushare 获取股票数据
Tushare
是一个免费、开源的python财经数据接口包,从2014年作为开源项目发布至今,Tushare 提供的金融数据种类日趋丰富,而且技术资料也非常详细。
目前社区推出了Tushare Pro版本,这个版本相比于旧版本来说数据更加稳定、质量也更好了。现在社区主要维护Pro版本,旧版本仍然可以使用,只是社区不再维护这些数据获取接口。由于Tushare Pro版本部分接口设置了使用权限,这里我们分别介绍下旧版本和Pro版本股票数据获取的方法,以适应不同的读者。
首先无论是旧版还是Pro版本,在使用之前需要导入Tushare库,如下所示:
import tushare as ts
Tushare和pandas一样仅需要使用简单的API接口就可以获取到股票的交易数据,Tushare旧版中常用的获取股票交易数据的接口有ts.get_hist_data()
、ts.get_k_data()
,接下来分别介绍下这两个接口各自的特点。
我们使用get_hist_data()
接口来获取上证指数2017年1月1日至今的交易数据,接口的几个关键参数为:
- 第一个参数:6位数字股票代码,或者指数代码(sh表示上证指数、sz表示深圳成指、hs300表示沪深300指数、sz50表示上证50、zxb表示中小板 、cyb表示创业板);
- 第二个参数:start为开始日期,格式为YYYY-MM-DD形式的字符串;
- 第三个参数:end为结束日期,格式为YYYY-MM-DD形式的字符串;
- 第四个参数:ktype指定数据类型,D表示日k线、W表示周、M表示月、5表示5分钟、15表示15分钟、 30表示30分钟、 60表示60分钟,默认为D日K线;
- 第五个参数:retry_count为当网络异常后重试次数,默认为3;
- 第六个参数:pause为重试时停顿秒数,默认为0。
打印查看返回的交易数据概览信息和行\列轴标签信息可知,get_hist_data()
接口返回的列索引内容相比于DataReader()
接口更丰富,比如多了价格变动price_change、涨跌幅p_change、5日到20日的移动平均价、5日到20日移动平均量等,这些内容在pandas中单独使用调用相应的方法计算获取到,如下所示:
df_sh=ts.get_hist_data('sh',start='2017-01-01',end=datetime.datetime.now().strftime('%Y-%m-%d'))
print(df_sh.info())#查看交易数据概览信息
"""
<class 'pandas.core.frame.DataFrame'>
Index: 530 entries, 2019-03-08 to 2017-01-03
Data columns (total 13 columns):
open 530 non-null float64
high 530 non-null float64
close 530 non-null float64
low 530 non-null float64
volume 530 non-null float64
price_change 530 non-null float64
p_change 530 non-null float64
ma5 530 non-null float64
ma10 530 non-null float64
ma20 530 non-null float64
v_ma5 530 non-null float64
v_ma10 530 non-null float64
v_ma20 530 non-null float64
dtypes: float64(13)
memory usage: 58.0+ KB
None
"""
print(df_sh.axes)# 查看行和列的轴标签
"""
[Index(['2019-03-08', '2019-03-07', '2019-03-06', '2019-03-05', '2019-03-04',
'2019-03-01', '2019-02-28', '2019-02-27', '2019-02-26', '2019-02-25',
...
'2017-01-16', '2017-01-13', '2017-01-12', '2017-01-11', '2017-01-10',
'2017-01-09', '2017-01-06', '2017-01-05', '2017-01-04', '2017-01-03'],
dtype='object', name='date', length=530), Index(['open', 'high', 'close', 'low', 'volume', 'price_change', 'p_change',
'ma5', 'ma10', 'ma20', 'v_ma5', 'v_ma10', 'v_ma20'],
dtype='object')]
"""
另外DataReader()
接口返回的数据行顺序是按日期从2017-01-03到2019-03-08排列的,而get_hist_data()
接口返回的数据行顺序刚好相反,DataReader()
接口返回的数据行索引为datetime64[ns]类型,而get_hist_data()
接口返回的数据行索引为object,我们可以使用sort_index()
方法调整排序,使用to_datetime
方法把字符类型行索引转换成datetime类型,如下所示:
df_sh.index = pd.to_datetime(df_sh.index)
df_sh.sort_index(inplace=True)
print(df_sh.axes)# 查看行和列的轴标签
"""
[DatetimeIndex(['2017-01-03', '2017-01-04', '2017-01-05', '2017-01-06',
'2017-01-09', '2017-01-10', '2017-01-11', '2017-01-12',
'2017-01-13', '2017-01-16',
...
'2019-02-25', '2019-02-26', '2019-02-27', '2019-02-28',
'2019-03-01', '2019-03-04', '2019-03-05', '2019-03-06',
'2019-03-07', '2019-03-08'],
dtype='datetime64[ns]', name='date', length=530, freq=None), Index(['open', 'high', 'close', 'low', 'volume', 'price_change', 'p_change',
'ma5', 'ma10', 'ma20', 'v_ma5', 'v_ma10', 'v_ma20'],
dtype='object')]
"""
以上可知get_hist_data()
接口的优点是除返回基本的开盘价(open)、最高价(high)、收盘价(close)等数据外,还包括涨跌幅、均价等指标数据,但是它的缺点是不能获取股票自上市以来的所有日线数据。于是另一个get_k_data
接口登场了,它获取数据的速度更快些,可以返回每一只股票从上市开始到当前交易日的所有日线数据,如下所示:
#get_hist_data 未返回2008年数据
df_sh=ts.get_hist_data('sh',start='2008-01-01',end=datetime.datetime.now().strftime('%Y-%m-%d'))
print(df_sh.head())
"""
open high close ... v_ma5 v_ma10 v_ma20
date ...
2019-03-08 3038.3 3075.1 2969.9 ... 5.3e+06 4.9e+06 3.7e+06
2019-03-07 3103.7 3129.9 3106.4 ... 4.9e+06 4.7e+06 3.4e+06
2019-03-06 3060.4 3103.8 3102.1 ... 4.4e+06 4.4e+06 3.2e+06
2019-03-05 3019.9 3055.0 3054.2 ... 4.2e+06 4.1e+06 3.0e+06
2019-03-04 3015.9 3090.8 3027.6 ... 4.5e+06 3.9e+06 2.9e+06
[5 rows x 13 columns]
"""
print(df_sh.tail())
"""
open high close ... v_ma5 v_ma10 v_ma20
date ...
2016-09-13 3025.0 3029.7 3023.5 ... 1.7e+06 1.7e+06 1.7e+06
2016-09-12 3037.5 3040.9 3022.0 ... 1.7e+06 1.7e+06 1.7e+06
2016-09-09 3095.4 3101.8 3078.8 ... 1.6e+06 1.6e+06 1.6e+06
2016-09-08 3089.9 3096.8 3095.9 ... 1.7e+06 1.7e+06 1.7e+06
2016-09-07 3091.3 3105.7 3091.9 ... 1.9e+06 1.9e+06 1.9e+06
[5 rows x 13 columns]
"""
#get_k_data 返回2008年数据
df_sh=ts.get_k_data('sh',start='2008-01-01',end=datetime.datetime.now().strftime('%Y-%m-%d'))
print(df_sh.head())
"""
date open close ... low volume code
0 2008-01-02 5265.0 5272.8 ... 5201.9 7.7e+07 sh
1 2008-01-03 5269.8 5319.9 ... 5211.1 9.9e+07 sh
2 2008-01-04 5328.4 5361.6 ... 5318.5 8.1e+07 sh
3 2008-01-07 5357.4 5393.3 ... 5332.6 9.2e+07 sh
4 2008-01-08 5414.6 5386.5 ... 5344.6 1.0e+08 sh
[5 rows x 7 columns]
"""
print(df_sh.tail())
"""
date open close ... low volume code
2715 2019-03-04 3015.9 3027.6 ... 3006.9 5.3e+08 sh
2716 2019-03-05 3019.9 3054.2 ... 3009.4 4.2e+08 sh
2717 2019-03-06 3060.4 3102.1 ... 3050.1 5.6e+08 sh
2718 2019-03-07 3103.7 3106.4 ... 3075.0 5.8e+08 sh
2719 2019-03-08 3038.3 2969.9 ... 2969.6 5.8e+08 sh
[5 rows x 7 columns]
"""
差异化分析发现get_k_data()
接口返回的交易数据,索引为序号而非交易日期,因此我们需要进行简单的处理使它与get_hist_data()
接口返回的交易数据在格式上兼容,此处使用to_datetime()
方法将date列交易日期替换为行索引,然后使用drop()
方法将date列数据删除,以避免交易日期重复显示,如下所示:
df_sh.index = pd.to_datetime(df_sh.date)
df_sh.drop(axis=1, columns='date', inplace=True)
print(df_sh.head())
"""
open close high low volume code
date
2008-01-02 5265.0 5272.8 5295.0 5201.9 7.7e+07 sh
2008-01-03 5269.8 5319.9 5321.5 5211.1 9.9e+07 sh
2008-01-04 5328.4 5361.6 5372.5 5318.5 8.1e+07 sh
2008-01-07 5357.4 5393.3 5403.4 5332.6 9.2e+07 sh
2008-01-08 5414.6 5386.5 5480.1 5344.6 1.0e+08 sh
"""
关于pro
版本,使用前需要登陆官网注册账号以获取token,注册地址:https://tushare.pro/register?reg=243738 。不过部分接口设置了权限,需要达到一定的积分才能使用,比如获取指数每日行情index_daily()
接口,用户需要累积200积分才有权限可以调取。daily()
接口用于获取常用的股票行情数据,该接口无权限要求,下面以daily()
接口为例展示下tushare pro获取数据的方法,如下所示:
#设置token
token='your token'
pro = ts.pro_api(token)#初始化pro接口
#获取平安银行日行情数据
pa=pro.daily(ts_code='000001.SZ', start_date='20180101',
end_date='20190101')
print(pa.head())
"""
ts_code trade_date open ... pct_chg vol amount
0 000001.SZ 20181228 9.3 ... 1.1 576604.0 541571.0
1 000001.SZ 20181227 9.4 ... -0.2 624593.3 586343.8
2 000001.SZ 20181226 9.3 ... -0.4 421140.6 393215.1
3 000001.SZ 20181225 9.3 ... -0.8 586615.4 545235.6
4 000001.SZ 20181224 9.4 ... -0.3 509117.7 477186.9
"""
对比可知,daily()
接口的主要输入参数与旧版get_k_data()
和get_hist_data()
接口大体相同,包括股票代码、开始日期、结束日期。daily()
接口返回的数据格式与get_k_data()
接口大体相同,我们可以使用上文处理get_k_data()
接口的方法来调整daily()
接口返回的数据格式。
对于将序号形式的索引转换为交易日期形式的索引,此处介绍另一种方法。DatetimeIndex()也可以将字符类型转化成datetime64类型,等同于to_datetime()的效果。set_index()将指定的列作为索引,并且可以配置drop参数可删除该列,以避免重复。如下所示:
pa.trade_date = pd.DatetimeIndex(pa.trade_date)
pa.set_index("trade_date", drop=True, inplace=True)
print(pa.axes)
"""
[DatetimeIndex(['2018-12-28', '2018-12-27', '2018-12-26', '2018-12-25',
'2018-12-24', '2018-12-21', '2018-12-20', '2018-12-19',
'2018-12-18', '2018-12-17',
...
'2018-01-15', '2018-01-12', '2018-01-11', '2018-01-10',
'2018-01-09', '2018-01-08', '2018-01-05', '2018-01-04',
'2018-01-03', '2018-01-02'],
dtype='datetime64[ns]', name='trade_date', length=243, freq=None), Index(['ts_code', 'open', 'high', 'low', 'close', 'pre_close', 'change',
'pct_chg', 'vol', 'amount'],
dtype='object')]
"""
print(pa.head())
"""
ts_code open high ... pct_chg vol amount
trade_date ...
2018-12-28 000001.SZ 9.3 9.5 ... 1.1 576604.0 541571.0
2018-12-27 000001.SZ 9.4 9.5 ... -0.2 624593.3 586343.8
2018-12-26 000001.SZ 9.3 9.4 ... -0.4 421140.6 393215.1
2018-12-25 000001.SZ 9.3 9.4 ... -0.8 586615.4 545235.6
2018-12-24 000001.SZ 9.4 9.4 ... -0.3 509117.7 477186.9
[5 rows x 10 columns]
"""
AkShare获取股票数据
AkShare 是基于 Python 的开源金融数据接口库, 目的是实现对股票, 期货、 期权、基金、外汇、债券、 指数、数字货币等金融产品的基本面数据、实时和历史行情数据、衍生数据,从而以满足金融数据科学家, 数据科学爱好者在金融数据获取方面的需求。
这里我们选取股票相关的接口进行介绍。
AkShare提供了实时行情数据接口: stock_zh_a_spot
。该接口单次返回所有 A 股上市公司的实时行情数据使用方法,如下所示:
import akshare as ak
stock_df = ak.stock_zh_a_spot()
print(stock_df)
数据示例-实时行情数据,如下所示:
symbol code name trade pricechange changepercent buy \
0 sh600000 600000 浦发银行 12.920 -0.030 -0.232 12.920
1 sh600004 600004 白云机场 18.110 -0.370 -2.002 18.110
2 sh600006 600006 东风汽车 4.410 -0.030 -0.676 4.410
3 sh600007 600007 中国国贸 17.240 -0.360 -2.045 17.240
4 sh600008 600008 首创股份 3.320 -0.030 -0.896 3.310
... ... ... ... ... ... ...
3755 sh600096 600096 云天化 5.270 -0.220 -4.007 5.270
3756 sh600097 600097 开创国际 10.180 -0.120 -1.165 10.180
3757 sh600098 600098 广州发展 6.550 -0.040 -0.607 6.540
3758 sh600099 600099 林海股份 6.540 -0.150 -2.242 6.540
3759 sh600100 600100 同方股份 8.200 -0.100 -1.205 8.200
sell settlement open high low volume amount \
0 12.930 12.950 12.950 13.100 12.860 46023920 597016896
1 18.120 18.480 18.510 18.510 17.880 24175071 437419344
2 4.420 4.440 4.490 4.490 4.410 4304900 19130233
3 17.280 17.600 17.670 17.670 17.220 684801 11879731
4 3.320 3.350 3.360 3.360 3.300 8284294 27579688
... ... ... ... ... ... ...
3755 5.280 5.490 5.490 5.500 5.220 16964636 90595172
3756 10.190 10.300 10.220 10.340 10.090 1001676 10231669
3757 6.550 6.590 6.560 6.620 6.500 1996449 13098901
3758 6.580 6.690 6.650 6.680 6.530 1866180 12314997
3759 8.210 8.300 8.300 8.310 8.120 12087236 99281447
ticktime per pb mktcap nmc turnoverratio
0 15:00:00 6.984 0.790 3.792289e+07 3.631006e+07 0.16376
1 15:00:07 32.927 2.365 3.747539e+06 3.747539e+06 1.16826
2 15:00:02 15.926 1.207 8.820000e+05 8.820000e+05 0.21525
3 15:00:02 22.390 2.367 1.736555e+06 1.736555e+06 0.06798
4 15:00:07 22.912 1.730 1.887569e+06 1.600444e+06 0.17185
... ... ... ... ... ...
3755 15:00:00 56.728 1.566 7.523847e+05 6.963668e+05 1.28386
3756 15:00:00 17.552 1.434 2.452734e+05 2.303459e+05 0.44268
3757 15:00:00 25.476 1.059 1.785659e+06 1.785659e+06 0.07323
3758 15:00:00 540.496 3.023 1.433045e+05 1.433045e+05 0.85167
3759 15:00:07 -6.264 1.465 2.430397e+06 2.430397e+06 0.40782
AkShare提供了历史行情数据接口:stock_zh_a_daily。该接口单次返回具体某个 A 上市公司的所有历史行情数据,如下所示:
import akshare as ak
stock_df = ak.stock_zh_a_daily(symbol="sh600000", factor="")
print(stock_df)
数据示例-实时行情数据,如下所示:
open high low close volume
date
1999-11-10 29.50 29.80 27.00 27.75 174085100
1999-11-11 27.58 28.38 27.53 27.71 29403500
1999-11-12 27.86 28.30 27.77 28.05 15008000
1999-11-15 28.20 28.25 27.70 27.75 11921100
1999-11-16 27.88 27.97 26.48 26.55 23223100
... ... ... ... ...
2019-10-30 12.75 12.79 12.52 12.59 53734730
2019-10-31 12.68 12.70 12.50 12.51 33347533
2019-11-01 12.50 12.83 12.44 12.75 62705733
2019-11-04 12.75 12.89 12.69 12.74 49737996
2019-11-05 12.74 13.19 12.69 12.95 74274389
另外,还有历史分笔数据接口stock_zh_a_tick;股票指数实时行情数据接口 stock_zh_index_spot等,感兴趣的同学可以前往官网了解。
总结
本小节分别介绍了Tushare、AkShare获取股票交易数据的方法,它们都提供了多个获取数据的接口,通过差异化的对比分析,可以帮助同学们更好的区分各种接口的特点以及返回的数据格式的转换。
最后,给大家留一道思考题:
经过以上内容的学习,同学们根据自己的偏好更倾向于使用哪种获取股票数据的方法呢?另外大家还知道哪些平台也提供获取财经数据的API呢?
欢迎大家在留言区留言,我们一起讨论。