Python金融数据分析(原书第2版)
上QQ阅读APP看书,第一时间看更新

1.4 对时间序列数据进行金融分析

在本节中,我们将会处理用于金融分析的时间序列数据,并可视化它们的一些统计特性。

1.4.1 绘制收益率图

评估证券业绩的经典标准之一是其在前期的收益,我们可以用pandas中的pct_change来进行简单的计算,即计算DataFrame中每一行相对于前一行的百分比变化。

在下面的示例中,我们使用荷兰银行股票数据绘制了一个简单的每日百分比收益率图:

025-02

每日百分比收益率如图1-5所示。

026-01

图 1-5

quandl.get()函数中,我们将股票代码的后缀设为4,指定仅检索数据集的第四列,即收盘价格。在对pct_change的调用中,period参数指定了要计算百分比变化所移动的周期数,在默认情况下为1。

005-01除了在股票代码中使用后缀表示法,我们还可以通过传递column_index参数和列的索引来指定要下载数据集的列。比如,quandl.get ('EURONEXT/ABN.4')quandl.get('EURONEXT/ABN', column_index=4)的作用是相同的。

1.4.2 绘制累积收益率图

为了了解我们的投资组合表现如何,可以将其一段时间内的收益相加,用pandascumsum函数返回一个DataFrame的累计和。

在下面的例子中,我们绘制了之前计算的ABN每日收益的累计和:

026-02

运行结果如图1-6所示。

027-01

图 1-6

1.4.3 绘制直方图

直方图可以告诉我们数据是如何分布的,在本例中,我们想知道的是ABN每日收益的分布情况。我们在一个容量大小为50的DataFrame上使用hist()命令:

027-02

结果如图1-7所示。

027-03

图 1-7

pandas的DataFrame中存在多个数据列时,hist()命令将自动在每个单独的绘图单元上绘制所有直方图。

使用describe()命令来总结数据集分布的中心趋势、分散性和形状:

028-01

从直方图中可以看出,收益的分布均值趋向于0.0(确切地说是0.000499);除了微小的向右倾斜,数据看起来相当对称且符合正态分布;标准差为0.016701;通过百分位数的值我们可以看到,数据中25%的值低于–0.007992,50%的值低于0.000584,75%的值低于0.008777

1.4.4 绘制波动率图

要分析收益的分布,有一种方法是测量其标准差,这是对数据平均值离散度的度量。如果过去收益的标准差很高,则表示股票价格历史波动较大。

pandasrolling()命令可以帮助我们可视化一段时间内一个特定时间序列的变化,使用std()命令计算ABN数据集收益百分比变化的标准差,它会返回一个DataFrame或Series对象,可用于绘制图表。示例如下:

028-02

运行结果如图1-8所示。

028-03

图 1-8

我们的原始时间序列数据集不包括周末和公共假日,在使用rolling()命令时必须考虑到这一点。df.asfreq()命令将按每日的频率重新索引时间序列数据,创建新的索引以代替缺少的部分。值为ffillmethod参数表示:在重新索引期间,我们将前向传递上一个有效的观测值,而不是丢失的值。

rolling()命令中,我们指定了一个值为30的window参数,这是用于计算统计数据的观测数。换句话说,每个周期的标准差是以样本大小为30计算的。由于前30行的样本大小不足以计算标准差,我们将min_periods指定为30,从而在计算过程中把这些数据排除在外。

我们选择30作为周期,是为了让结果近似等于每个月收益的标准差。注意:选择更宽的窗口周期意味着要测量的数据会更少。

1.4.5 Q-Q图

Q-Q(分位数–分位数)图是概率分布图,用来比较其中的两个分位数。如果两个分布是线性相关的,那么Q-Q图中的点将趋近于落在一条直线上。Q-Q图常用于检验数据是否符合正态分布。

scipy.stats模块的probplot()函数可以计算和显示概率图的分位数,显示数据的最佳拟合线。在下面的示例中,我们将计算荷兰银行股票数据集中,每日收益的百分比变化,然后绘制Q-Q图:

029-01

运行结果如图1-9所示[1]

029-02

图 1-9

当所有点完全落在红线上时,意味着数据的分布与正态分布完美对应。大多数数据在分位数值介于–2和+2之间时接近于完美相关,而在这个范围之外,分布的相关性开始有差异,特别是在尾部有更多的负偏态。

1.4.6 下载多个时间序列数据

我们在quandl.get()命令的第一个参数中,将单个Quandl代码作为字符串对象传递,从而完成单个数据集的下载。如果要下载多个数据集,可以将单个的Quandl代码换成Quandl代码列表。

在下面的例子中,我们来研究三种银行股票的价格——荷兰银行、桑坦德银行和卡斯银行。这一次,我们仅将2016年至2017年收盘价格下载下来并存储在df变量中:

030-01

运行结果如图1-10所示。

030-02

图 1-10

005-02默认情况下,quandl.get()返回的是每日价格,我们还可以指定数据集下载其他类型的数据,比如,示例中的collapse='monthly'代码表明下载的是每月价格。

1.4.7 显示相关矩阵

相关性表示统计关联,用来衡量两个变量之间线性关系的密切程度。我们可以对两个时间序列数据集的返回值执行相关性计算,从而获得一个介于–1和1之间的值。相关性为0表示这两个时间序列的返回值之间没有任何关系,一个接近1的高相关值表示这两个时间序列数据的返回值倾向于一起移动,接近–1的低相关值表示这两个时间序列的返回值倾向于向彼此相反的方向移动。

pandas中,用corr()命令计算DataFrame两个列之间的相关性,并将这些值作为矩阵输出。在前面的例子中,我们得到了三个数据集并储存在DataFrame的df变量中,使用以下命令来输出这些返回值之间的相关矩阵:

031-01

从输出的相关矩阵来看,在2016~2017年这两年间,荷兰银行和桑坦德银行这两只股票的相关性较高,达到了0.809824。

在默认情况下,corr()命令使用Pearson相关系数计算两个数据集之间的相关性,这相当于调用corr(method='pearson')。除此之外,我们还可以输入kendallspearman来得到Kendallτ和Spearman秩相关系数。

1.4.8 绘制相关性图

我们也可以用rolling()命令来实现相关性的可视化。在下面这个例子中,使用从Quandl下载的2016~2017年ABN和SANTA的收盘价格——这两个数据集已经储存在DataFrame的df变量中,通过以下代码得到它们的滚动相关性:

031-02

运行结果如图1-11所示。

032-01

图 1-11

df_filled变量包含一个DataFrame,它的索引按日为频率重新排列,并在准备rolling()命令时前向填充缺失的值。daily_changes这个DataFrame会存储每日收益的百分比变化,它的列被提取到一个Series对象中,分别作为abn_returnssanta_returnswindow变量在这个两年数据集中存储每年的平均天数,这个变量作为rolling()命令的参数,表示我们将计算一年的滚动相关性。min_periods参数表明,只在有完整的样本可供计算时,程序才会计算其相关性。在本例中,df_corrs数据集中没有第一年的相关值。最后,通过plot()命令就可以显示2017年全年每日收益的滚动相关性图。

1.4.9 简单的移动平均线

时间序列数据分析有一个通用的技术指标——移动平均线,mean()函数可用于计算rolling()命令中给定窗口的平均值。举个例子,5天简单移动平均线(SMA)是过去五个交易日的平均价格(每天计算一段时间)。同样,我们可以计算30天移动平均线,将这两个移动平均线放在一起可以用来产生交叉信号。

在下面的例子中,我们下载了荷兰银行的每日收盘价并计算了短期和长期的SMA,将其显示在图像上:

033-01

结果如图1-12所示。

033-02

图 1-12

我们用5天的数据作为短期SMA,30天的数据作为长期SMA,min_periods参数用来排除样本容量不足的第一行,df_sma变量是一个新创建的用于存储SMA计算结果的pandas DataFrame。然后我们绘制一个12英寸×8英寸的图像,从图1-12我们可以看出短期SMA和长期SMA有一些相交的点,技术分析师往往会用交叉点来描绘趋势和买卖信号。当然,5和10的窗口周期只是一个参考值,你可以根据自己的需要调整这个值的大小。

1.4.10 指数移动平均

另一种计算移动平均的方法是指数移动平均(EMA)。回想一下,简单的移动平均线在窗口周期中给价格分配了相等的权重。然而,在EMA中,最近的价格分配的权重将高于以前的价格,而这个权重是按指数分配的。

pandas DataFrame中的ewm()命令提供了指数加权函数,其中span参数指定了这个衰减过程的窗口周期。ABN数据集的EMA用以下代码来绘制:

034-01

运行结果如图1-13所示。

034-02

图 1-13

SMA和EMA的图模式大致相同,但由于EMA对近期数据的权重高于较早数据的权重,因此它对价格变化的反应会比SMA更敏感。

005-02除了不同的窗口周期之外,你还可以尝试使用SMA和EMA价格的组合来获得更多的信息。


[1]这里要先安装scipy库,方法和其他库相似,在命令行窗口中输入:pip install scipy。——译者注