팩터의 탄생 : CAPM과 3팩터 모델

시장베타의 탄생, 자산가격결정모형(CAPM)

CAPM(Capital Assets Pricing Model, 자본자산 가격결정 모형)

  • $R_i = R_f + B_i x (R_m-R_f)$

: 투자자들이 투자활동을 하여 시장 전체가 균형상태에 있을 때 주식 등 자본자산의 균형가격은 어떻게 결정되는 가에 관한 모형이라 할 수 있다. 협의로는 증권시장선(SML, Security Market Line)만을 의미하나, 광의로는 자본시장선(CML, Capital Market Line) 과 증권특성선(SCL, Security Characteristic Line)까지 포함한다.

import pandas as pd
from scipy import stats, polyval, polyfit
from pylab import plot, title, show, legend

data1 = pd.read_excel('data2.xlsx',index_row=0)
x = data1['코스피']
y = data1['삼성전자']

기울기, y절편, r-값, p-값, 추정 오차 구하기

slope, intercept, r, p, stderr = stats.linregress(x,y)
ry = polyval([slope, intercept], x) #추정오차
# print(polyfit(x,y,1)) #기울기랑 y절편만 나오는 함수

print("기울기 = ", slope)
print("y절편 = ", intercept)
print("r-value = ", r)
print("p-value = ", p)
print("표준 오차 = ", stderr)
print("추정 오차 = ", ry)
기울기 =  1.1819687821455458
y절편 =  0.00040203012836770557
r-value =  0.7693353333620755
p-value =  0.0
표준 오차 =  0.015144721607603488
추정 오차 =  [ 0.03597929 -0.08079923 -0.03021096 ...  0.00300236 -0.0098811
  0.001584  ]

[그림2.2]삼성전자와 KOSPI 수익률 관계

import matplotlib.pyplot as plt
plt.figure(figsize=(8,4))

plot(x,y,'k.') #실제 데이터
plot(x,ry,'r-') #회귀선
title('Samsung & KOSPI regression (2000~2016)')
legend(['original','regression'])
show()

png

삼성전자&KOSPI 회귀분석 식

import numpy as np

corr = np.corrcoef(x,y)[1,0]
std_x = np.std(x)
std_y = np.std(y)
mean_x = np.mean(x)
mean_y = np.mean(y)
    
beta = corr*std_y / std_x
alpha = mean_y - beta*mean_x
estimated_y = alpha + beta*x

plt.figure(figsize=(8,4))
title('regression')
plot(x,y,'k.') #실제데이터
plot(x,estimated_y,'r-') #회귀선
legend(['original','regression'])
show()

png

삼성전자&KOSPI CAPM

z1 = (data1['코스피']-data1['Rf'])
z2 = (data1['삼성전자']-data1['Rf'])

slope, intercept, r, p, std = stats.linregress(z1,z2)
ry = polyval([slope, intercept], z1)

plt.figure(figsize=(8,4))
plot(z1, z2,'k.') #실제 데이터
plot(z1, ry,'r-') #회귀선

title('samsung & KOSPI CAPM (2000~2016)')
legend(['original','regression'])
show()

png

[표 2.1] 삼성전자와 KOSPI 수익률 회귀분석 결과

regression = [intercept, slope, r*r]
df = pd.DataFrame([regression],index=list('값'),columns=['초과 수익률', 'B(MKT)', 'R Square'])
df.tail()
초과 수익률B(MKT)R Square
0.0037561.0877680.698056
⤧  Next post [Smart Beta] Chapter 2. 팩터의 탄생 : CAPM과 3팩터 모델 (2)