다운로드
작성자: admin 작성일시: 2016-06-02 18:30:51 조회수: 1224 다운로드: 253
카테고리: 시계열 분석 태그목록:

시장 모형

요인 모형 중 가장 단순한 구조인 시장 모형(market model)에 대해 설명한다. 요인 모형의 기초에 대해서는 다음 노트북을 참조한다.

시장 모형 (Market Model)

시장 모형은 자본 시장에서 많이 사용되는 대표적인 단일 요인 모형이다. 시장 모형에서는 시장의 초과 수익률을 개별 종목의 초과 수익률에 대한 공통 요인으로 간주한다.

$$ \begin{eqnarray*} r_{it} = \alpha_i + \beta_i r_{mt} + e_{it} \end{eqnarray*} $$
  • $r_{it}$ : 개별 종목의 초과 수익률
  • $r_{mt}$ : 시장의 초과 수익률
  • $\alpha_i$ : 개별 종목의 alpha
  • $\beta_i$ : 개별 종목의 beta

이 경우에는 요인 시계열 즉, $G$ 행렬이 값을 알고 있기 때문에 다음과 같이 요인 가중치 $\xi$ 행렬을 구할 수 있다.

$$ \xi^T = (G^TG)^{-1}(G^TR) $$

시장 모형을 사용하는 예를 살펴보자. 아래는 미국 주식 시장에서 S&P 500 지수와 시총 상위 13개 종목의 1990 ~ 2003의 월간 수익률이다.

In:
df = pd.read_table("http://faculty.chicagobooth.edu/ruey.tsay/teaching/fts2/m-fac9003.txt",
                   header=None, delim_whitespace=True,
                   names=["AA", "AGE", "CAT", "F", "FDX", "GM", "HPQ", "KMB", "MEL", "NYT", "PG", "TRB", "TXN", "SP5"])
In:
df.tail()
Out:
AA AGE CAT F FDX GM HPQ KMB MEL NYT PG TRB TXN SP5
163 3.31 -2.76 6.38 4.44 4.13 11.06 -5.94 5.52 3.56 -0.23 -0.74 -1.90 26.31 1.71
164 -8.48 7.06 -4.24 -6.91 -3.98 -0.49 -2.54 1.00 -3.94 -2.17 6.26 -0.84 -4.48 -1.27
165 20.60 5.36 6.91 13.48 17.51 4.17 15.16 2.83 -0.44 9.29 6.31 6.79 26.86 5.42
166 4.33 -9.36 3.70 8.74 -4.12 1.35 -2.63 2.59 -3.66 -3.20 -2.16 -0.26 2.83 0.64
167 15.74 -1.03 9.09 21.14 -7.14 24.75 5.95 9.53 11.42 4.04 3.71 5.55 -1.35 5.00
In:
(df*0.01+1).cumprod().plot()
plt.show()
In:
G = sm.add_constant(df.ix[:, -1])
G.tail()
Out:
const SP5
163 1.0 1.71
164 1.0 -1.27
165 1.0 5.42
166 1.0 0.64
167 1.0 5.00
In:
R = df.ix[:, :-1]
R.tail()
Out:
AA AGE CAT F FDX GM HPQ KMB MEL NYT PG TRB TXN
163 3.31 -2.76 6.38 4.44 4.13 11.06 -5.94 5.52 3.56 -0.23 -0.74 -1.90 26.31
164 -8.48 7.06 -4.24 -6.91 -3.98 -0.49 -2.54 1.00 -3.94 -2.17 6.26 -0.84 -4.48
165 20.60 5.36 6.91 13.48 17.51 4.17 15.16 2.83 -0.44 9.29 6.31 6.79 26.86
166 4.33 -9.36 3.70 8.74 -4.12 1.35 -2.63 2.59 -3.66 -3.20 -2.16 -0.26 2.83
167 15.74 -1.03 9.09 21.14 -7.14 24.75 5.95 9.53 11.42 4.04 3.71 5.55 -1.35
In:
r = sm.OLS(R, G).fit()
dfXi = r.params.T
dfXi.columns = ["alpha", "beta"]
dfXi.index = df.columns[:-1]
dfXi
Out:
alpha beta
AA 0.549124 1.291591
AGE 0.721806 1.514136
CAT 0.839352 0.940693
F 0.454364 1.219245
FDX 0.799579 0.805117
GM 0.198202 1.045702
HPQ 0.683568 1.627951
KMB 0.546302 0.549805
MEL 0.884926 1.122871
NYT 0.490412 0.770649
PG 0.888091 0.468803
TRB 0.651246 0.717881
TXN 1.438887 1.796412
In:
plt.subplot(311)
dfXi.alpha.plot(kind="bar", rot=0)
plt.title("Alpha")

plt.subplot(312)
dfXi.beta.plot(kind="bar", rot=0)
plt.title("Beta")

plt.subplot(313)
ESS = r.resid.var(axis=0)
TSS = R.var(axis=0)
R2 = 1 - ESS/TSS
R2.plot(kind="bar", rot=0)
plt.title("R squared")

plt.tight_layout()
plt.show()

시장 모형을 사용하게 되면 공분산 행렬이나 상호상관관계(cross-correlation) 행렬 추정시 더 단순하고 안정적인 결과를 얻을 수 있다. 각각의 수익률에서 샘플 상호상관관계를 계산하는 방식은 주식의 수가 크게 증가하면 사실상 잡음만 남게되고 양한정(positive definiteness)를 보장하지 않을 수 있다.

시장 모형을 사용하는 경우에는 다음과 같이 공분산 행렬을 얻을 수 있다.

$$ \text{Cov}[r_t] = \Sigma_m \beta \beta^T + D $$

실제로 단순 계산 결과와 시장 모형을 사용한 결과를 비교해 보자

eclipse plot을 사용하여 상관관계 행렬을 시각화하였다. eclipse plot은 각 원소의 값에 따라 타원의 모양을 다르게 하여 전체 상관관계 행렬의 모습을 한눈에 볼 수 있도록 하는 방법이다.

In:
# 시장 모형을 이용한 상관관계 행렬 계산
sigma_r = G.SP5.var()
beta = dfXi.beta.values[:, np.newaxis]
D = np.diag(r.resid.var(axis=0))
covr = sigma_r * np.dot(beta, beta.T) + D
sdr = np.sqrt(covr.diagonal())
corr_market = covr / np.outer(sdr, sdr)
corr_simple = np.corrcoef(R.T)
In:
sns.heatmap(corr_simple)
plt.title("Correlation (simple calculation)")
plt.axis("scaled")
plt.show()
In:
sns.heatmap(corr_market)
plt.title("Correlation (market model)")
plt.axis("scaled")
plt.show()

두 상호상관관계 행렬의 condition number를 비교한 결과는 다음과 같다.

In:
np.linalg.cond(corr_simple), np.linalg.cond(corr_market)
Out:
(16.237472228496788, 6.7395429275163981)

포트폴리오 최적화

상호상관관계 행렬의 값은 포트폴리오 최적화에도 영향을 미친다.

단순한 최저분산 포트폴리오(GMVP: Global Minimum Variance Portpolio)를 구하는 문제는 다음과 같이 $\omega^{\ast}$를 구하는 최적화 문제와 같다.

$$ \omega^{\ast} = \arg \min_{\omega} \omega^T \Sigma \omega \;\;\; \text{ such that } \;\; \omega^T \mathbf{1} = 1 $$

이 문제의 해는

$$ \omega = \dfrac{\Sigma^{-1} \mathbf{1}}{\mathbf{1}^T \Sigma^{-1} \mathbf{1}} $$

이다.

In:
N = R.shape[1]
ones = np.ones(N)[:, np.newaxis]
corr_simple_inv = np.linalg.inv(corr_simple)
corr_market_inv = np.linalg.inv(corr_market)
omega_simple = corr_simple_inv.dot(ones) / ones.T.dot(corr_simple_inv).dot(ones)
omega_market = corr_market_inv.dot(ones) / ones.T.dot(corr_market_inv).dot(ones)
In:
df_omega = pd.DataFrame({"simple model": omega_simple.flatten(), "market model": omega_market.flatten()}, index=R.columns)
df_omega
Out:
market model simple model
AA 0.032816 -0.014443
AGE -0.003246 0.072485
CAT 0.093300 0.089943
F 0.059307 0.032121
FDX 0.133326 0.135835
GM 0.084466 0.093972
HPQ 0.027328 0.099336
KMB 0.133797 0.114607
MEL 0.011447 -0.022771
NYT 0.099553 0.071429
PG 0.157835 0.185576
TRB 0.122128 0.033564
TXN 0.047944 0.108344
In:
df_omega.plot(kind="bar", rot=0)
plt.title("Global minimum variance portfolio")
plt.show()

질문/덧글

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