

파이썬으로 배우는 포트폴리오 study day7
오늘은 내가 퀀트를 공부하게 된 계기랄까.. [메타코드] 유튜브 채널에서 처음 접하게 된 CAPM을 이 책을 통해 다시 공부하게 되었다.
이미 한 번 접한 내용이라 이해가 수월하게 잘 되면서도 그 때 내가 놓친 내용이 많구나를 느꼈다.
1. 자본자산가격결정모델
자본자산가격결정모델(Capital Asset Pricing Model, CAPM)
전체 시장이 균형 상태(시장에서 수요와 공급이 일치하는 가격이 형성된 상태)에서 자산의 균형가격이 위험을 반영해 어떻게 결정되는지 밝히는 모델
자산의 가격은 수익률에 따라 정해지는데, 자산의 리스크에 따라 기대수익률이 결정되는 과정을 밝히는 것으로 수익률이 리스트에 비례한다는 이론이다.
1.1. 기본 가정
CAPM은 위험과 기대수익률 간의 균형 관계를 보여주는 가격 결정 이론이며, 평균-분산 포트폴리오 이론을 바탕으로 한 것이다.
평균-분산 포트폴리오 이론 가정은 다음 포스팅에서 확인할 수 있다.
2022.11.30 - [TIL/09_QUANT] - [퀀트] 평균-분산 포트폴리오 이론 (1)
[퀀트] 평균-분산 포트폴리오 이론 (1)
파이썬으로 배우는 포트폴리오 study day4 평균-분산 포트폴리오 이론 '포트폴리오 선택'에서 마코위츠는 수익의 분산을 통해 투자 리스크를 수치화했다. 분산 포트폴리오 수익은 개별 주식의 평
joo-code.tistory.com
평균-분산 포트폴리오 이론 가정
- 모든 투자자의 투자 기간은 1 기간이다.
- 투자자는 위험을 회피하고 기대효용을 극대화하려 한다.
- 기대수익률과 표준편차에 따라 투자를 결정하며, 지배원리에 따라 투자 대상을 선택한다.
- 거래비용과 세금은 없으며, 모든 투자자는 무위험이자율로 한도 없는 차입과 대출을 할 수 있다.
CAPM 기본 가정은 이 평균-분산 포트폴리오 이론 가정에서 몇가지 추가한다.
- 모든 투자자는 기대수익률, 분산, 공분산에 대해 같은 기대를 한다. 모든 투자자는 투자 기간이 동일하고, 미래 수익률의 확률분포에 대해 동질적으로 예측하고 있다.
- 증권시장은 완전경쟁시장이며 증권의 공급은 고정돼 있다. 자본과 정보 흐름에 마찰적 요인이 없어 거래비용과 세금이 존재하지 않고, 공매(도) 제한도 없으며, 시장정보는 어느 누구에게나 자유롭게 전달된다고 가정한다.
1.1.1. 동일한 기대와 시장포트폴리오, 그리고 자본시장선
CAPM 기본 가정 중 '모든 투자자는 기대수익률, 분산, 공분에 대해 같은 기대를 한다.'라는 것이 있다.
이 동질적 기대 하에서 모든 투자자의 접점포트폴리오(T)의 구성비율은 시장포트폴리오(m)의 구성비율과 동일하다.
그 이유는
1. 동질적 기대 하에어 모든 투자자가 선택하는 시장의 모든 위험자산은 동일한 접점포트폴리오(T)가 될 것이다.
2. 시장에서는 접점포트폴리오의 위험자산만 거래되고 모든 투자자가 같은 구성비로 위험자산을 보유한다.
3. 결국 시장은 균형을 이룬다. 이 시장 균형상태에서 접점포트폴리오의 각 위험자산은 시장가치(= 가격x수량) 비율대로 구성된다.
4. 접점포트폴리오가 시장가치 비율대로 구성되지 않는다면, 비율에서 벗어난 자산에 대한 초과수요나 초과공급이 발생해 시장 균형이 흐트러진다.
5. 즉, 동일한 기대라는 가정하에서 모든 투자자의 접점포트폴리오(T)의 구성비율은 시장포트폴리오(m)의 구성비율과 갖는다.
결국 접점포트폴리오, 즉 시장포트폴리오(m)은 무위험자산(rf)와 결합하면 이는 위험자산과 무위험자산의 투자배분이 된다. 이때 얻어지는 자본배분선을 자본시장선(CML)이라고 한다.

(자본시장선은 시장 포트폴리오와 무위험자산에 대한 자산배분을 통해 구성 간으한 투자기회들의 기대수익률과 위험간의 관계)
자본시장선(CML)
E(rp)=rf+[E(rm)−rf]σmσP
- E(rm) : 시장포트폴리오의 기대수익률
- σm : 시장포트폴리오의 표준편차
- [E(rm)−rf]σm : 위험의 시장가격 (시장포트폴리오의 위험보상비율(RVAR))
- [E(rm)−rf]σmσP (포트폴리오 P의 위험프리미엄)
포트폴리오 기대수익률 = 무위험 이자율 + 시장포트폴리오의 위험보상비율 x 포트폴리오 위험
자본시장선이 효율적 투자선이 된다면 투자자들의 최적 포트폴리오 선택은 두 단계로 나누어진다.
1단계 : 최적위험자산 포트폴리오 구성
- 모든 투자자는 시장포트폴리오와 무위험자산을 결합한 새로운 효율적 포트폴리오로 자본시장선 상의 포트폴리오를 선택한다.
2단계 : 위험회피성향에 따라 무위험자산과 시장포트폴리오에 대한 자산배분을 통해 최적포트폴리오 선택
- 자본시장선은 자산배분선 중 기울기(위험보상비율)가 가장 큰 선
- 위험보상비율 = 초과수익률 / 위험크기
- 자본시장선은 포트폴리오의 총위험만을 고려하는 포트폴리오의 기대수익률 생성 선형모형 (즉 가격걸정선)
- 시장포트폴리오의 위험프리미엄은 시장포트폴리오의 분산(위험)과 투자자의 위험회피 정도에 비례한다.
결론, 투자신탁 : 1단계는 펀드매니저의 몫, 2단계는 투자자의 몫
- 위험보상비율이 가장 높은 시장포트폴리오를 위험자산 포트폴리오로 제공하고, 개인투자자는 자신의 위험회피 정도에 따라 무위험자산과 시장포트폴리오에 분산투자한다.
그러나 CML은 효율적 포트폴리오에 대한 균형가격일 뿐, 비효율 포트폴리오나 개별 위험자산의 균형가격은 설명하지 못한다.
1.1.2. 포트폴리오 베타

포트폴리오를 구성하면 자산의 수가 늘어날수록 리스크는 체감적으로 감소하지만, 어느 일정 수준 이하로는 내려가지 않는다.
이렇게 분산하더라도 제거할 수 없는 위험, 즉 시장 전체에 공통으로 미치는 위험을 베타라고 한다. 이에 대한 예시로 유가, 경기, 금리 등이 해당한다.
베타
분산 불가능한 위험, 시장위험 또는 체계적 위험
베타는 시장에 대한 개별 자산 또는 포트폴리오 민감도를 의미하는 것으로, 시장수익률이 1%p 변할 때 종목 수익률이 몇 %p 변하는지를 의미한다. 시장수익률은 증권시장의 모든 종목에 투자했을 때 얻을 수 있는 수익률이란 의미도 있지만, 평가 기준이나 KOSPI200 지수 같은 벤치마크 지수의 수익률을 의미한다.
betai=σimσ2m=ρimσiσm=Cov(ri,rm)Var(rm)
(σim=ρimσiσm)
β=1 : 시장과 같은 변동성을 의미
β<1 : 시장의 움직임에 둔감하게 움직이는 종목
β>1 : 시장의 움직임에 민감하게 움직이는 종목
이라고 할 수 있다.
포트폴리오 베타 구하는 예시를 보자.
52주(=1년) 베타는 네이버 금융에서 확인할 수 있다.

베타는 대상 기간에 따라 달라지지만, 해당 기간 내 시장 등락 모든 경우를 포함해 계산한다.
또한 베타에는 산업 특성이 반영돼 있다. 산업이나 개별 종목 중에는 경기에 민감한 것도 있고, 경제가 어려워도 소비를 줄이기 어려운 소비재(에너지, 통신, 식료품 등)처럼 경기에 둔감한 경기 방어주도 있다.
경기 민감 종목의 경우 시장 호재/악재에 따라 민감하게 반응하는데, 수출에 주력하는 산업이나 기술주의 베타는 일반적으로 1.0 이상이다. 이는 시장보다 높은 변동성을 가진다는 것을 의미한다. (밑의 예시의 카카오나 한국조선해양도 그렇다.)
그러나 경기방어주로 분류되는 한국전력의 경우 같은 날 52주 베타는 0.39.
물론, 베타가 크다고 해서 수익률이 높은 것은 아니다. 베타는 벤치마크 또는 시장에 대한 상대적인 반응을 보여주는 평가지표 중 하나기 때문.
베타가 1보다 큰 종목, 1보다 작은 종목, 1에 가까운 종목을 구성하기 위해 다음과 같은 포트폴리오를 구성했다고 가정해보자. (2022.12.04 기준)
종목 | 52주 베타 | 투자금액 |
카카오 | 1.35 | 5억 원 |
한국전력 | 0.39 | 2억 원 |
한국조선해양 | 1.02 | 3억 원 |
포트폴리오의 베타 = (1.35 x \frac{5}{10}) + (0.39 x \frac{2}{10}) + (1.02 x \frac{3}{10}) = 1.059
이를 파이썬으로 구해보면 다음과 같다.
베타 구하기 PYTHON CODE
import numpy as np
# 네이버 금융에서 조회한 세 종목의 52주 베타를 beta52 변수에 리스트 형태로 저장
beta52 = [1.35, 0.39, 1.02]
# 투자금액을 investment 변수에 리스트 형태로 저장
investment = [5,2,3]
# 투자 비중을 구하기 위해 미리 투자금액의 합계를 구함
sumOfInvestment = sum(investment)
# 각 종목 투자금액을 전체 투자금액 합계로 나눠 투자 비중을 weights 변수에 리스트로 저장
weights = [w / sumOfInvestment for w in investment]
# dot 함수를 이용해 두 개의 리스트 investment, weight의 곱의 합계를 구한다.
beta = np.dot(beta52, weights)
print('The portfolio beta is {0:0.2f}'.format(beta))
# >> The portfolio beta is 1.06
이번에는 KOSPI 지수와 포트폴리오 A와 B의 시장가치로 구성된 시계열 데이터를 갖고 베타를 구하는 코드를 알아보자.
import pandas as pd
import numpy as np
import math
df = pd.read_csv('./data/portfolioAB.csv')
df.head()

# 세 개 컬럼의 일간수익률을 계산하기 위해 pct_change() 함수 사용
rtns = df[['KOSPI','PortA','PortB']].pct_change()
# 일간수익률에 math.sqrt(252)(root 252)를 곱해 연율화
vol_m = rtns['KOSPI'].std() * math.sqrt(252)
vol_A = rtns['PortA'].std() * math.sqrt(252)
vol_B = rtns['PortB'].std() * math.sqrt(252)
# 변동성 출력
print('KOSPI200 변동성 : {:0.2%}'.format(vol_m))
print('Portfolio A 변동성 : {:0.2%}'.format(vol_A))
print('Portfolio B 변동성 : {:0.2%}'.format(vol_B))
# >> KOSPI200 변동성 : 9.87%
# >> Portfolio A 변동성 : 4.17%
# >> Portfolio B 변동성 : 4.78%
참고
연율화(YR)
- 특정 기간동안 수집된 데이터를 1년 단위로 만드는 것.
- 비즈니즈 데이 252일
- 일별 데이터가 아니라 하나의 year로 보는 것
YR=(1+MR)12−1
(MR : monthly returns)
volatility = Risk = sd(표준편차)
YV=s.d.√252
# 포트폴리오 수익률의 공분산 계산
covs = rtns.cov()
cov_mA = covs.loc['KOSPI','PortA']
cov_mB = covs.loc['KOSPI','PortB']
# 시장포트폴리오, KOSPI 수익률의 분산 계산
var_m = rtns['KOSPI'].var()
# 포트폴리오 A와 B의 베타 계산
beta_A = cov_mA / var_m
beta_B = cov_mB / var_m
print('Portfolio A의 beta: {:.4f}'.format(beta_A))
print('Portfolio B의 beta: {:.4f}'.format(beta_B))
# >> Portfolio A의 beta: 0.0154
# >> Portfolio B의 beta: 0.0186
베타 구하는 공식!!
$$
\beta_i = \frac{Cov(r_i, r_m)}{Var(r_m)}
$$
참고 자료
https://slidesplayer.org/slide/16168640/
https://slidesplayer.org/slide/15140765/