{"id":214042,"date":"2026-09-21T12:52:37","date_gmt":"2026-09-21T16:52:37","guid":{"rendered":"https:\/\/ibkrcampus.com\/campus\/?p=214042"},"modified":"2026-09-21T12:56:17","modified_gmt":"2026-09-21T16:56:17","slug":"time-series-of-implied-shocks-using-principal-component-analysis","status":"publish","type":"post","link":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/time-series-of-implied-shocks-using-principal-component-analysis\/","title":{"rendered":"Time-Series of Implied Shocks Using Principal Component Analysis"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Last updated: September 21, 2026 (originally published October 23, 2024)<\/em><\/p>\n\n\n\n<h2 id=\"h-open-source-quantitative-finance\" class=\"wp-block-heading\">Open Source Quantitative Finance<\/h2>\n\n\n\n<h2 id=\"h-abstract\" class=\"wp-block-heading\">Abstract<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Implied shocks are a valuable tool for scenario analysis and are often used to assess the impact of a change in a variable on a portfolio. For example, a change in the yield curve can be used to assess the impact on a fixed-income portfolio; however, the specification of shocks poses challenges and requires an understanding of the methodology as well. In this research paper, we propose an approach to address these challenges by using principal component analysis (PCA) to compute the implied shocks. This paper also presents a methodology to resolve issues related to time-series of eigenanalysis, and applies the specified and PCA implied shocks to a stylized portfolio to compare the approaches. The comparison includes the most negative impact across components, which identifies when the dominant source of variation is not the dominant source of risk for the portfolio. The use of PCA aims to facilitate a more accessible framework for scenario analysis and to deepen the understanding of dynamics driving the scenarios. The numerical calculations, which use online algorithms from the <strong>roll<\/strong> package and parallelism from <strong>RcppParallel<\/strong> for rolling eigenanalysis of time-series data, are available in the <strong>rolleigen<\/strong> package on CRAN: <a href=\"https:\/\/cran.r-project.org\/package=rolleigen\">https:\/\/cran.r-project.org\/package=rolleigen<\/a><\/p>\n\n\n\n<h2 id=\"h-implied-shocks\" class=\"wp-block-heading\">Implied shocks<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We illustrate an application of implied shocks in scenario analysis using daily returns for four factors through June 30, 2026: &#8220;Equity&#8221; (the S&amp;P 500 index, SP500), &#8220;Dollar&#8221; (the advanced foreign economies U.S. dollar index, DTWEXAFEGS), &#8220;Rates&#8221; (the 10-year Treasury yield, DGS10), and &#8220;Credit&#8221; (the high-yield option-adjusted spread, BAMLH0A0HYM2). The methodology depends on the correlation structure of the factors rather than the identity of the factors. The returns are log differences for the return factors and negated level differences for the rate and spread factors, so a positive return is a rally for each factor. The returns are then standardized to unit variance and smoothed as five-day overlapping means to reduce daily noise. The shocks are computed from the standardized returns and then expressed in percent, where each factor\u2019s shock is multiplied by its full-sample standard deviation. The rolling calculations (i.e., the regression betas, the eigenanalysis, and the standard deviations) use a 252-day (one-year) window.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A single factor (or subset of factors) is used to specify shocks, and then shocks are implied across the other factors for the given scenario. Next the specified and implied shocks are applied to assess the impact on a portfolio. Implied shocks are computed using the following methodology:<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">\u03b2 = (X<sup>T<\/sup> X)<sup>-1<\/sup> X<sup>T<\/sup> Y<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"r\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">beta &lt;- solve(crossprod(x)) %*% crossprod(x, y)\n\nimplied_shocks &lt;- shocks %*% beta<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For example, consider the scenario for specifying the &#8220;Equity&#8221; factor down one standard deviation:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"560\" height=\"280\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-1.png\" alt=\"Time-Series of Implied Shocks Using Principal Component Analysis\n\" class=\"wp-image-256833 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-1.png 560w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-1-300x150.png 300w\" data-sizes=\"(max-width: 560px) 100vw, 560px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 560px; aspect-ratio: 560\/280;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Data source: Federal Reserve Economic Data (FRED): <\/em><a href=\"https:\/\/fred.stlouisfed.org\/\"><em>https:\/\/fred.stlouisfed.org\/<\/em><\/a><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"r\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">roll::roll_crossprod(x, y = NULL, width)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Specifying a single factor (or subset of factors) for computing implied shocks presents challenges. In particular, the specified factor(s) determines both the direction and magnitude of the implied shocks by using the covariance matrix. That is, the direction of the implied shocks is determined by each factor\u2019s correlation with only the specified factor(s). The variance explained by the specified shock also dampens implied shocks on a sigma-adjusted basis by definition. For example, to illustrate the impact of specifying the &#8220;Equity&#8221; factor on a sigma-adjusted basis, where each factor\u2019s shock is divided by its rolling standard deviation (the returns are standardized to unit variance over the full sample, while the sigma adjustment uses the rolling window):<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"560\" height=\"280\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-2.png\" alt=\"Time-Series of Implied Shocks Using Principal Component Analysis\n\" class=\"wp-image-256839 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-2.png 560w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-2-300x150.png 300w\" data-sizes=\"(max-width: 560px) 100vw, 560px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 560px; aspect-ratio: 560\/280;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Data source: Federal Reserve Economic Data (FRED): <\/em><a href=\"https:\/\/fred.stlouisfed.org\/\"><em>https:\/\/fred.stlouisfed.org\/<\/em><\/a><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"r\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">roll::roll_sd(x, width)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To summarize these challenges, the specified factor(s) determines the direction of the implied shocks and dampens their magnitude on a sigma-adjusted basis. While it is possible to specify all of the shocks to their respective sigmas, the direction of the shocks presents yet another challenge. Using the covariance matrix for guidance is an option, but the selection of the appropriate row and column is subjective. Instead we propose using PCA to identify the direction and magnitude of the shocks that explain the largest share of the variation in the covariance matrix.<\/p>\n\n\n\n<h2 id=\"h-variance-explained\" class=\"wp-block-heading\">Variance explained<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">PCA reduces the dimensionality of the data while retaining as much information as possible. Essentially, principal components are computed to capture the maximum variance present in the data. The first principal component explains the most variance, the second principal component (orthogonal to the first) explains the second most, and so on. The proportion of variance explained by the first <sup>k<\/sup>&nbsp;principal components is an indicator of the number of components required to reduce the data\u2019s dimension. This calculation is performed using the eigenvalues of the covariance matrix of the standardized returns as follows:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"892\" height=\"82\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/variance-explained.png\" alt=\"Time-Series of Implied Shocks Using Principal Component Analysis\n\" class=\"wp-image-256845 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/variance-explained.png 892w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/variance-explained-700x64.png 700w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/variance-explained-300x28.png 300w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/variance-explained-768x71.png 768w\" data-sizes=\"(max-width: 892px) 100vw, 892px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 892px; aspect-ratio: 892\/82;\" \/><\/figure>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"r\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">LV &lt;- eigen(cov(x))\nL &lt;- LV[[\"values\"]]\n\nvariance_explained &lt;- cumsum(L) \/ sum(L)<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"560\" height=\"280\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-3.png\" alt=\"\" class=\"wp-image-256849 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-3.png 560w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-3-300x150.png 300w\" data-sizes=\"(max-width: 560px) 100vw, 560px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 560px; aspect-ratio: 560\/280;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Data source: Federal Reserve Economic Data (FRED): <\/em><a href=\"https:\/\/fred.stlouisfed.org\/\"><em>https:\/\/fred.stlouisfed.org\/<\/em><\/a><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"r\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">rolleigen::roll_eigen(x, width)[[\"values\"]]<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The interquartile range of the variance explained by the first principal component is 50% to 66%. This gives us confidence that the first principal component explains the largest share of the variation in the covariance matrix and can be used to identify the direction and magnitude of the shocks. Specifically, the product of the first eigenvector and square root of the first eigenvalue:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" width=\"835\" height=\"55\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/implied-shocks-formula.png\" alt=\"Time-Series of Implied Shocks Using Principal Component Analysis\n\" class=\"wp-image-256852 lazyload\" style=\"--smush-placeholder-width: 835px; aspect-ratio: 835\/55;width:835px;height:auto\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/implied-shocks-formula.png 835w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/implied-shocks-formula-700x46.png 700w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/implied-shocks-formula-300x20.png 300w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/implied-shocks-formula-768x51.png 768w\" data-sizes=\"(max-width: 835px) 100vw, 835px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/figure>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"r\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">LV &lt;- eigen(cov(x))\nL &lt;- LV[[\"values\"]]\nV &lt;- LV[[\"vectors\"]]\n\nimplied_shocks &lt;- sqrt(L[comp]) * V[ , comp]<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"560\" height=\"280\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-4.png\" alt=\"Time-Series of Implied Shocks Using Principal Component Analysis\n\" class=\"wp-image-256856 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-4.png 560w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-4-300x150.png 300w\" data-sizes=\"(max-width: 560px) 100vw, 560px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 560px; aspect-ratio: 560\/280;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Data source: Federal Reserve Economic Data (FRED): <\/em><a href=\"https:\/\/fred.stlouisfed.org\/\"><em>https:\/\/fred.stlouisfed.org\/<\/em><\/a><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"r\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">rolleigen::roll_eigen(x, width)[[\"vectors\"]]<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">As illustrated above, we need to resolve issues related to time-series of eigenanalysis: the sign of the eigenvectors can flip and the order of the components can change between windows. These challenges arise given each window is independent of the previous window and floating-point arithmetic is used to calculate the principal components. To address these issues, we can use cosine similarity to match the eigenvectors.<\/p>\n\n\n\n<h2 id=\"h-cosine-similarity\" class=\"wp-block-heading\">Cosine similarity<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cosine similarity measures the angle between two vectors in a multidimensional space. The cosine of 0\u00b0 is 1 and the cosine of 180\u00b0 is -1; therefore, the cosine similarity between two vectors is 1 if the vectors point in the same direction, -1 if the vectors point in opposite directions, and 0 if the vectors are orthogonal. The cosine similarity between the eigenvectors of the current window and the previous window is calculated as follows:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"831\" height=\"71\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/cosine-similarity.png\" alt=\"Time-Series of Implied Shocks Using Principal Component Analysis\n\" class=\"wp-image-256861 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/cosine-similarity.png 831w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/cosine-similarity-700x60.png 700w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/cosine-similarity-300x26.png 300w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/cosine-similarity-768x66.png 768w\" data-sizes=\"(max-width: 831px) 100vw, 831px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 831px; aspect-ratio: 831\/71;\" \/><\/figure>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"r\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">LV &lt;- eigen(cov(x))\nL &lt;- LV[[\"values\"]]\nV &lt;- LV[[\"vectors\"]]\n\ncosine_similarity &lt;- crossprod(V, V0) \/\n  outer(sqrt(colSums(V ^ 2)), sqrt(colSums(V0 ^ 2)))<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Note: given the eigenvectors are normalized to unit length, we can ignore the denominator.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The eigenvector with the highest absolute cosine similarity is selected, since a flipped eigenvector scores near -1 rather than 1. The selected eigenvector is multiplied by the sign of the similarity to ensure the eigenvector points in the same direction as the previous window. The eigenvalues are then reordered to match the eigenvectors:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"r\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">order &lt;- apply(abs(cosine_similarity), 2, which.max)\nL &lt;- L[order]\nV &lt;- t(sign(diag(cosine_similarity[order, ])) * t(V[ , order]))<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Note: the column-by-column match is greedy rather than a strict permutation, so the assignments are not guaranteed to be unique; they are unique in every window of the sample. Hirsa et al.\u00a0(2023) use an equivalent greedy match and note that tracking additional components before truncation can reduce ordering ambiguity.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"560\" height=\"280\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-5.png\" alt=\"Time-Series of Implied Shocks Using Principal Component Analysis\n\" class=\"wp-image-256867 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-5.png 560w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-5-300x150.png 300w\" data-sizes=\"(max-width: 560px) 100vw, 560px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 560px; aspect-ratio: 560\/280;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Data source: Federal Reserve Economic Data (FRED): <\/em><a href=\"https:\/\/fred.stlouisfed.org\/\"><em>https:\/\/fred.stlouisfed.org\/<\/em><\/a><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"r\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">rolleigen::roll_eigen(x, width, order = TRUE) # default<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now we have addressed the challenges of specified shocks by using PCA to derive implied shocks. That is, we no longer need to select a single factor (or subset of factors) for computing implied shocks, and PCA selects the direction and magnitude of the shocks that explain the largest share of the variation in the covariance matrix. After the sign is adjusted and eigenvalues are reordered, the implied shocks can be used in time-series analysis as well. As illustrated above, each of the sigma-adjusted implied shocks is less than one in magnitude in every window of the sample. In contrast, the specified approach sets the &#8220;Equity&#8221; shock to its full standard deviation (i.e., exactly -1 on a sigma-adjusted basis).<\/p>\n\n\n\n<h2 id=\"h-benchmark\" class=\"wp-block-heading\">Benchmark<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The rolling eigenanalysis repeats the decomposition and the cosine similarity ordering for each window, so a naive loop scales with the number of windows. The <strong>rolleigen<\/strong> package instead implements the calculation in C++, computes the rolling covariance online via the <strong>roll<\/strong> package (i.e., the statistics are updated as observations are added to and removed from a window rather than recomputed from scratch), and uses <strong>RcppParallel<\/strong> to parallelize across columns and windows. To compare the approaches, we benchmark a naive loop that matches the ordered output of the <strong>roll_eigen<\/strong> function (i.e., an interpreted R loop that computes the eigenanalysis and the cosine similarity ordering for each window) on simulated data at several window widths. The simulation uses 1,000 observations and four variables, matching the number of factors in the application. The <strong>roll_eigen<\/strong> function is timed at one thread and at the machine\u2019s default thread count (24 threads) to separate the compiled implementation from the parallelization, and wider cross-sections are also timed at both thread counts to show how the parallelization scales with the cross-section. Both approaches use partial windows (the <strong>min_obs<\/strong> argument), so one window ends at each observation and every width computes the same number of windows; the width determines the number of observations within each window instead, which isolates the effect of the width itself:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"r\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">RcppParallel::setThreadOptions(numThreads = 1) # then the default\n\nresult &lt;- microbenchmark::microbenchmark(\n  \"naive\" = naive_eigen(x, width = width, min_obs = min_obs),\n  \"roll_eigen\" = rolleigen::roll_eigen(x, width = width, min_obs = min_obs)\n)<\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><td><strong>width<\/strong><\/td><td><strong>naive (ms)<\/strong><\/td><td><strong>roll_eigen (1 thread, ms)<\/strong><\/td><td><strong>roll_eigen (24 threads, ms)<\/strong><\/td><td><strong>speedup vs naive<\/strong><\/td><\/tr><\/thead><tbody><tr><td><strong>125<\/strong><\/td><td><strong>503.5<\/strong><\/td><td><strong>4.6<\/strong><\/td><td><strong>4.5<\/strong><\/td><td><strong>109x<\/strong><\/td><\/tr><tr><td><strong>250<\/strong><\/td><td><strong>558.0<\/strong><\/td><td><strong>4.9<\/strong><\/td><td><strong>4.5<\/strong><\/td><td><strong>114x<\/strong><\/td><\/tr><tr><td><strong>500<\/strong><\/td><td><strong>534.2<\/strong><\/td><td><strong>4.3<\/strong><\/td><td><strong>4.8<\/strong><\/td><td><strong>124x<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Note: the speedup compares the naive loop with the single-thread configuration, so it isolates the compiled implementation and holds the baseline constant across rows.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The median times show that the speedup comes from the compiled implementation, which computes the covariance online, rather than the parallelization at this problem size. The single-thread and default-thread times are roughly equal because each window decomposes a small matrix, so the threading overhead offsets the gains from parallelizing across windows. The naive times are nearly flat across widths because every width computes the same number of windows and the per-window cost is dominated by the interpreted loop overhead rather than by the number of observations within each window. The <strong>roll_eigen<\/strong> times are also consistent across widths, though for a different reason: the online covariance updates make the per-window cost independent of the width.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><td><strong>n_vars<\/strong><\/td><td><strong>roll_eigen (1 thread, ms)<\/strong><\/td><td><strong>roll_eigen (24 threads, ms)<\/strong><\/td><td><strong>speedup vs 1 thread<\/strong><\/td><\/tr><\/thead><tbody><tr><td><strong>10<\/strong><\/td><td><strong>18.4<\/strong><\/td><td><strong>8.1<\/strong><\/td><td><strong>2.3x<\/strong><\/td><\/tr><tr><td><strong>25<\/strong><\/td><td><strong>124.0<\/strong><\/td><td><strong>34.4<\/strong><\/td><td><strong>3.6x<\/strong><\/td><\/tr><tr><td><strong>50<\/strong><\/td><td><strong>759.2<\/strong><\/td><td><strong>269.4<\/strong><\/td><td><strong>2.8x<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Note: the wider cross-sections use a width of 250; the speedup compares one thread with the machine\u2019s default thread count, so it isolates the parallelization; at four variables the single-thread and default-thread times are roughly equal, as shown in the previous table.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The parallelization is additive at wider cross-sections, but the gain does not scale monotonically: the speedup over one thread peaks at roughly 3.6x in the tens of variables and partly declines at 50 variables. The gain also remains well below the thread count because each window\u2019s decomposition is small relative to the synchronization cost. Overall the <strong>roll_eigen<\/strong> function is roughly two orders of magnitude faster than the naive loop at four variables (i.e., the four factors in the application), which makes the time-series of eigenanalysis practical for scenario analysis at daily frequencies.<\/p>\n\n\n\n<h2 id=\"h-application\" class=\"wp-block-heading\">Application<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Next we apply the specified and PCA implied shocks to a stylized portfolio to compare the approaches. The portfolio allocates 60% to the &#8220;Equity&#8221; factor and 40% to a proxy for an aggregate bond index, analogous to a generic 60\/40 stock\/bond allocation. The proxy applies a duration of 6 to the &#8220;Rates&#8221; factor and a spread exposure of 0.6 to the &#8220;Credit&#8221; factor. The estimated impact for each scenario is the product of the portfolio exposures and the shocks:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"832\" height=\"53\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/implied-shocks-impact.png\" alt=\"Time-Series of Implied Shocks Using Principal Component Analysis\n\" class=\"wp-image-256877 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/implied-shocks-impact.png 832w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/implied-shocks-impact-700x45.png 700w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/implied-shocks-impact-300x19.png 300w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/implied-shocks-impact-768x49.png 768w\" data-sizes=\"(max-width: 832px) 100vw, 832px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 832px; aspect-ratio: 832\/53;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">where <strong>e<\/strong> is the vector of portfolio exposures, <strong>\u03c3<\/strong> is the vector of full-sample standard deviations, and <strong>s<\/strong> is the vector of specified and implied shocks for the scenario computed from the standardized returns. The specified scenario shocks the &#8220;Equity&#8221; factor down one standard deviation, the adverse direction for scenario analysis, and implies the shocks across the other factors. The PCA scenario uses the first principal component oriented so the &#8220;Equity&#8221; element is negative, matching the adverse direction of the specified scenario. Both scenarios are annualized (the scaling reflects both the daily frequency and the five-day overlap) and expressed in percent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We also extend the comparison to every principal component by orienting each component against the portfolio. That is, the most negative impact of a one standard deviation move in each component, annualized and expressed in percent on the same basis as the specified and PCA scenarios:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"786\" height=\"53\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/implied-shocks-impact-2.png\" alt=\"Time-Series of Implied Shocks Using Principal Component Analysis\n\" class=\"wp-image-256883 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/implied-shocks-impact-2.png 786w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/implied-shocks-impact-2-700x47.png 700w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/implied-shocks-impact-2-300x20.png 300w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/implied-shocks-impact-2-768x52.png 768w\" data-sizes=\"(max-width: 786px) 100vw, 786px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 786px; aspect-ratio: 786\/53;\" \/><\/figure>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"r\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">LV &lt;- eigen(cov(x))\nL &lt;- LV[[\"values\"]]\nV &lt;- LV[[\"vectors\"]]\n\nimpacts &lt;- -abs(sqrt(L) * crossprod(V, exposures * sd_full))<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The most negative impact across components is the worst single-component scenario and does not depend on the sign of the eigenvectors, while the component labels follow the cosine similarity ordering. The one standard deviation portfolio loss bounds both the specified scenario and the most negative impact. The specified scenario equals that loss scaled by the correlation between the portfolio and the specified factor because the specified shock is one standard deviation and the implied shocks are regression betas on that factor. The sum of squared impacts equals the portfolio variance, so the most negative impact cannot exceed that loss. Note that the minimum across components is a selected worst case rather than a probability-consistent scenario because each impact is a one standard deviation move of a different component.<\/p>\n\n\n\n<h2 id=\"h-results\" class=\"wp-block-heading\">Results<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After the shocks are computed, we compare the estimated impact for each scenario over time. The chart below shows the estimated impact of the specified and PCA scenarios for the stylized portfolio.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"560\" height=\"280\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-6.png\" alt=\"Time-Series of Implied Shocks Using Principal Component Analysis\n\" class=\"wp-image-256886 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-6.png 560w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-6-300x150.png 300w\" data-sizes=\"(max-width: 560px) 100vw, 560px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 560px; aspect-ratio: 560\/280;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Data source: Federal Reserve Economic Data (FRED): <\/em><a href=\"https:\/\/fred.stlouisfed.org\/\"><em>https:\/\/fred.stlouisfed.org\/<\/em><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The two scenarios produce similar estimated impacts over most of the sample: the average is roughly -10% for the specified scenario and -7% for the PCA scenario, and the correlation between the two series is 0.93. The specified scenario is larger in magnitude on average because it sets the &#8220;Equity&#8221; shock to its full standard deviation. The first principal component explains roughly half to two-thirds of the variation in the covariance matrix, which dampens each factor\u2019s shock on a sigma-adjusted basis by definition. The scenarios diverge when the composition of the first principal component changes: the difference peaks at roughly 12 percentage points in December 2009, when the &#8220;Equity&#8221; element of the first principal component shrinks toward zero, as illustrated in the implied shocks using PC1 above. The estimated PCA impact for the stylized portfolio therefore rises toward zero while the specified scenario, which sets &#8220;Equity&#8221; to its full standard deviation, remains large in magnitude. The comparison attributes the difference in estimated impact to the construction of the scenarios, specifically the choice of specified versus PCA implied shocks, rather than to the factors themselves.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The chart below extends the comparison to the most negative impact for each component, together with the specified scenario.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"560\" height=\"280\" data-src=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-7.png\" alt=\"Time-Series of Implied Shocks Using Principal Component Analysis\n\" class=\"wp-image-256890 lazyload\" data-srcset=\"https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-7.png 560w, https:\/\/ibkrcampus.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/Time-Series-Implied-Shocks-Principal-Component-7-300x150.png 300w\" data-sizes=\"(max-width: 560px) 100vw, 560px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 560px; aspect-ratio: 560\/280;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Data source: Federal Reserve Economic Data (FRED): <\/em><a href=\"https:\/\/fred.stlouisfed.org\/\"><em>https:\/\/fred.stlouisfed.org\/<\/em><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The most negative impact across components averages roughly -8%, between the PCA and specified scenarios, and its correlation with the specified scenario is 0.96, higher than for the first principal component alone. On average the most negative component accounts for 78% of the one standard deviation portfolio loss, which also averages roughly -10%, the same as the specified scenario. The correlation between the portfolio and the &#8220;Equity&#8221; factor averages roughly 0.98 because the &#8220;Equity&#8221; allocation dominates portfolio volatility. The component with the most negative impact also rotates over time: in December 2009, the impact of the first principal component is roughly -5% while the impact of the second principal component is roughly -12%. The first principal component carries roughly 10% of the variation in the &#8220;Equity&#8221; factor at that date while the second principal component carries roughly 51% of it. The most negative impact therefore remains closer to the specified scenario, which shocks the &#8220;Equity&#8221; factor directly, than the first principal component alone does. That is, the most negative component identifies when the dominant source of variation is not the dominant source of risk for the portfolio.<\/p>\n\n\n\n<h2 id=\"h-conclusion\" class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This research paper introduced an approach to implied shocks that used PCA to address challenges associated with specified shocks. The methodology not only offered a more accessible framework for scenario analysis but also enhanced the understanding of dynamics driving the scenarios. By using PCA to derive implied shocks and resolving issues related to time-series of eigenanalysis, the methodology both simplified and improved the construction of scenarios. The benchmark showed the compiled and parallelized implementation in the <strong>rolleigen<\/strong> package is roughly two orders of magnitude faster than a naive loop. The application to a stylized portfolio illustrated how the choice of scenario construction affects the estimated impact, including the most negative impact across components as a portfolio-oriented scenario. The methodology presented can provide valuable insights for risk managers seeking to refine implied shocks and make more informed decisions on scenario analysis. The <strong>rolleigen<\/strong> package is available for R; for more on the underlying eigenanalysis, go to <a href=\"https:\/\/jasonjfoster.github.io\/posts\/eigen-r\/\">https:\/\/jasonjfoster.github.io\/posts\/eigen-r\/<\/a> for R code and <a href=\"https:\/\/jasonjfoster.github.io\/posts\/eigen-py\/\">https:\/\/jasonjfoster.github.io\/posts\/eigen-py\/<\/a> for Python code.<\/p>\n\n\n\n<h2 id=\"h-rolleigen\" class=\"wp-block-heading\">rolleigen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>rolleigen<\/strong> is a package that provides fast and efficient computation of rolling and expanding eigenanalysis for time-series data.<\/p>\n\n\n\n<h2 id=\"h-installation\" class=\"wp-block-heading\">Installation<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Install the released version from CRAN:<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"r\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">install.packages(\"rolleigen\")<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Or the development version from GitHub:<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"r\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># install.packages(\"pak\")\npak::pak(\"jasonjfoster\/rolleigen\") # roll (&gt;= 1.1.7)<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Then load the package:<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"r\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">library(rolleigen)<\/pre>\n\n\n\n<h2 id=\"h-usage\" class=\"wp-block-heading\">Usage<\/h2>\n\n\n\n<h3 id=\"h-roll-eigen\" class=\"wp-block-heading\">Roll eigen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong>rolleigen::roll_eigen<\/strong> function computes the rolling and expanding eigenvalues and eigenvectors of time-series data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Parameters<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>x<\/strong>: vector or matrix. Rows are observations and columns are variables.<\/li>\n\n\n\n<li><strong>width<\/strong>: integer. Window size.<\/li>\n\n\n\n<li><strong>weights<\/strong>: vector. Weights for each observation within a window.<\/li>\n\n\n\n<li><strong>center<\/strong>: logical. If <strong>TRUE<\/strong> then the weighted mean of each variable is used, if <strong>FALSE<\/strong> then zero is used.<\/li>\n\n\n\n<li><strong>scale<\/strong>: logical. If <strong>TRUE<\/strong> then the weighted standard deviation of each variable is used, if <strong>FALSE<\/strong> then no scaling is done.<\/li>\n\n\n\n<li><strong>order<\/strong>: logical. Change sign and order of the components.<\/li>\n\n\n\n<li><strong>min_obs<\/strong>: integer. Minimum number of observations required to have a value within a window, otherwise result is <strong>NA<\/strong>.<\/li>\n\n\n\n<li><strong>complete_obs<\/strong>: logical. If <strong>TRUE<\/strong> then rows containing any missing values are removed, if <strong>FALSE<\/strong> then pairwise is used.<\/li>\n\n\n\n<li><strong>na_restore<\/strong>: logical. Should missing values be restored?<\/li>\n\n\n\n<li><strong>online<\/strong>: logical. Process observations using an online algorithm.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Value<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A list that contains <strong>values<\/strong>, an object of the same class and dimension as <strong>x<\/strong> with the rolling and expanding eigenvalues, and <strong>vectors<\/strong>, a cube with each slice the rolling and expanding eigenvectors.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Examples<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Rolling and expanding windows<\/strong>: compute eigenvalues and eigenvectors with complete windows, partial windows, and observation weights.<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"r\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">n &lt;- 15\nm &lt;- 3\nx &lt;- matrix(rnorm(n * m), nrow = n, ncol = m)\nweights &lt;- 0.9 ^ (n:1)\n\n# rolling eigenvalues and eigenvectors with complete windows\nrolleigen::roll_eigen(x, width = 5)\n\n# rolling eigenvalues and eigenvectors with partial windows\nrolleigen::roll_eigen(x, width = 5, min_obs = 1)\n\n# expanding eigenvalues and eigenvectors with partial windows\nrolleigen::roll_eigen(x, width = n, min_obs = 1)\n\n# expanding eigenvalues and eigenvectors with partial windows and weights\nrolleigen::roll_eigen(x, width = n, min_obs = 1, weights = weights)<\/pre>\n\n\n\n<h2 id=\"h-references\" class=\"wp-block-heading\">References<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hirsa, A., Klinkert, F., Malhotra, S., &amp; Holmes, R. (2023). \u201cRobust Rolling PCA: Managing Time Series and Multiple Dimensions.\u201d <em>SSRN<\/em>. <a href=\"https:\/\/ssrn.com\/abstract=4400158\">https:\/\/ssrn.com\/abstract=4400158<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zoonekynd, V. (2012). \u201cTime series of PCA &#8211; Sign change in factor loadings [Answer].\u201d <em>Quantitative Finance Stack Exchange<\/em>. <a href=\"https:\/\/quant.stackexchange.com\/a\/3095\">https:\/\/quant.stackexchange.com\/a\/3095<\/a>.<\/p>\n\n\n\n<h2 id=\"h-explore-more-articles-by-jason-foster\" class=\"wp-block-heading\">Explore more articles by Jason Foster:<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/secfile-sec-edgar-filings-in-r-and-python\/\">secfile: SEC EDGAR Filings in R and Python<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/yfscreen-yahoo-finance-screener-in-r-and-python\/\">yfscreen: Yahoo Finance Screener in R and Python<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Implied shocks are a valuable tool for scenario analysis and are often used to assess the impact of a change in a variable on a portfolio.<\/p>\n","protected":false},"author":1534,"featured_media":214084,"comment_status":"open","ping_status":"closed","sticky":true,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":"","jetpack_post_was_ever_published":true},"categories":[339,343,338,341,342],"tags":[10289,806,4922,865,17932,17933,595,487,11312,17934,22174,17935,6591,5519],"contributors-categories":[17926],"class_list":["post-214042","post","type-post","status-publish","format-standard","has-post-thumbnail","category-data-science","category-programing-languages","category-ibkr-quant-news","category-quant-development","category-r-development","tag-correlation-matrix","tag-data-science","tag-econometrics","tag-github","tag-implied-shocks","tag-principal-component-analysis","tag-python","tag-r","tag-r-finance","tag-rcppparallel","tag-roll-package","tag-rolleigen-package","tag-rstats","tag-time-series","contributors-categories-jason-foster"],"pp_statuses_selecting_workflow":false,"pp_workflow_action":"current","pp_status_selection":"publish","acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v28.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Time-Series of Implied Shocks Using Principal Component Analysis<\/title>\n<meta name=\"description\" content=\"Implied shocks are a valuable tool for scenario analysis and are often used to assess the impact of a change in a variable on a portfolio.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.interactivebrokers.com\/campus\/wp-json\/wp\/v2\/posts\/214042\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Time-Series of Implied Shocks Using Principal Component Analysis\" \/>\n<meta property=\"og:description\" content=\"Implied shocks are a valuable tool for scenario analysis and are often used to assess the impact of a change in a variable on a portfolio.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/time-series-of-implied-shocks-using-principal-component-analysis\/\" \/>\n<meta property=\"og:site_name\" content=\"IBKR Campus US\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-21T16:52:37+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-21T16:56:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/number-warp.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1000\" \/>\n\t<meta property=\"og:image:height\" content=\"563\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Jason Foster\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jason Foster\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\n\t    \"@context\": \"https:\\\/\\\/schema.org\",\n\t    \"@graph\": [\n\t        {\n\t            \"@type\": \"NewsArticle\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/time-series-of-implied-shocks-using-principal-component-analysis\\\/#article\",\n\t            \"isPartOf\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/time-series-of-implied-shocks-using-principal-component-analysis\\\/\"\n\t            },\n\t            \"author\": {\n\t                \"name\": \"Jason Foster\",\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#\\\/schema\\\/person\\\/9ff0beaf9880732481f3c12fb84dfb93\"\n\t            },\n\t            \"headline\": \"Time-Series of Implied Shocks Using Principal Component Analysis\",\n\t            \"datePublished\": \"2026-09-21T16:52:37+00:00\",\n\t            \"dateModified\": \"2026-09-21T16:56:17+00:00\",\n\t            \"mainEntityOfPage\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/time-series-of-implied-shocks-using-principal-component-analysis\\\/\"\n\t            },\n\t            \"wordCount\": 3035,\n\t            \"commentCount\": 0,\n\t            \"publisher\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#organization\"\n\t            },\n\t            \"image\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/time-series-of-implied-shocks-using-principal-component-analysis\\\/#primaryimage\"\n\t            },\n\t            \"thumbnailUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2024\\\/10\\\/number-warp.jpg\",\n\t            \"keywords\": [\n\t                \"correlation matrix\",\n\t                \"Data Science\",\n\t                \"Econometrics\",\n\t                \"GitHub\",\n\t                \"Implied Shocks\",\n\t                \"Principal Component Analysis\",\n\t                \"Python\",\n\t                \"R\",\n\t                \"R\\\/Finance\",\n\t                \"RcppParallel\",\n\t                \"roll package\",\n\t                \"rolleigen package\",\n\t                \"rstats\",\n\t                \"Time Series\"\n\t            ],\n\t            \"articleSection\": [\n\t                \"Data Science\",\n\t                \"Programming Languages\",\n\t                \"Quant\",\n\t                \"Quant Development\",\n\t                \"R Development\"\n\t            ],\n\t            \"inLanguage\": \"en-US\",\n\t            \"potentialAction\": [\n\t                {\n\t                    \"@type\": \"CommentAction\",\n\t                    \"name\": \"Comment\",\n\t                    \"target\": [\n\t                        \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/time-series-of-implied-shocks-using-principal-component-analysis\\\/#respond\"\n\t                    ]\n\t                }\n\t            ]\n\t        },\n\t        {\n\t            \"@type\": \"WebPage\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/time-series-of-implied-shocks-using-principal-component-analysis\\\/\",\n\t            \"url\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/time-series-of-implied-shocks-using-principal-component-analysis\\\/\",\n\t            \"name\": \"Time-Series of Implied Shocks Using Principal Component Analysis | IBKR Campus US\",\n\t            \"isPartOf\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#website\"\n\t            },\n\t            \"primaryImageOfPage\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/time-series-of-implied-shocks-using-principal-component-analysis\\\/#primaryimage\"\n\t            },\n\t            \"image\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/time-series-of-implied-shocks-using-principal-component-analysis\\\/#primaryimage\"\n\t            },\n\t            \"thumbnailUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2024\\\/10\\\/number-warp.jpg\",\n\t            \"datePublished\": \"2026-09-21T16:52:37+00:00\",\n\t            \"dateModified\": \"2026-09-21T16:56:17+00:00\",\n\t            \"description\": \"Implied shocks are a valuable tool for scenario analysis and are often used to assess the impact of a change in a variable on a portfolio.\",\n\t            \"inLanguage\": \"en-US\",\n\t            \"potentialAction\": [\n\t                {\n\t                    \"@type\": \"ReadAction\",\n\t                    \"target\": [\n\t                        \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/time-series-of-implied-shocks-using-principal-component-analysis\\\/\"\n\t                    ]\n\t                }\n\t            ]\n\t        },\n\t        {\n\t            \"@type\": \"ImageObject\",\n\t            \"inLanguage\": \"en-US\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/ibkr-quant-news\\\/time-series-of-implied-shocks-using-principal-component-analysis\\\/#primaryimage\",\n\t            \"url\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2024\\\/10\\\/number-warp.jpg\",\n\t            \"contentUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2024\\\/10\\\/number-warp.jpg\",\n\t            \"width\": 1000,\n\t            \"height\": 563,\n\t            \"caption\": \"Quant\"\n\t        },\n\t        {\n\t            \"@type\": \"WebSite\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#website\",\n\t            \"url\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/\",\n\t            \"name\": \"IBKR Campus US\",\n\t            \"description\": \"Financial Education from Interactive Brokers\",\n\t            \"publisher\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#organization\"\n\t            },\n\t            \"potentialAction\": [\n\t                {\n\t                    \"@type\": \"SearchAction\",\n\t                    \"target\": {\n\t                        \"@type\": \"EntryPoint\",\n\t                        \"urlTemplate\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/?s={search_term_string}\"\n\t                    },\n\t                    \"query-input\": {\n\t                        \"@type\": \"PropertyValueSpecification\",\n\t                        \"valueRequired\": true,\n\t                        \"valueName\": \"search_term_string\"\n\t                    }\n\t                }\n\t            ],\n\t            \"inLanguage\": \"en-US\"\n\t        },\n\t        {\n\t            \"@type\": \"Organization\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#organization\",\n\t            \"name\": \"Interactive Brokers\",\n\t            \"alternateName\": \"IBKR\",\n\t            \"url\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/\",\n\t            \"logo\": {\n\t                \"@type\": \"ImageObject\",\n\t                \"inLanguage\": \"en-US\",\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#\\\/schema\\\/logo\\\/image\\\/\",\n\t                \"url\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2024\\\/05\\\/ibkr-campus-logo.jpg\",\n\t                \"contentUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2024\\\/05\\\/ibkr-campus-logo.jpg\",\n\t                \"width\": 669,\n\t                \"height\": 669,\n\t                \"caption\": \"Interactive Brokers\"\n\t            },\n\t            \"image\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#\\\/schema\\\/logo\\\/image\\\/\"\n\t            },\n\t            \"publishingPrinciples\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/about-ibkr-campus\\\/\",\n\t            \"ethicsPolicy\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/cyber-security-notice\\\/\"\n\t        },\n\t        {\n\t            \"@type\": \"Person\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#\\\/schema\\\/person\\\/9ff0beaf9880732481f3c12fb84dfb93\",\n\t            \"name\": \"Jason Foster\",\n\t            \"description\": \"Jason Foster is a director and risk manager for public and private credit portfolios at a global credit manager in New York. Previously, he was a risk manager on flagship fixed income and multi-asset portfolios at one of the world's largest asset managers. He is the author of open-source R and Python packages for analytical computation and financial data retrieval, available on CRAN and PyPI. Mr. Foster holds bachelor's degrees in mathematics and finance and a master's degree in financial engineering. https:\\\/\\\/www.linkedin.com\\\/in\\\/jasonjfoster\\\/\",\n\t            \"url\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/author\\\/jasonfoster\\\/\"\n\t        }\n\t    ]\n\t}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Time-Series of Implied Shocks Using Principal Component Analysis","description":"Implied shocks are a valuable tool for scenario analysis and are often used to assess the impact of a change in a variable on a portfolio.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.interactivebrokers.com\/campus\/wp-json\/wp\/v2\/posts\/214042\/","og_locale":"en_US","og_type":"article","og_title":"Time-Series of Implied Shocks Using Principal Component Analysis","og_description":"Implied shocks are a valuable tool for scenario analysis and are often used to assess the impact of a change in a variable on a portfolio.","og_url":"https:\/\/www.interactivebrokers.com\/campus\/ibkr-quant-news\/time-series-of-implied-shocks-using-principal-component-analysis\/","og_site_name":"IBKR Campus US","article_published_time":"2026-09-21T16:52:37+00:00","article_modified_time":"2026-09-21T16:56:17+00:00","og_image":[{"width":1000,"height":563,"url":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/number-warp.jpg","type":"image\/jpeg"}],"author":"Jason Foster","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Jason Foster","Est. reading time":"16 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/time-series-of-implied-shocks-using-principal-component-analysis\/#article","isPartOf":{"@id":"https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/time-series-of-implied-shocks-using-principal-component-analysis\/"},"author":{"name":"Jason Foster","@id":"https:\/\/ibkrcampus.com\/campus\/#\/schema\/person\/9ff0beaf9880732481f3c12fb84dfb93"},"headline":"Time-Series of Implied Shocks Using Principal Component Analysis","datePublished":"2026-09-21T16:52:37+00:00","dateModified":"2026-09-21T16:56:17+00:00","mainEntityOfPage":{"@id":"https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/time-series-of-implied-shocks-using-principal-component-analysis\/"},"wordCount":3035,"commentCount":0,"publisher":{"@id":"https:\/\/ibkrcampus.com\/campus\/#organization"},"image":{"@id":"https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/time-series-of-implied-shocks-using-principal-component-analysis\/#primaryimage"},"thumbnailUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/number-warp.jpg","keywords":["correlation matrix","Data Science","Econometrics","GitHub","Implied Shocks","Principal Component Analysis","Python","R","R\/Finance","RcppParallel","roll package","rolleigen package","rstats","Time Series"],"articleSection":["Data Science","Programming Languages","Quant","Quant Development","R Development"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/time-series-of-implied-shocks-using-principal-component-analysis\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/time-series-of-implied-shocks-using-principal-component-analysis\/","url":"https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/time-series-of-implied-shocks-using-principal-component-analysis\/","name":"Time-Series of Implied Shocks Using Principal Component Analysis | IBKR Campus US","isPartOf":{"@id":"https:\/\/ibkrcampus.com\/campus\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/time-series-of-implied-shocks-using-principal-component-analysis\/#primaryimage"},"image":{"@id":"https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/time-series-of-implied-shocks-using-principal-component-analysis\/#primaryimage"},"thumbnailUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/number-warp.jpg","datePublished":"2026-09-21T16:52:37+00:00","dateModified":"2026-09-21T16:56:17+00:00","description":"Implied shocks are a valuable tool for scenario analysis and are often used to assess the impact of a change in a variable on a portfolio.","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/time-series-of-implied-shocks-using-principal-component-analysis\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ibkrcampus.com\/campus\/ibkr-quant-news\/time-series-of-implied-shocks-using-principal-component-analysis\/#primaryimage","url":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/number-warp.jpg","contentUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/number-warp.jpg","width":1000,"height":563,"caption":"Quant"},{"@type":"WebSite","@id":"https:\/\/ibkrcampus.com\/campus\/#website","url":"https:\/\/ibkrcampus.com\/campus\/","name":"IBKR Campus US","description":"Financial Education from Interactive Brokers","publisher":{"@id":"https:\/\/ibkrcampus.com\/campus\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ibkrcampus.com\/campus\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ibkrcampus.com\/campus\/#organization","name":"Interactive Brokers","alternateName":"IBKR","url":"https:\/\/ibkrcampus.com\/campus\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ibkrcampus.com\/campus\/#\/schema\/logo\/image\/","url":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/05\/ibkr-campus-logo.jpg","contentUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/05\/ibkr-campus-logo.jpg","width":669,"height":669,"caption":"Interactive Brokers"},"image":{"@id":"https:\/\/ibkrcampus.com\/campus\/#\/schema\/logo\/image\/"},"publishingPrinciples":"https:\/\/www.interactivebrokers.com\/campus\/about-ibkr-campus\/","ethicsPolicy":"https:\/\/www.interactivebrokers.com\/campus\/cyber-security-notice\/"},{"@type":"Person","@id":"https:\/\/ibkrcampus.com\/campus\/#\/schema\/person\/9ff0beaf9880732481f3c12fb84dfb93","name":"Jason Foster","description":"Jason Foster is a director and risk manager for public and private credit portfolios at a global credit manager in New York. Previously, he was a risk manager on flagship fixed income and multi-asset portfolios at one of the world's largest asset managers. He is the author of open-source R and Python packages for analytical computation and financial data retrieval, available on CRAN and PyPI. Mr. Foster holds bachelor's degrees in mathematics and finance and a master's degree in financial engineering. https:\/\/www.linkedin.com\/in\/jasonjfoster\/","url":"https:\/\/www.interactivebrokers.com\/campus\/author\/jasonfoster\/"}]}},"jetpack_featured_media_url":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/10\/number-warp.jpg","_links":{"self":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/posts\/214042","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/users\/1534"}],"replies":[{"embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/comments?post=214042"}],"version-history":[{"count":70,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/posts\/214042\/revisions"}],"predecessor-version":[{"id":256952,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/posts\/214042\/revisions\/256952"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/media\/214084"}],"wp:attachment":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/media?parent=214042"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/categories?post=214042"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/tags?post=214042"},{"taxonomy":"contributors-categories","embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/contributors-categories?post=214042"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}