尝试对利率掉期数据进行PCA分析(多元时间序列)

问题描述 投票:1回答:1

我有一个数据集,在过去一年中有20种不重叠的不同掉期利率(spot1y,1y1y,2y1y,3y1y,4y1y,5y2y,7y3y,10y2y,12y3y ...)。

我想使用PCA /多元回归并查看残差,以确定曲线上哪些扇区便宜/丰富。有人对此有经验吗?我已经完成了PCA,但是没有时间序列。理想情况下,我希望以美元建模与第一个数字相似的模型。https://plus.credit-suisse.com/rpc4/ravDocView?docid=kv66a7

谢谢!

time-series regression pca finance
1个回答
0
投票

以下是一些大招可以帮助您回答问题。另外,这是CS的精妙分析:)

让我们成为pythonistas并使用NumPy。您可以将数据集想象为20x261float数组。开始的第一个地方是creating the array。假设您有一个CSV文件永久存储原始数据。这样,加载数据的第一步就很简单了:

import numpy

x = numpy.loadtxt("path/to/my/file")

对象x是我们的原始时间序列矩阵,我们验证了x.shape == (20, 261)的真实性。下一步是将该数组转换为其协方差矩阵。无论是已经对原始数据进行了处理还是必须进行处理,第一步都是将每个时间序列集中在均值上,例如:

x_centered = x - x.mean(axis=1, keepdims=True)

此步骤的目的是帮助简化任何必要的缩放操作,这是一个非常好的习惯,通常不应该跳过。对x.mean的调用使用参数axiskeepdims来确保每个(例如spot1yr的时间序列,...)的均值以it's>”为中心。

下一步是对x进行平方和缩放以产生掉期利率协方差数组。对于x之类的二维数组,有两种方法将其平方:一种方法导致261x261数组,另一种方法导致20x20数组。这是我们感兴趣的第二个数组,适用于我们目的的平方程序是:

x_centered_squared = numpy.matmul(x_centered, x_centered.transpose())

然后,根据统计上下文,可以在1/2611/(261-1)之间进行选择,如下所示:

x_covariance = x_centered_squared * (1/261)

数组x_covariance中有一个条目,说明每个掉期利率如何与自身发生变化,以及如何随其他任何掉期利率发生变化。用线性代数术语来说,它是一个对称算子,它描述了每个掉期利率的利差。

线性代数

告诉我们,该数组可以分解为与其相关的本征谱,该频谱中的元素为标量向量对或本征值本征向量对。在您共享的分析中,x_covariance的特征值在图表2中作了说明,并说明了百分比差异。要生成类似于展览2的图的数据(您将一直希望将其提供给PCA的读者),您只需将每个特征值除以它们的总和,然后将每个特征值乘以100.0。由于x_covariance的方便属性,一种合适的计算频谱的方法如下:
vals, vects = numpy.linalg.eig(x_covariance)

我们现在可以谈论残差了!这是它们的定义(带有我们的名称空间):residuals_ij = x_ij − reconstructed_ij; i = 1:20; j = 1:261。因此,对于x中的每个数据,都有一个对应的残差,要找到它们,我们需要恢复reconstructed_ij数组。我们可以逐列进行此操作,对每个x_i进行操作,并更改基础运算符以生成每个reconstructed_i,可以将其视为原始或原始基础的proper subspace

中存在的内容。该分析描述了一种改进的Gram-Schmidt方法,用于计算我们需要的基算符的变化,该方法可以确保此适当子空间的基数[[是正交集。[我们将在方法中做的是取对应于三个最大特征值的特征向量,并将它们转换为三个相互正交的向量xyz。在网上研究活跃的discussionsquestions,以开发适用于各种实际应用的Gram-Schmidt过程,但为简单起见,让我们手动进行分析:

x = vects[0] - sum(0) xx = numpy.dot(x, x) y = vects[1] - sum( (numpy.dot(x, vects[1]) / xx) * x ) yy = numpy.dot(y, y) z = vects[2] - sum( (numpy.dot(x, vects[2]) / xx) * x, (numpy.dot(y, vects[2]) / yy) * y )

在此步骤之前或之后实施规范化是合理的,当然应该从数据中获悉。

现在有了原始数据,我们隐式地假设基础是标准的,我们需要{e1, e2, ..., e20}{x,y,z}之间的映射,由[]给出]

ch_of_basis = numpy.array([x,y,z]).transpose()

这可用于计算每个reconstructed_i,如下所示:

reconstructed = [] for measurement in x.transpose().tolist(): reconstructed.append(numpy.dot(ch_of_basis, measurement)) reconstructed = numpy.array(reconstructed).transpose()

然后通过减法得到残差:

residuals = x - reconstructed

显然,该流程可能需要进一步调整,但这是如何计算所有残差的要点。要获取该周期性条形图,请获取residuals中每行的平均值。    
© www.soinside.com 2019 - 2024. All rights reserved.