다운로드
작성자: admin 작성일시: 2016-06-02 20:33:45 조회수: 1208 다운로드: 266
카테고리: 시계열 분석 태그목록:

BARRA 산업 요인 모형

BARRA 산업 요인(Industry Factor) 모형은 특정 산업군(industry)에 속하는 종목의 주식 가격이 공통적으로 가지고 있는 요인 시계열을 구하기 위한 것이다.

BARRA 산업 요인 모형 요인 가중치(factor loading)은 주식이 해당 산업군에 속하면 1, 속하지 않으면 0이 되는 값이다.

$$ r_t = \beta_1 f_{t1} + \beta_2 f_{t2} + \cdots + \beta_m f_{tm} + e_t $$$$ \beta_{ij} = \begin{cases} 1 & \text{종목 $i$가 industry $j$에 속한 경우} \\ 0 & \text{종목 $i$가 industry $j$에 속하지 않은 경우} \end{cases} $$

시장 모형과 달리 BARRA 산업 요인 모형은 요인 가중치 $\beta$ 를 구하는 것이 아니라 요인 시계열 $f_t$ 자체를 구하는 작업이다. 그런데 개별 요인 시계열 $e_t$의 분산 크기가 다르기 때문에 OLS(ordinary least square)가 아닌 WLS(weight least square)를 사용하여 $f$를 구한다.

$$ f_t = (\beta^T D^{-1}\beta)^{-1}(\beta^TD^{-1}) r_t $$

여기에서 $$ D = \text{diag}(\text{Var}[e_1], \ldots, \text{Var}[e_k] ) $$ 이다.

Factor Mimicking Portfolio

위에서 WLS로 구한 요인 시계열은 사실 Factor Mimicking Portfolio 이라는 포트폴리오의 수익률이 된다. Factor Mimicking Portfolio의 정의는 다음과 같다.

  • 해당 팩터에 대한 포트폴리오의 exposure합이 1
  • 개별 요인 시계열에 의한 포트폴리오 변동성을 최소화

하는 포트폴리오이다. 이를 포트폴리오 최적화 문제로 바꾸면 다음과 같다.

$$ \omega_{\ast} = \arg \min_{\omega} \left( \dfrac{1}{2} \omega^T D \omega \right) \;\;\; \text{ such that } \;\;\; \omega^T \beta = 1 $$

이 문제의 해는 $$ f_t = (\beta^T D^{-1}\beta)^{-1}(\beta^TD^{-1}) r_t $$

이다.

2 단계 추정법

실제로는 개별 요인에 대한 분산 $D$를 알지 못하기 때문에 BARRA 산업 요인 모형을 계산하는 작업은 쉽지 않다. 따라서 다음과 같은 2 단계 추정법을 사용한다.

  1. $D=I$로 놓고 OLS로 임시 요인 시계열 $f_O$ 를 구한다. $$ \hat{f}_{t,o} = (\beta^T\beta)^{-1}(\beta^T) r_t $$
  2. 이 분석에서 나온 잔차(residual)을 사용하여 $\hat{D}_O$를 추정한다. $$ \begin{eqnarray*} \hat{D}_o &=& \text{diag} \left( \dfrac{1}{T-1} \sum_{t=1}^T \hat{e}_{t,o}\hat{e}_{t,o}^T \right) \\ \hat{e}_{t,o} &=& r_t - \beta \hat{f}_{t,o} \end{eqnarray*} $$
  3. 추정된 $\hat{D}_O$를 사용하여 WLS 로 요인 시계열 $f$ 를 구한다. $$ \hat{f}_{t,g} = (\beta^T\hat{D}_o^{-1}\beta)^{-1}(\beta^T\hat{D}_o^{-1}) r_t $$
  4. 이 분석에서 나온 잔차(residual)을 사용하여 보다 정확한 $\hat{D}$를 추정한다. $$ \begin{eqnarray*} \hat{D}_g &=& \text{diag} \left( \dfrac{1}{T-1} \sum_{t=1}^T \hat{e}_{t,g}\hat{e}_{t,g}^T \right) \\ \hat{e}_{t,g} &=& r_t - \beta \hat{f}_{t,g} \end{eqnarray*} $$

BARRA 산업 요인 모형의 계산 예

실제 데이터를 사용하여 BARRA 산업 요인 모형을 계산해보자.

우선 분석하고자하는 주식의 수익률 시계열을 구한다.

In:
df = pd.read_table("http://faculty.chicagobooth.edu/ruey.tsay/teaching/fts3/m-barra-9003.txt",
                   delim_whitespace=True)
ret = (df - df.mean())
In:
ret.tail()
Out:
AGE C MWD MER DELL HPQ IBM AA CAT PG
163 -4.117202 -5.398274 0.90244 -2.947976 -8.049762 -7.306726 -0.00506 2.218869 5.145893 -1.824821
164 5.702798 2.821726 1.47244 -2.617976 -2.449762 -3.906726 6.57494 -9.571131 -5.474107 5.175179
165 4.002798 2.771726 7.25244 8.442024 2.820238 13.793274 0.17494 19.508869 5.675893 5.225179
166 -10.717202 -2.938274 -1.19756 -6.027976 -8.869762 -3.996726 0.23494 3.238869 2.465893 -3.244821
167 -2.387202 1.061726 2.74244 1.192024 -6.599762 4.583274 1.23494 14.648869 7.855893 2.625179

각 주식의 산업군은 다음과 같이 정의한다.

In:
indus = pd.DataFrame([[1,0,0],
                      [1,0,0],
                      [1,0,0],
                      [1,0,0],
                      [0,1,0],
                      [0,1,0],
                      [0,1,0],
                      [0,0,1],
                      [0,0,1],
                      [0,0,1],
                     ], columns=["fin", "tech", "oth"], index=ret.columns).T
indus
Out:
AGE C MWD MER DELL HPQ IBM AA CAT PG
fin 1 1 1 1 0 0 0 0 0 0
tech 0 0 0 0 1 1 1 0 0 0
oth 0 0 0 0 0 0 0 1 1 1

일단 OLS를 사용하여 요인 시계열을 구하면 다음과 같다.

In:
r_ols = sm.OLS(ret.T, indus.T).fit()
factor_ols = r_ols.params.T
factor_ols.plot(subplots=True, figsize=(8, 8))
plt.show()
In:
(1 + 0.01 * factor_ols).cumprod().plot()
plt.show()

여기에서 주식별 개별 요인 분산을 구하면 다음과 같다.

In:
r_ols.resid.T.var().plot(kind="bar", rot=0)
plt.show()
In:
D_ols = np.diag(r_ols.resid.T.var())
D_ols_inv = np.linalg.inv(D_ols)
indus2 = pd.DataFrame(np.linalg.inv(indus.dot(D_ols_inv).values.dot(indus.T)).dot(indus.dot(D_ols_inv)),
                      columns=indus.columns, index=indus.index)
indus2
Out:
AGE C MWD MER DELL HPQ IBM AA CAT PG
fin 0.187043 0.254787 0.258649 0.29952 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
tech 0.000000 0.000000 0.000000 0.00000 0.227239 0.401494 0.371267 0.000000 0.000000 0.000000
oth 0.000000 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.331941 0.432094 0.235965

구해진 주식별 개별 요인 분산을 사용하여 WLS를 하면 최종 요인 시계열을 구할 수 있다.

In:
r_wls = sm.WLS(ret.T, indus.T, D_ols.diagonal()).fit()
factor_wls = r_wls.params.T
factor_wls.plot(subplots=True, figsize=(8, 8))
plt.show()
In:
(1 + 0.01 * factor_wls).cumprod().plot()
plt.show()

OLS 결과와 WLS 결과를 비교하면 미세한 차이가 있음을 알 수 있다.

In:
df1 = (1 + 0.01 * factor_ols).cumprod()
df2 = (1 + 0.01 * factor_wls).cumprod()
df1.columns = ["fin_ols", "tech_ols", "oth_ols"]
pd.concat([df1, df2], axis=1).plot()
plt.show()

이 결과의 타당성을 살피기 위해 원래 주식의 움직임을 산업별로 그리면 다음과 같다.

In:
df4 = (1 + 0.01 * ret).cumprod()
plt.figure(figsize=(8,8))
ax1 = plt.subplot(311)
df4.ix[:, :4].plot(ax=ax1)
plt.title("Fin")
ax2 = plt.subplot(312)
df4.ix[:, 4:7].plot(ax=ax2)
plt.title("Tech")
ax3 = plt.subplot(313)
df4.ix[:, 7:].plot(ax=ax3)
plt.title("Oth")
plt.tight_layout()
plt.show()

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!