Project

[PJ01-03] Value at Risk 측정 및 종목별 가중치 설정

행당산등산객 2024. 2. 17. 14:18

https://hjsong2.tistory.com/10

 

[PJ01-02] VAR 모델링을 통한 예측과 실젯값과의 비교

https://hjsong2.tistory.com/9 [PJ01-01] 정상성 검정과 인과관계 검정 with R 동아리에서 열심히 겨울 프로젝트를 진행중이다. 우리 조가 선택한 주제는 'VAR 모델을 이용한 포트폴리오의 수익률 예측과 Value

hjsong2.tistory.com

지난번 포스팅을 통해 수익률 예측에 가장 적합한 모델을 선정하였다.

 

그 결과 나는 변수2,6,9를 이용하고 11의 차수를 갖는 VAR model을 선정하였다.

 

이번 포스팅을 통해 조원들이 선택한 종목들의 Value at Risk(VaR)을 계산하고, 이를 토대로 최종 포트폴리오의 투자 가중치를 설정할것이다.

 

#VaR

 

Jorion(2007)은 VaR은 주어진 신뢰수준 하에서 일정 기간에 발생 가능한 최대 손실금액이라고 정의하였다.

 

시간이 지나면서 크고작은 금융위기들이 반복되고, 이러한 위기에 대응하기 위한 리스크 관리의 중요성은 점점 커지고 있다.

 

다양한 금융 위험 중 시장 위험의 측도가 되는 VaR의 중요성도 따라서 커지고 있다.

 

VaR 측정은 기본적으로 과거 수익률 데이터를 이용하고, 측정 방법은 다양하지만 이번 포스팅에서는 가장 간단한 방법인 RiskMetrics 방법을 이용할 것이다.

 

VaR의 정확한 정의와 다른 측정 방법들은 이후 FinancialTimeSeries 카테고리에서 다룰 예정이다.

 

우선 다음과 같이 필요한 라이브러리와 수익률 데이터를 가져오고, 이후 포트폴리오의 VaR 측정을 위한 상관계수 행렬을 만들어준다.

 

우리는 20213년 1월부터 2022년 12월까지의 월별 수익률 데이터를 이용할 것이고, 1-period VaR을 측정할 것이다.

 

여기서 말하는 period는 한 달을 의미한다.

 

> library(readxl)
> library(rugarch)

> data <- read_xlsx('MonthlyReturn.xlsx', sheet=1)
> data <- data[,-1]
> data <- data/100
> cor_matrix <- cor(data)

그러면 다음과 같은 상관계수 행렬을 얻을 수 있다.

 

우리는 매수 포지션을 가정할 것이고 다음과 같이 log return을 설정해준다.

 

일반적으로 return과 log return은 테일러 정리에 의해 거의 근사하므로 log return을 이용해줘도 무관하다.

 

> loss <- c()
> for (i in 1:5){
+   loss[[i]] <- -log(data[[i]] + 1)
+ }

이제 본격적으로 RiskMetrics를 이용해보겠다.

 

RiskMetrics의 정확한 정의는 다음과 같다.

 

$x_t^*$를 1원에 대한 손실이라고 했을 때,

 

쉽게 $x_t^* \sim ARMA(0,0)$, $\sigma_t^2 \sim IGARCH(1,1)$이라고 생각하면 된다.

 

RiskMetrics에 대한 자세한 내용은 다음에 다시 포스팅 하겠다.

 

RiskMetrics를 이용해 신뢰수준 99%에 대한 VaR 측정을 다음과 같이 진행한다.

 

> VaR <- c()
> model <- ugarchspec(mean.model = list(armaOrder = c(0,0), include.mean = F),
+                     variance.model = list(model = 'iGARCH', garchOrder = c(1,1)),
+                     fixed.pars = list(omega = 0))
> for (i in 1:5){
+   fit <- ugarchfit(spec = model, data = loss[[i]])
+   pred <- ugarchforecast(fit, n.ahead = 1)
+   sig <- as.numeric(sigma(pred))
+   
+   VaR[i] <- qnorm(0.99)*sig
+ }
> VaR
[1] 0.3533247 0.2965840 0.3359620 0.2115340 0.1832097

그러면 위와 같이 첫 번째 종목부터 다섯 번째 종목까지의 VaR이 출력된 것을 볼 수 있다.

 

이제 본격적으로 포트폴리오의 VaR을 측정할 것이다.

 

포트폴리오의 VaR은 다음과 같이 계산된다.

 

$\text{VaR}_{1-p}$를 신뢰수준이 $(1-p)$일 때 포트폴리오의 1원에 대한 VaR,

 

$\text{VaR}_{i,1-p}$를 신뢰수준이 $(1-p)$일 때 $i$번째 종목의 1원에 대한 VaR,

 

$w_i$를 $i$번째 종목의 투자 가중치, $\rho_{ij}$를 $i$번째 종목과 $j$번째 종목의 상관계수를 의미할 때,

 

$$ \text{VaR}_{1-p} = \sqrt{ \sum_{i=1}^N(w_i \text{VaR}_{i,1-p})^2 + 2 \sum_{i<j}^N \rho_{ij} (w_i \text{VaR}_{i,1-p})(w_j \text{VaR}_{j,1-p}) }.$$

 

언뜻 복잡해보이지만 행렬을 이용하면 아주 쉽게 구할 수 있다.

 

#최적화가중치

 

포트폴리오의 VaR 계산하는 식을 알아보았지만 아직 우리가 모르는 변수가 있다.

 

바로 투자 가중치다.

 

우리는 최적의 포트폴리오를 만들기 위해 포트폴리오의 VaR을 최소로 만드는 가중치를 찾을것이다.

 

이를 위해 다음과 같이 진행한다.

 

> library(nloptr)
> objective_function <- function(x) {
+   return(t(x*VaR)%*%cor_matrix%*%(x*VaR))
+ }
> hin.objective <- function(x){
+   return(x)
+ }
> heq.objective <- function(x){
+   return(sum(x)-1)
+ }
> result <- slsqp(x0 = rep(0.2,5), fn = objective_function,
+                 lower = rep(0.05,5), upper= rep(0.4,5),
+                 hin = hin.objective, heq = heq.objective)

objective_function은 우리가 최적화 시켜야 하는 함수를 설정하는데 여기선 포트폴리오의 VaR 구하는 식을 넣었다.

 

여기서 말하는 x는 가중치 벡터로 5×1 벡터라고 생각하면 되겠다.

 

hin.objective는 각 투자 가중치가 0보다 크도록 하기 위해 설정하였고

 

heq.objective는 모든 투자 가중치의 합이 1이 되도록 설정하였다.

 

또한 lower와 upper 파라미터를 통해 각 투자 가중치의 최솟값은 0.05, 최댓값은 0.4가 되도록 설정하였다.

 

그 결과는 다음과 같다.

 

> optimal_x <- result$par
> optimal_x
[1] 0.11609624 0.08240808 0.06071344 0.34078224 0.40000000

이렇게 구한 최적의 가중치를 이용해 최종 포트폴리오의 VaR을 계산해보자.

 

> VaR_port <- sqrt(t(VaR*optimal_x)%*%cor_matrix%*%(VaR*optimal_x))
> VaR_port
          [,1]
[1,] 0.1532499

최종 포트폴리오의 1원에 대한 VaR은 0.1532499원이다.

 

우리가 처음 각 종목별 VaR을 구한 것과 비교해보면 VaR이 눈에 띄게 줄어들었다는 것을 알 수 있다.

 

.

 

오늘은 각 종목의 VaR을 구하고 이를 이용해 최적의 투자 가중치를 구한 후 최종 포트폴리오의 VaR을 구하는 과정까지 알아보았다.

 

이제 겨울방학 프로젝트도 거의다 끝나간다..

 

모두 남은 시간 화이팅!!

 

오늘은 여기까지.