【时间序列分析】S04E04金融量化分析(上篇):股债指数数据的获取与整理

1.内容概述

从这一小节开始,我们将用三节课的时间,通过串联起前面所学习到的时间序列分析基础知识,进行最基础的量化投资实践。这三节课的内容安排是这样的:
1、上篇:首先学习如何获取和清洗相关金融数据,这里我们以沪深300指数和国债指数的历史数据为例。
2、中篇:学习利用时间序列分析的基本工具和方法计算股债指数数据的一些经典指标:年化收益率和波动率。
3、下篇:对股债配置和再平衡策略进行实战,强化相关工具和方法的应用。

当然了,我们这里只是借用金融量化分析作为一个应用背景,来实践我们所学习的基本知识,目的在于提升大家的兴趣,共同来开拓视野,而金融领域本身的策略和知识并不是我们真正关注的重点。

2.股债指数数据的获取

巧妇难为无米之炊,首先我们要解决的第一个实际问题肯定是股债指数数据的获取,这里我们分析两个最为典型的数据:

一个是股票指数数据,我们选取最常见和最主流的沪深300指数数据,获取从2002年1月4日至今的每日收盘价和日收益率所构成的时间序列数据;

另一个是债券指数数据,我们选取国债指数数据,获取从2003年2月24日至今的每日收盘价和日收益率所构成的时间序列数据。

我们这里不用python爬虫来获取上述数据,毕竟这不是我们讨论的重点,况且还有更为简便的方法,我们从网易财经上就可以直接下载到csv格式的相关数据:

沪深300指数历史数据:
沪深300(399300)历史交易数据_股票行情_网易财经

国债指数历史数据:
国债指数(000012)历史交易数据_股票行情_网易财经

在历史交易数据表右上角的查询按钮旁边,有一个“下载数据”的链接,可以下载csv格式的历史交易数据,其中就包含了收盘价,我们可以只选取这收盘价和收益率两个属性数据,得到类似下图的csv历史交易数据表:
图1.下载的csv格式沪深300指数历史数据

图1.下载的csv格式沪深300指数历史数据

3.数据的读取

此时,观察一下这个原始的下载数据,他就是关于收盘价和收益率的时间序列。我们心里大致是有谱的:肯定是通过pandas中的series或者dataframe数据结构来组织和处理这些时间序列数据。

首先从csv文件中读取这些数据,我们只关注日期、收盘价和收益率这三个属性,读取后会得到一个dataframe结构对象。

我们将沪深300指数数据的文件命名为399300.csv,并且将他放在程序文件的相同路径下。

代码片段:

import pandas as pd

df = pd.read_csv('399300.csv',encoding='gbk')[['date', 'close','change']]
print(df)

运行结果:

           date      close
0     2019/5/13  3668.7255
1     2019/5/10  3730.4513
2      2019/5/9  3599.7001
3      2019/5/8  3667.4574
4      2019/5/7  3720.6684
5      2019/5/6  3684.6168
6     2019/4/30  3913.2110
7     2019/4/29  3900.3339
8     2019/4/26  3889.2748
9     2019/4/25  3941.8160
10    2019/4/24  4030.0887
11    2019/4/23  4019.0053
12    2019/4/22  4025.6109
13    2019/4/19  4120.6078
14    2019/4/18  4072.0753
15    2019/4/17  4087.2398
16    2019/4/16  4085.7891
17    2019/4/15  3975.5244
18    2019/4/12  3988.6168
19    2019/4/11  3997.5778
20    2019/4/10  4085.8470
21     2019/4/9  4075.4301
22     2019/4/8  4057.2286
23     2019/4/4  4062.2309
24     2019/4/3  4022.1566
25     2019/4/2  3971.2852
26     2019/4/1  3973.9280
27    2019/3/29  3872.3412
28    2019/3/28  3728.3953
29    2019/3/27  3743.3878
...         ...        ...
4178  2002/2/28  1244.6000
4179  2002/2/27  1256.0000
4180  2002/2/26  1253.1200
4181  2002/2/25  1254.6100
4182   2002/2/8  1235.0900
4183   2002/2/7  1241.0200
4184   2002/2/6  1216.7900
4185   2002/2/5  1246.8400
4186   2002/2/4  1236.9700
4187   2002/2/1  1215.7400
4188  2002/1/31  1221.7600
4189  2002/1/30  1145.8600
4190  2002/1/29  1140.3800
4191  2002/1/28  1112.8300
4192  2002/1/25  1189.4300
4193  2002/1/24  1189.5800
4194  2002/1/23  1183.1500
4195  2002/1/22  1109.9900
4196  2002/1/21  1108.6100
4197  2002/1/18  1149.4800
4198  2002/1/17  1152.1500
4199  2002/1/16  1201.8800
4200  2002/1/15  1186.4300
4201  2002/1/14  1205.1500
4202  2002/1/11  1249.8100
4203  2002/1/10  1281.2600
4204   2002/1/9  1272.6500
4205   2002/1/8  1292.7100
4206   2002/1/7  1302.0800
4207   2002/1/4  1316.4600

4.数据的整理

4.1.存在的问题

现在我们成功的从文件中读取了沪深300指数的历史数据。但是我们发现,这些原始数据中还是存在着一些问题:

问题一:这里面的时间是倒排的。也就是说最新时间对应的数据在最前面,而最老的数据却在后面,这个和我们所需要的正好相反。因此我们需要进行逆序调整,把老的数据放在前面,而把最新的数据放在最后。

问题二:这并不是一个严格意义上的时间序列。因为此时的索引是流水ID号,而不是日期类型数据,日期存放在了一个属性列当中。

问题三:日期数据是字符串类型,无法直接进行计算处理。因此为了方便后续的处理,我们需要将字符串类型的日期数据转换成pandas中的时间戳类型,并将此作为时间序列的索引。

4.2.问题的解决

针对这三个问题,我们要进行一下数据的清洗和处理,获得符合我们要求的时间序列数据。当然,这些操作都不难,大部分的基础知识我们在前面几节的内容中都已经讲解过了,我们来看一下代码:

代码片段:

import pandas as pd

df = pd.read_csv('399300.csv', encoding='gbk')
df = df.reindex(index=df.index[::-1])
df.set_index('date', inplace=True)
date_index = pd.DatetimeIndex(df.index)
ser = df.reindex(index=date_index)['close']

print(ser)

针对这段代码,我们还是先来逐行分析和讲解一下:

第03行:读取csv格式的数据文件,形成dataframe类型对象df;

第04行:将数据逆序排列,解决了我们的第一个问题;

第05行:将时间列设置为索引,解决了我们的第二个问题;

第06行-第07行:将字符串类型的时间字符串转换成pandas中的时间戳类型,并且我们只选取收盘价数据,最终得到一个series类型的时间序列。

我们来看看程序运行的结果:

top Created with Sketch.