R, 위험과 포트폴리오 계산 등

오랫만에 Facebook에 블로그 글을 올립니다.
학부 1학년들에게 통계학을 가르치면서 R을 사용하고 있답니다. 평균과 분산에 재미를 주기 위해 예들을 많이 구상했지만 못써먹었던 것들이 많습니다. 그 중 하나를 소개합니다.

투자론을 공부하면 통계와 주식 포트폴리오 사이에 상당히 관련이 있다는 점을 알게 됩니다. 어떤 부분에서는 거의 말만 다르고 내용이 똑같습니다.
예를 들어,
여러분이 어떤 투자를 하려 할 때 다음과 같은 상황이 주어졌다고 합시다.

(1) 나쁠 때의 확률이 0.1, 이 때의 수익률이 -10%
(2) 보통 때의 확률이 0.7, 이 때의 수익률이 20%
(3) 좋을 때의 확률이 0.2, 이 때의 수익률이 50%

기대수익률을 R로 계산하면 다음과 같습니다(커서를 R>로 표시).

R> CasesProbabilities <- c( 0.1, 0.7, 0.2 )
R> CasesReturns <- c( -0.1, 0.2, 0.5 )
R> ExpectedReturn <- sum( CasesProbabilities * CasesReturns )
R> ExpectedReturn
[1] 0.23

23%의 수익이 예상됩니다.
네, 맞아요. 이것은 그냥 평균을 구하는 식입니다.

또한,
위험은 자료의 표준편차로 생각할 수 있습니다.

R> ExpectedRisk <- sqrt ( sum ( CasesProbabilities * CasesReturns^2) - ExpectedReturn^2 )

R> ExpectedRisk
[1] 0.1615549

원래 공식이,

표준편차 = sqrt(분산)
분산 = 평균(X^2) - 평균^2

이렇습니다.

문제를 좀 더 현실감 있게 바꾸어 보겠습니다.

어떤 주식 A1, A2, A3, A4를 지난 100일 간 관찰했다고 합시다.
100일 중 국내의 경제여건이 좋았을 때와 좋지 않았을 때, 평범했을 때를 분류하고, 각각의 경우에 있어 투자 수익률을 조사했습니다. 그 결과를 정리하니,

------------------------------
주식  기대수익률  표준편차
------------------------------
A1   12    15
A2   12    12
A3   15    12
A4   18    18
------------------------------

이때 분산계수는 위험수준의 상대적인 척도로 기대수익률 1%에 대한 분산의 비율을 뜻합니다. 즉,

CV = sigma / E(R)

계산을 해보면

R> StockNames <- c("A1","A2","A3","A4")
R> E_r <- c(12,12,15,18)
R> Sigma <- c(15,12,12,18)
R> DataSet <- data.frame(StockNames,E_r,Sigma)
R> DataSet
  StockNames E_r Sigma
1         A1  12    15
2         A2  12    12
3         A3  15    12
4         A4  18    18
R> CVs <- Sigma / E_r
R> DataSet <- cbind(DataSet, CVs)
R> DataSet
  StockNames E_r Sigma  CVs
1         A1  12    15 1.25
2         A2  12    12 1.00
3         A3  15    12 0.80
4         A4  18    18 1.00

위험의 1순의 주식은 A1, 2순위는 A2, A4, 그리고 3순위는 A3 주식입니다. 관리가 필요한 순서가 되겠습니다.

이제 포트폴리오 관리를 생각해 보겠습니다.
자산들의 상대적인 자료가 다음과 같다고 합시다.

A의 기대수익률 = 0.3, 표준편차 0.2
B의 기대수익률 = 0.1, 표준편차 0.08

A의 투자비율이 40%, B가 60%라고 합시다.

이렇게 두 개 이상을 묶어서 투자 관리하는 것을 포트폴리오 관리라고 합니다. 이제 이 포트폴리오의 기대수익률과 표준편차를 계산해 보겠습니다.

먼저 A와 B 수익률의 공분산을 계산해야 합니다. 자료 A와 자료 B가 각각 Data_A, Data_B로 주어졌다고 할 때, 공분산을 계산해보니,

R> cov(Data_A, Data_B)
[1] -0.01

이라고 합시다.

통계에서 결합확률 분포의 분산은
V(a*X+b*Y) = a^2*V(X) + b^2*V(Y)+2a*b*Cov(X,Y)
이므로,
R> 0.4^2*0.2^2+0.6^2*0.08^2+2*0.4*0.6*(-0.01)
[1] 0.003904

저런, 이 포트폴리오를 운영하면 수익이 거의 나지 않겠어요.

---------------------------------------------------------------
함수 c() : 자료를 결합해서 벡터를 생성함
함수 data.frame() : 여러 열벡터를 결합하여 data.frame 자료를 생성함
함수 cbind() : matrix나 data.frame에서 열벡터 결합을 위한 함수
함수 sqrt() : 제곱근을 계산
함수 sum() :  벡터의 원소 합
함수 cov() : 두 벡터의 공분산을 계산함


댓글

이 블로그의 인기 게시물

R에서 csv 파일 읽는 법

xlwings tutorial - 데이터 계산하여 붙여 넣기