Skip to content
On this page

股票数据获取-差异化分析常用股票数据接口


差异化分析常用股票数据接口

前言

上一节我们了解了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呢?

欢迎大家在留言区留言,我们一起讨论。