Skip to content
On this page

股票数据获取-Pandas金融模块获取股票数据


Pandas金融模块获取股票数据

前言

在量化交易系统中,获取交易数据是制定量化策略的基础步骤,快速、便捷地得到可靠、真实的数据是量化分析过程中重点关注的要求。以股票交易数据为例,目前在通用行情软件上可以直接以文件方式导出股票交易数据,但我们所期望的交易系统应该能够自动从服务器下载交易数据。

随着网络信息技术的不断发展,数据的获取渠道也越来越多,近几年比较火的是用网络爬虫技术爬取网上资源。很庆幸的是目前像雅虎财经、新浪财经等门户网站提供了免费的金融数据接口,同时像pandas库、Tushare这些Python第三方库提供了从财经网站获取股票数据的API接口,这么一来我们无需单独使用爬虫技术,仅仅调用API接口就可以轻松获取到股票数据了。

本小节先以强大的Pandas库为对象,介绍下Pandas金融数据模块获取股票数据的方法以及数据的特性。

Panads获取股票数据

pandas库在金融量化分析中优势明显,它提供了专门处理金融数据的模块,早期的时候该模块为pandas.io,目前已经迁移到了pandas-datareader包,所以在使用之前需要导入pandas-datareader模块,如下所示:

import pandas_datareader.data as web

此处将pandas_datareader.data类取名为web,有利于代码的精简,因此具体获取股票数据的接口为web.DataReader()。下面分别介绍下接口的几个关键参数:

  • 第一个参数:指定股票代码,如果是苹果公司这样的国外股票,股票代码直接用"AAPL"缩写表示,如果是国内A股市场的股票代码,则需要在代码末尾加上市场代码,比如上证股票在股票代码后面加上.SS,深圳股票在股票代码后面加上.SZ(创业板、中小板为深圳交易所下子板块)。
  • 第二个参数:指定股票数据的网站,DataReader可从多个金融网站上获取到股票数据,"yahoo"指定从雅虎网站获取股票数据,"google"指定从谷歌网站获取股票数据。
  • 第三、四个参数:指定股票数据的起始时间,默认是从2010年1月1日至今。

我们使用DataReader()接口指定从雅虎网站获取从2017.1.1日至今的上证指数交易数据,并打印查看前5行和尾部倒数5行的数据,如下所示:

import pandas_datareader.data as web
import datetime
#获取上证指数的2017.1.1日至今的交易数据
df_stockload = web.DataReader("000001.SS", "yahoo", datetime.datetime(2017,1,1), datetime.date.today())

print(df_stockload.head())  # 查看前几行
"""
              High     Low    Open   Close  Volume  Adj Close
Date                                                         
2017-01-03  3136.5  3105.3  3105.3  3135.9  141600     3135.9
2017-01-04  3160.1  3130.1  3133.8  3158.8  167900     3158.8
2017-01-05  3168.5  3154.3  3157.9  3165.4  174700     3165.4
2017-01-06  3172.0  3153.0  3163.8  3154.3  183700     3154.3
2017-01-09  3173.1  3147.7  3148.5  3171.2  171700     3171.2
"""
print(df_stockload.tail())  # 查看末尾几行
"""
              High     Low    Open   Close  Volume  Adj Close
Date                                                         
2019-03-04  3090.8  3006.9  3015.9  3027.6  525600     3027.6
2019-03-05  3055.0  3009.4  3019.9  3054.2  424100     3054.2
2019-03-06  3103.8  3050.1  3060.4  3102.1  555000     3102.1
2019-03-07  3129.9  3075.0  3103.7  3106.4  583800     3106.4
2019-03-08  3075.0  2969.6  3038.3  2969.9  577900     2969.9
"""

DataReader()接口返回的数据格式可知,股票交易数据为二维的DataFrame格式数据,包含行索引-时间、列索引-开盘价、最高价、最低价等,以及对应的数据值。接下来,分别查看交易数据的行/列索引信息以及数据的行列形状,如下所示:

print (df_stockload.columns)#查看列索引信息
"""
Index(['High', 'Low', 'Open', 'Close', 'Volume', 'Adj Close'], dtype='object')
"""
print (df_stockload.index)#查看行索引信息
"""
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)
"""
print(df_stockload.shape)#查看形状
"""
(530, 6)
"""

接下来查看各列交易数据描述性的统计信息,如最小值、最大值、均值、标准差等,如下所示:

print (df_stockload.describe())#查看各列数据描述性统计
"""
         High     Low    Open   Close    Volume  Adj Close
count   530.0   530.0   530.0   530.0     530.0      530.0
mean   3079.9  3044.5  3061.5  3064.8  172601.3     3064.8
std     281.0   286.0   283.5   284.1   62788.0      284.1
min    2488.5  2440.9  2446.0  2464.4   88200.0     2464.4
25%    2802.3  2754.8  2776.8  2786.1  134200.0     2786.1
50%    3164.6  3134.3  3148.2  3153.9  159200.0     3153.9
75%    3290.1  3261.5  3274.5  3275.9  193600.0     3275.9
max    3587.0  3534.2  3563.6  3559.5  583800.0     3559.5
"""

接下来查看交易数据概览信息,如每列数据的类型、个数、是否存在缺失等等,如下所示:

print(df_stockload.info())#查看缺失及每列数据类型
"""
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 530 entries, 2017-01-03 to 2019-03-08
Data columns (total 6 columns):
High         530 non-null float64
Low          530 non-null float64
Open         530 non-null float64
Close        530 non-null float64
Volume       530 non-null int64
Adj Close    530 non-null float64
dtypes: float64(5), int64(1)
memory usage: 29.0 KB
None
"""

pandas封装了matplotlib绘图功能,因此我们可以在pandas中更直接、更简单的方式绘制数据曲线,在使用时需要导入matplotlib库中的pyplot模块,此处以绘制上证指数的收盘价为例,用可视化的方式了解下上证指数走势,如下所示:

import matplotlib.pyplot as plt

#绘制收盘价
df_stockload.Close.plot(c='b')
plt.legend(['Close','30ave','60ave'],loc='best')
plt.show()

绘制效果如下图所示,可以看到去年的行情整体属于熊市行情,从2月份开始指数一直处于下降趋势中,今年年后展开了一轮快速的反弹。

总结

本小节主要分析了Panads获取股票交易数据的方法,以及获取到的数据特点。其实还有不少好用的接口,下一节我们通过差异化的对比分析,帮助同学们更好的区分各种接口的特点以及返回的数据格式的转换。