Анализ главных компонент (PCA) — один из популярных способов изучения взаимосвязей между доходностями активов и их оценке в финансовом анализе. Метод основан на разложении ковариационной матрицы доходностей: собственные векторы определяют направления факторов, а собственные числа показывают, сколько дисперсии объясняет каждый фактор.
PCA позволяет выделить доминирующие источники совместной изменчивости и отделить систематический риск от несистематического. Практическое применение охватывает задачи от хеджирования рыночного фактора до построения декоррелированных портфелей в статистическом арбитраже и стратегий риск-паритета (risk parity).
В основе анализа главных компонент лежат собственные числа и векторы матриц. Их экономическая интерпретация и вычислительная реализация определяют качество получаемых факторов и устойчивость основанных на них стратегий.
Математические основы собственных значений и векторов
Собственный вектор квадратной матрицы A — это ненулевой вектор v, который при умножении на A меняет только масштаб, но не направление. Масштаб задается собственным числом λ:
Av = λv
Геометрически это означает, что собственные векторы показывают направления, в которых данные имеют максимальную дисперсию при проекции, а собственные числа — величину этой дисперсии.
Для симметричных положительно определенных матриц (например, ковариационной матрицы доходностей) выполняются ключевые свойства:
- Все собственные числа вещественные и неотрицательные;
- Собственные векторы ортогональны друг к другу;
- Матрица диагонализируема: A = VΛV^T.
Эти свойства делают разложение собственных значений и векторов особенно полезной операцией для финансового анализа. Она позволяет декоррелировать активы, выявлять главные источники риска и строить факторные модели, где компоненты независимы и интерпретируемы.

Рис. 1: Собственные векторы как оси максимальной дисперсии. Красные стрелки показывают направления и масштаб собственных чисел на примере двумерного облака точек
Определение и геометрическая интерпретация
Первая главная компонента соответствует направлению наибольшей дисперсии данных. Вторая компонента ортогональна первой и захватывает максимум оставшейся дисперсии.
В финансовом контексте это означает: первая компонента обычно отражает общий рыночный фактор, вторая и третья — крупные секторальные изменения, либо изменения в инвестиционных стилях.
Свойства собственных векторов ковариационной матрицы
Собственные векторы ковариационной матрицы доходностей представляют собой портфели с единичной волатильностью и нулевой корреляцией между собой. Коэффициенты в векторе — это веса активов в таком портфеле.
Сумма собственных чисел равна следу ковариационной матрицы, то есть общей дисперсии системы. Доля i-го собственного числа в сумме определяет объясненную компонентой долю общей изменчивости.
SVD как численная основа PCA
Классическое собственное разложение ковариационной матрицы вычисляется по формуле:
X^T X / (n-1)
Такое разложение чувствительно к численному шуму при большом числе активов. Сингулярное разложение (Singular Value Decomposition, SVD) решает эту проблему напрямую на центрированной матрице доходностей.
Для матрицы доходностей X размером n × p (n наблюдений, p активов) выполняется:
X = UΣV^T
где:
- X — матрица доходностей размером n × p (n наблюдений, p активов);
- U — матрица левых сингулярных векторов, задает проекции наблюдений;
- Σ — диагональная матрица сингулярных чисел, связанные с дисперсией;
- V — матрица правых сингулярных векторов, направления главных компонент.
Главные компоненты получают как проекции исходных данных на правые сингулярные векторы:
Z=XV
Квадраты сингулярных чисел показывают дисперсию каждой компоненты. Деление на n−1 позволяет получить величину объясненной дисперсии, если данные центрированы по столбцам.
Таким образом, сингулярное разложение (SVD) одновременно позволяет:
- Определить направления наибольшей изменчивости данных;
- Количественно оценить, сколько дисперсии объясняет каждая компонента.
Это делает SVD мощным инструментом для анализа финансовых временных рядов и построения факторных моделей.
Сингулярное разложение vs классическое собственное разложение
Сингулярное разложение (SVD) вычисляется напрямую через матрицу данных X, а не через Xᵀ·X. Это снижает накопление ошибок округления, особенно если число признаков p значительно больше числа наблюдений n или при высокой коллинеарности данных.
На практике, для портфелей из 30–100 активов, разница в оценке малых собственных чисел между SVD и классическим разложением может достигать 10–30%. Малые собственные числа влияют на оценку менее значимых компонент и стабильность факторных моделей.
Центрирование данных и масштабирование
При SVD центрирование данных по столбцам обязательно, иначе первая компонента будет отражать сдвиг уровня, а не реальные направления изменчивости.
Кроме того, при визуализации кумулятивной дисперсии и выборе числа значимых компонент центрированные данные позволяют корректно оценить вклад каждой компоненты без искажения из-за среднего уровня цен.
А вот масштабирование или стандартизация (деление на стандартное отклонение) обычно не нужна при работе с доходностями — она искажает экономический смысл весов, делая их менее интерпретируемыми в финансовом контексте.
PCA на матрице доходностей активов
PCA применяется к матрице логарифмических или простых доходностей активов. Каждая строка — наблюдение во времени, каждый столбец — отдельный актив. Результатом разложения становятся ортогональные временные ряды — главные компоненты, объясняющие максимум ковариации.
Ковариационная матрица Σ доходностей симметрична и положительно полуопределена. Ее собственное разложение дает полный набор некоррелированных факторов.

Рис. 2: Для 20 крупнейших акций США первые три компоненты объясняют 55–65% общей дисперсии, 10 компонент — более 85%
Построение ковариационной матрицы и ее разложение
Ковариационная матрица вычисляется как:
(Xᵀ·X)/(n-1)
где:
- X — матрица центрированных данных (строки — наблюдения, столбцы — активы);
- n — число наблюдений.
Сингулярное разложение (SVD) дает те же правые сингулярные векторы V, что и разложение ковариационной матрицы. Это позволяет получать главные компоненты напрямую из данных и количественно оценивать, сколько дисперсии объясняет каждая компонента.
Если число активов превышает 100, рекомендуется использовать randomized SVD, которая ускоряет вычисления в 5–10 раз при погрешности менее 1e-6. Такой подход особенно полезен для больших портфелей или высокочастотных данных, когда классическое SVD становится медленным.
Главные компоненты как ортогональные портфели
Каждый собственный вектор V[:, i] можно рассматривать как портфель с весами по активам. Волатильность такого портфеля равна √λᵢ. Портфели некоррелированы друг с другом и имеют максимальную возможную дисперсию при данных ограничениях.
Сумма квадратов весов в каждом векторе равна 1, что обеспечивает нормировку. Положительные веса соответствуют длинным позициям, а отрицательные — коротким.
Дополнительно, такая интерпретация позволяет использовать главные компоненты для построения факторных портфелей и оценки системного риска.
Интерпретация главных компонент в финансовых временных рядах
На практике первые компоненты почти всегда отражают известные факторы риска. Структура коэффициентов (загрузок) стабильна на долгих интервалах, если активов достаточно много.

Рис. 3: Первая компонента — почти равновзвешенный длинный портфель (рыночный фактор). Вторая и третья выделяют сектора, к которым относятся акции
Первая компонента: рыночный фактор
Первая компонента сильно коррелирует с индексом SP500 — 0.9 и выше. Ее веса близки к рыночной капитализации или к равновзвешенному портфелю при широкой выборке.
Она отражает общий рыночный бета-риск. Для хеджирования она работает эффективнее, чем сам индекс, так как не содержит индивидуального шума отдельных акций.
Вторые и последующие компоненты: факторы секторов и инвестиционных стилей
Вторая компонента обычно противопоставляет технологический сектор остальному рынку. Третья компонента отражает разницу между финансовым сектором и потребительскими товарами.
На выборках более 100 активов компоненты с 2-й по 10-ю повторяют известные факторы Фама-Френча — например, факторы размера (SMB), стоимости (HML) и моментум — с корреляцией 0.6–0.85.
Шум и индивидуальный риск в остатке
После выделения главных компонент остаются только случайные колебания отдельных акций. Они представляют собой индивидуальный риск (идиосинкратический риск) и рыночный шум. Эти остатки не несут информации о системных факторах.
Компоненты после 20–30 часто имеют собственные числа близкие к уровню шума. Их временные ряды (оценки U[:, i] × √λᵢ) демонстрируют отсутствие автокорреляции и предсказуемости. Именно эти остатки используются в статистическом арбитраже: доходности, очищенные от систематических факторов, имеют более высокое соотношение Шарпа при торговле на разворот.
Выбор количества значимых компонент
Количество компонент определяет баланс между захватом системного риска и исключением шума. Если оставить слишком много компонент, модель переобучается; слишком мало — теряются важные источники риска.

Рис. 4: Скорость уменьшения собственных значений (дельта λᵢ) для топ-20 акций США. Логарифмическая шкала подчеркивает резкий спад первых компонент и длинный пологий хвост, начиная с точки перегиба между 9-й и 11-й компонентами
Доля объясненной дисперсии и кумулятивный порог
Кумулятивная доля объясненной дисперсии показывает, сколько общей изменчивости портфеля захватывают выбранные компоненты. Обычно достаточно оставить компоненты до достижения 80–90% дисперсии. Для портфелей из 20+ американских акций это соответствует примерно 8–15 компонентам.
В развивающихся рынках (emerging markets) или при работе с криптоактивами систематических факторов больше, поэтому порог часто повышают до 90–95%. Выбор компонента по порогу помогает исключить шум и сосредоточиться на значимых источниках риска, делая модели более стабильными и экономически интерпретируемыми.
График собственных значений и критерии выбора числа компонент
Scree plot, или график собственных значений, показывает дисперсию, объясняемую каждой компонентой. Критерий локтя — визуальное определение точки, после которой добавление новых компонент почти не увеличивает объясненную дисперсию. На финансовых данных «локоть» часто размытый, поэтому для выбора числа значимых компонент применяют автоматизированные методы.
Есть еще один популярный метод — критерий Кайзера. Он сохраняет компоненты с собственными числами λ больше 1, когда данные стандартизованы. На доходностях его нельзя использовать напрямую, но модификация λ > среднее(λ) показывает стабильные результаты.
Правило broken-stick сравнивает наблюдаемые собственные числа с распределением случайных чисел, если дисперсия равномерно распределена между компонентами. Компоненты, превышающие 95-й перцентиль такого распределения, считаются значимыми и отражают настоящие систематические факторы риска.
Применение PCA в управлении портфелем и трейдинге
Метод PCA преобразует коррелированную систему активов в набор некоррелированных факторов. Это позволяет выделять независимые источники риска и работать с ними отдельно. Такой подход позволяет решать задачи, которые сложно или невозможно решить напрямую на уровне отдельных активов.
Например, можно строить портфели, оптимизированные по систематическим факторам, хеджировать общий рыночный риск с помощью первой компоненты или анализировать секторальные и стилевые факторы для более точного управления риском и доходностью.

Рис. 5: Распределение риска до и после декорреляции с помощью PCA. После перехода к главным компонентам риск перераспределяется по независимым направлениям, что упрощает управление портфелем и делает вклад каждой компоненты прозрачным
Декорреляция активов и построение риск-паритет портфелей
На главных компонентах задача построения риск-паритет портфелей становится простой: веса распределяются обратно пропорционально √λᵢ. Полученный портфель имеет максимальное соотношение Шарпа среди всех риск-паритетных конструкций на исходных активах.
Использование главных компонент позволяет разделить систематический риск на независимые направления и сделать распределение риска более прозрачным и управляемым.
Статистический арбитраж на остатках после вычитания главных компонент
Если вычесть k первых компонент, очищенные доходности можно получить так:
r_clean = r − V_k V_k^T r
Эти остатки обладают низкой корреляцией и высокой предсказуемостью на коротких горизонтах. Стратегии возврата к среднему (Mean-reversion) на таких остатках могут давать высокий коэффициент Шарпа в 1.5–3.0 при обороте 20–50x. Такой подход позволяет выявлять локальные аномалии рынка, которые сложно заметить на уровне исходных активов.
Хеджирование бета-риска первой компонентой
Первая компонента отражает общий рыночный фактор и часто чище индекса SPY или фьючерса ES. Коэффициент хеджирования β можно вычислить так:
β = cov(r_portfolio, PC1) / var(PC1)
где:
- r_portfolio — доходности портфеля;
- PC1 — первая главная компонента;
- cov — ковариация;
- var — дисперсия.
Использование 1-й компоненты для хеджирования бета-риска снижает волатильность портфеля на 5–15% по сравнению с прямым хеджированием индексом. Кроме того, такой подход уменьшает влияние случайного шума и секторальных колебаний, делая управление риском более точным.
Практические аспекты реализации
Реализация PCA на финансовых данных требует строгой предобработки и выбора параметров оценивания. Малейшие отклонения от корректной процедуры приводят к артефактам в спектре собственных значений.

Рис. 6: Первое собственное значение резко возрастает в кризисные / стрессовые периоды на рынке из-за концентрации риска на рыночном факторе. В спокойные периоды вклад первой компоненты снижается до 30–40%
Перед анализом доходностей активов важно правильно подготовить данные. Для стабильного построения моделей и корректного применения методов вроде PCA или факторного анализа необходимо устранить выбросы и заполнить пропуски в данных. Ниже представлен пример функции, которая решает эти задачи:
import pandas as pd
def prepare_returns(df):
# Лог-доходности
rets = np.log(df).diff().dropna(how='all')
# Внизоризация 1% квантилей по каждому активу
lower = rets.quantile(0.01, axis=0)
upper = rets.quantile(0.99, axis=0)
rets = rets.clip(lower, upper, axis=1)
# Интерполяция Forward-fill максимум 5 дней, затем удаление
rets = rets.replace([-np.inf, np.inf], np.nan)
rets = rets.ffill(limit=5)
rets = rets.dropna(axis=1, thresh=int(len(rets)*0.8)) # активы с >80% данных
# Заполнение оставшихся пропусков медианой по сечению
rets = rets.fillna(rets.median(axis=1), axis=0)
return rets
clean_returns = prepare_returns(data)
print(clean_returns.tail(5))
Ticker AAPL ADBE AMZN DIS GOOGL HD INTC JNJ JPM MA META MSFT NFLX NVDA PG PYPL TSLA UNH V VZ
Date
2025-11-21 0.019490 0.037045 0.016217 0.015267 0.034666 0.032384 0.025838 0.004079 -0.001207 0.023441 0.008619 -0.013277 -0.012954 -0.009791 0.018255 0.041548 -0.010530 0.026699 0.012919 0.011465
2025-11-24 0.016186 -0.016985 0.025014 -0.022695 0.053282 -0.019827 0.036709 0.010489 -0.000067 -0.004730 0.031146 0.003974 0.025181 0.020309 -0.026453 -0.000165 0.066017 -0.002879 0.004016 -0.025050
2025-11-25 0.003798 0.002569 0.014870 0.013350 0.015140 0.034584 0.001117 0.009334 0.016639 0.015900 0.037098 0.006288 -0.024319 -0.026252 0.010221 0.010839 0.003870 0.022408 0.015757 0.009406
2025-11-26 0.002092 -0.006373 -0.002223 0.001161 -0.010849 0.012455 0.026984 0.004297 0.015198 -0.002822 -0.004111 0.017684 0.016529 0.013628 -0.001618 0.009915 0.016975 0.010458 -0.002214 0.007119
2025-11-28 0.004673 0.008186 0.017562 0.010005 0.000719 0.004071 0.075207 -0.003088 0.017528 0.010224 0.022380 0.013320 0.013476 -0.018250 -0.000607 0.013813 0.008381 0.000182 0.001945 0.005610
Последовательная очистка от экстремальных движений и пропусков сохраняет реальную структуру ковариации активов, предотвращает доминирование отдельных резких событий и делает данные более устойчивыми для анализа.
Стабилизация ковариационной матрицы
Ковариационная матрица доходностей часто нестабильна из-за ограниченного числа наблюдений и высокой волатильности отдельных активов. Прямое использование такой матрицы может привести к переобучению при построении портфелей или факторных моделей.
Для повышения устойчивости применяют методы сжатия, которые сглаживают малые собственные числа и уменьшают влияние шумовых факторов.
from sklearn.covariance import LedoitWolf
# Сжатие методом Ледуа-Вульфа (Ledoit-Wolf Shrinkage)
lw = LedoitWolf().fit(clean_returns)
cov_stabilized = lw.covariance_
shrinkage = lw.shrinkage_
# Сравнение спектров
eig_clean = np.linalg.eigvalsh(np.cov(clean_returns.T))
eig_lw = np.linalg.eigvalsh(cov_stabilized)
print(f"Shrinkage intensity: {shrinkage:.3f}")
Shrinkage intensity: 0.007
Метод Ледуа-Вульфа автоматически подбирает оптимальную интенсивность сжатия, которая обычно лежит в диапазоне 0.15–0.35 для дневных доходностей. В нашем примере она получилась очень низкой (0.007), что говорит о том, что ковариационная матрица уже была относительно стабильной.
Такое сжатие сглаживает малые собственные числа, снижает риск переобучения и делает построение портфелей более надежным. Кроме того, оно сохраняет структуру значимых факторов и не искажает крупные систематические связи между активами.
Анализ через скользящее окно (Rolling window)
Для анализа динамики структуры ковариации и главных компонент удобно использовать скользящее окно (rolling window). В отличие от накопительного окна (expanding window), где каждая оценка учитывает все данные с начала периода, скользящее окно позволяет отслеживать локальные изменения в рисках и корреляциях активов на фиксированном временном горизонте.
Такой подход особенно полезен при работе с финансовыми временными рядами, где волатильность и зависимости между активами могут меняться во времени. В следующей функции мы вычисляем собственные значения ковариационной матрицы по скользящему окну с центровкой данных и сохраняем только первые n_components главных компонент.
def rolling_pca(rets, window=252, min_periods=180, n_components=10):
eigvals_history = []
dates = []
for i in range(window, len(rets)):
window_data = rets.iloc[i-window:i]
if len(window_data) < min_periods:
continue
X = window_data.values
X_c = X - X.mean(axis=0)
# SVD
_, s, _ = np.linalg.svd(X_c, full_matrices=False)
eig = s**2 / (len(X)-1)
# Берем только нужное число компонент, дополняем нулями если нужно
eig_padded = np.zeros(n_components)
n = min(len(eig), n_components)
eig_padded[:n] = eig[:n]
eigvals_history.append(eig_padded)
dates.append(rets.index[i])
return pd.DataFrame(eigvals_history, index=dates, columns=[f'PC{i+1}' for i in range(n_components)])
rolling_eigs = rolling_pca(clean_returns)
print(rolling_eigs.tail())
PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8 PC9 PC10
2025-11-21 0.003115 0.000935 0.000681 0.000617 0.000425 0.000283 0.000249 0.000234 0.000198 0.000168
2025-11-24 0.003117 0.000935 0.000691 0.000613 0.000425 0.000290 0.000249 0.000234 0.000199 0.000167
2025-11-25 0.003142 0.000937 0.000699 0.000613 0.000422 0.000288 0.000252 0.000239 0.000200 0.000168
2025-11-26 0.003144 0.000935 0.000705 0.000615 0.000420 0.000288 0.000249 0.000238 0.000204 0.000165
2025-11-28 0.003146 0.000936 0.000703 0.000606 0.000417 0.000290 0.000250 0.000236 0.000204 0.000165
Результат функции — датафрейм с временным рядом собственных значений для каждой из выбранных компонент. Каждая строка соответствует конкретной дате, а столбцы — значения первых 10 главных компонент (PC1…PC10).
Анализ этих временных рядов позволяет выявлять периоды концентрации риска в отдельных компонентах и динамику декорреляции активов. При этом скользящее окно сохраняет адаптивность оценки, предотвращая сильное влияние старых данных и обеспечивая более точное отражение текущей рыночной структуры.
Ограничения метода и риски применения
Метод анализа главных компонент (PCA) основан на предположении линейности взаимосвязей между активами и стационарности 2-го момента (ковариаций). На практике финансовые рынки редко соответствуют этим идеальным условиям, поэтому результаты PCA требуют аккуратной интерпретации.
Нестационарность корреляций
Корреляционная структура рынка может существенно меняться за считанные недели, особенно в периоды кризисов или резких изменений макроэкономических условий.
Использование rolling PCA с коротким окном (менее 180 дней) позволяет отслеживать эти изменения, но одновременно увеличивает шум в оценках, делая малые собственные числа менее стабильными. Слишком длинное окно, наоборот, сглаживает изменения и может не успевать отражать текущую структуру рисков.
Чувствительность к экстремальным событиям
Резкие движения рынка, например одномоментные падения или рост на 10% и более, могут сильно повлиять на ковариационную матрицу и, как следствие, на главные компоненты.
Чтобы снизить влияние таких выбросов, применяют технику винзоризации, робастные оценки ковариации (например, Minimum Covariance Determinant или Ledoit-Wolf Shrinkage), либо комбинацию этих методов. Это помогает сохранить структуру факторов и предотвратить доминирование отдельных экстремальных событий.
Проблема знака и ротации компонент
Собственные векторы PCA определяются с точностью до знака. При последовательной оценке на скользящем окне компонента может «перевернуться», что нарушает непрерывность временного ряда факторов.
Для корректного анализа необходимо фиксировать знак каждой компоненты относительно предыдущего окна, например, по корреляции с предыдущим вектором. Также стоит учитывать возможность ротации близких по значению компонент, которая может изменить экономическую интерпретацию факторов.
Заключение
Анализ главных компонент PCA позволяет разложить риск на независимые систематические источники. Первая компонента отражает общий рыночный фактор, следующие 5–15 — основные секторальные и стилевые движения, остаток содержит предсказуемый идиосинкратический риск.
Разложение проводится через SVD, что обеспечивает стабильность вычислений и корректную оценку собственных чисел даже при высокой коллинеарности активов или большом числе инструментов.
При правильной очистке данных, использовании сжатия и адаптивного окна PCA превращается в надежный инструмент управления риском: от точного хеджирования беты до стратегий статистического арбитража с высоким коэффициентом Шарпа. Экономическая интерпретация компонент позволяет получить важное конкурентное преимущество в алгоритмическом трейдинге.