
4.4 Python处理金融数据案例实战
金融数据是指金融行业所涉及的市场数据、公司数据、行业指数和定价数据等的统称。凡是与金融行业相关的数据都可以被归入金融市场的数据体系之中。在金融市场中,根据数据的频率,金融数据分为低频数据、高频数据和超高频数据三大类。
4.4.1 读取上证指数股票数据
Pandas库提供了专门从财经网站获取金融时间序列数据的API接口,可作为量化交易股票数据获取的另一种途径。该接口在urllib3库的基础上实现了以客户端身份访问网站的股票数据。
pandas-datareader包中的pandas_datareader.data.DataReader()函数可以根据输入的证券代码、起始日期和终止日期来返回所有历史数据。函数的第1个参数为股票代码,形式为“股票代码”+“对应股市”,其中上海证券交易所的股票需要在股票代码后面加上“.SS”,深圳证券交易所的股票需要在股票代码后面加上“.SZ”。第2个参数是数据来源,如雅虎、谷歌等网站,本节以从雅虎财经获取金融数据为例进行介绍。第3个、第4个参数为股票数据的起始时间。
这里需要使用datetime()函数、Pandas库和pandas-datareader包,还可以使用datetime.datetime.today()函数来调用程序当前的日期。
先导入相关的库,代码如下:

在上述代码中,pandas_datareader.data这个名称显然过长,因此给它起一个别名叫作pdr,这样在后文中使用pandas_datareader.data.DataReader()函数时,直接使用pdr.DataReader()函数即可。需要注意的是,这里在pandas_datareader中使用的是下画线“_”,而不是连接符“-”。
接下来,设置起始日期start_date和终止日期end_date,使用datetime.datetime()函数指向给定日期。例如,使用datetime.date.today()函数指向程序当前的日期,并将结果保存到一个名为stock_info的变量中,代码如下:

也可以直接设置起始日期start_date和终止日期end_date,再运行pdr.DataReader()函数并将其保存到变量中,代码如下:

下面使用head()函数查看金融数据的前5行记录,代码如下:

运行上述代码,输出结果如下所示。

可以看出,数据集的索引是Date(日期),共有High、Low、Open、Close等7列数据。
4.4.2 提取2020年8月数据
此外,虽然变量stock_info中包含2020年全年的数据,但是在不同的业务需求下,需要提取不同的数据。例如,可能只需要提取2020年8月的数据,也可能只需要提取2020年每个月月底的数据。
例如,提取2020年8月的数据,代码如下:

运行上述代码,只会输出2020年8月上证指数的前5条数据,输出结果如下所示。

如果只需要输出每个月最后一个交易日的上证指数数据,则可以使用resample()函数和last()函数,代码如下:

运行上述代码,输出结果如下所示。

如果想要计算每个月股票相关指标的平均数,则可以使用mean()函数,代码如下:

运行上述代码,输出结果如下所示。

4.4.3 填充非交易日缺失数据
下面来看一下时间序列数据中有缺失数据的操作。如果想要查看股票每日的价格信息,则可以使用resample()函数重采样每一天的数据,代码如下:

运行上述代码,输出结果如下所示。我们可以看出,2020年1月4日和1月5日的数据都为NaN。

下面使用ffill()函数对缺失数据进行填充,这里使用前一天的交易数据来填充,代码如下:

运行上述代码,输出结果如下所示。

也可以使用mean()函数对该列数据的平均数进行填充,代码如下:

运行上述代码,输出结果如下所示。

4.4.4 使用diff()函数计算数据偏移
Pandas库中的diff()函数用来将数据进行某种移动之后与原数据进行比较得出差异。例如,计算两个相邻交易日数据之间的一阶差分,代码如下:

运行上述代码,计算金融时间序列数据的一阶差分,输出结果如下所示。2020年1月2日的数据为NaN,是因为它的前一天(2020年1月1日)没有交易。同理,如果执行的是二阶差分,则2020年1月3日的数据也是NaN。

此外,对于时间序列数据,还可以使用pct_change()函数来计算指标的增长率,代码如下:

运行上述代码,输出结果如下所示。
