Узнайте, как применить одно из самых популярных приложений анализа основных компонентов с использованием текущих финансовых данных в Python.

Кривая доходности - это линия, которая отображает различные процентные ставки по облигациям с одинаковым кредитным качеством и разными сроками погашения. Утверждается, что государственные облигации имеют незначительный риск дефолта, поскольку правительство может просто занять больше денег для финансирования их выплат. Согласно теории ожиданий процентных ставок, кривая доходности состоит из двух аспектов:

1. Среднее рыночных ожиданий относительно будущих краткосрочных процентных ставок.

2. Термин премия - дополнительная компенсация, которую инвестор получает за владение долгосрочной облигацией. Это в основном из-за временной стоимости денег - 100 фунтов стерлингов сегодня стоят больше, чем завтра, из-за их потенциальной доходности за счет процентов. Следовательно, чтобы инвестиции с фиксированным доходом окупились в дополнительное время, которое инвестор должен расстаться со своими деньгами, эмитент облигаций должен заплатить инвестору некоторую дополнительную сумму.

Мы можем смоделировать эти аспекты кривой доходности, используя декомпозицию на главные компоненты. Данные имеют два основных свойства: шум и сигнал. Анализ главных компонентов направлен на извлечение сигнала и уменьшение размерности набора данных; путем нахождения наименьшего количества переменных, которые объясняют наибольшую часть данных. Это достигается путем преобразования данных из матрицы корреляции / ковариации в подпространство с меньшим количеством измерений, где все независимые переменные ортогональны ( перпендикулярны) друг к другу, то есть мультиколлинеарность отсутствует (предупреждение: это статистические свойства и не обязательно имеют экономическую интерпретацию).

Для этого анализа я буду использовать различные спотовые ставки по государственным облигациям Великобритании от 0,5 до 10 лет до погашения (предоставленные Банком Англии), чтобы увидеть, сможем ли мы смоделировать кривую доходности и ее наклон. При нахождении основных компонентов кривой доходности эконометристы придерживаются основной теории:

PC1 = константа ≈ долгосрочная процентная ставка ≈ R *

PC2 = наклон ≈ срочная премия

PC3 = кривизна

В scikit-learn есть функция для выполнения PCA, однако, чтобы лучше понять, давайте сделаем это вручную (на самом деле это не так)!

%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# Import Bank of England spot curve data from excel
df = pd.read_excel("GLC Nominal month end data_1970 to 2015.xlsx", 
                   index_col=0, header=3, dtypes = "float64", sheet_name="4. spot curve", skiprows=[4])
# Select all of the data up to 10 years
df = df.iloc[:,0:20]
df.head()

После импорта необходимых модулей и импорта данных спот-кривой из Банка Англии, мы можем видеть в DataFrame, что есть некоторые значения nan из-за отсутствия данных. Мы можем отказаться от них, поскольку они не сильно повлияют на анализ.

Следующим шагом является стандартизация данных в z-значениях, предполагая, что среднее значение равно 0, а дисперсия - 1. Мы можем сделать это, используя формулу:

Затем мы формируем ковариационную матрицу из стандартизованных данных с помощью numpy. Хотя корреляционные матрицы чаще используются в финансах, из-за стандартизации наших данных корреляционная матрица и ковариационная матрица фактически дадут одинаковый результат. Это потому, что корреляционная матрица - это просто стандартизованная ковариационная матрица.

Затем мы можем использовать пакет linalg.eig из numpy для создания собственных значений и собственных векторов из матрицы. Это выполняет собственное разложение наших стандартизованных данных. Собственные значения - это скаляры линейного преобразования, примененного в np.linalg.eig. Мы можем использовать собственные значения, чтобы найти долю общей дисперсии, которую каждый главный компонент объясняет с помощью этой формулы:

# Perform eigendecomposition
eigenvalues, eigenvectors = np.linalg.eig(corr_matrix_array)
# Put data into a DataFrame
df_eigval = pd.DataFrame({"Eigenvalues":eigenvalues}, index=range(1,21))

# Work out explained proportion 
df_eigval["Explained proportion"] = df_eigval["Eigenvalues"] / np.sum(df_eigval["Eigenvalues"])
#Format as percentage
df_eigval.style.format({"Explained proportion": "{:.2%}"})

Собственные векторы являются коэффициентами этих линейных преобразований, оставляя направление неизменным. Эта диаграмма и уравнение должны помочь визуально объяснить концепцию:

Чтобы сформировать временной ряд для основных компонентов, нам просто нужно вычислить скалярное произведение между собственными векторами и стандартизованными данными.

principal_components = df_std.dot(eigenvectors)
principal_components.head()

Когда мы наносим на график первую главную составляющую, мы видим, что она очень похожа на фактическую 10-летнюю кривую доходности. Это имеет смысл, поскольку согласно нашим собственным значениям первая главная компонента объясняет 98% данных.

Второй главный компонент представляет собой наклон - он должен коррелировать с наклоном фактической кривой доходности. Один из способов расчета наклона - 10-летняя спот-ставка минус 2-летняя спотовая ставка.

df_s = pd.DataFrame(data = df)
df_s = df_s[[2,10]]
df_s["slope"] = df_s[10] - df_s[2]
df_s.head()

Просто при визуальном осмотре мы видим, что наклон почти идентичен нашему второму основному компоненту. Проверим корреляцию:

np.corrcoef(principal_components[1], df_s[“slope”])
array([[1.        , 0.95856134],
       [0.95856134, 1.        ]])

При проведении корреляции между вторым главным компонентом и наклоном 10Y-2M кривой доходности высокая корреляция 0,96 показывает нам, что второй главный компонент, на самом деле, представляет наклон!

Спасибо за внимание! Пожалуйста, не стесняйтесь оставлять комментарии для любых идей, которые могут у вас возникнуть. Полную версию Jupyter Notebook, содержащую исходный код, который я использовал для этого проекта, можно найти в моем репозитории Github.

Использованная литература:

[1] Александр, Кэрол, (2008). «Анализ рыночных рисков II, Практическая финансовая эконометрика».

[2] Адонго, Феликс Атанга и др., 2018. Анализ основных компонентов и факторных показателей макроэкономических показателей. Доступно по адресу: https://pdfs.semanticscholar.org/8736/5855217edbc53e5e29c5c5872db7efb907cc.pdf

Отказ от ответственности: все мнения, выраженные в этой статье, принадлежат мне и не никоим образом связаны с Vanguard или какой-либо другой финансовой организацией. Я не трейдер и не зарабатываю на методах, использованных в этой статье. Это не финансовый совет.