R | python | 체계적위험 베타 자동 계산 | Valuation
Jan 17, 2022
Valuation | 엑셀로 블룸버그와 같은 베타 계산하기 에서 엑셀로 베타 계산하는 방법에 대해서 정리한 바 있다. 엑셀로 베타를 계산하기 위해서는 몇 차례 번거로운 수작업을 필요로 하므로 R을 활용하여 나의 손 대신 컴퓨터가 작업하도록 하는 방법을 알아보고자 한다.
베타 계수는 개별주식과 전체시장의 수익률의 공분산을 분산으로 나누는 식으로 계산할 수 있다.
Beta :
$$ \beta = covariance(R_e, R_m) / variance(R_m) $$
Where,
Re: 개별주식 수익률
Rm: 전체시장 수익률
covariance: 개별주식 수익률의 변화가 전체시장 수익률의 변화에 관련 수준
variance: 시장의 데이터들이 평균에서 얼마나 분산되어 있는지의 수준
그러나, Valuation | 엑셀로 블룸버그와 같은 베타 계산하기 에서와 같이 회귀분석 기능이 있는 프로그램(엑셀 또는 R)이 있다면 공분산과 분산을 계산하여 나누는 산식을 만들지 않아도 회귀분석 결과의 Coefficient를 알아낼 수 있으므로 이 방법을 적용해 보고자 한다. R은 태생이 통계 프로그램으로 탄생하였다는 것에 걸맞게 놀라울 정도로 너무나도 간단하게 회귀분석의 결과를 알 수 있는 lm 함수를 가지고 있다.
lm함수로 수익률 벡터 두 개를 ~ 물결 표시로 단순하게 이어주기만 하면 회귀분석의 결과가 산출된다.
주가 데이터를 다운로드 받고 재구성하는 과정을 모두 코드로 구현하고자 하다 보니 주가지수 데이터와 개별주가 데이터를 가져오는 것에 대하여 문제가 생겼다.
R의 주가 데이터를 수집하는 package로 quantmod가 있다. 문제는 이 패키지가 yahoo finance에서 주가 및 주가지수 데이터를 가져오는데 yahoo가 우리나라에서 떠나버려서인지 코스피지수 또는 주식 등의 데이터가 완전하게 수집되지가 않고 코스닥 주식의 경우에는 전혀 되지 않는 등 불안하게 동작한다.
그렇다면 크롤링을 해서 해결해야 하는데 그래서인지 검색엔진에 “R 주가 크롤링"을 검색하면 이에 관련한 내용이 많이 나온다. ‘R로 주가를 가져오고자 하는 사람들은 대부분 크롤링으로 해결하나?’ 하는 생각이 든다.
하지만 크롤링은 하기 싫고 패키지를 사용해서 짧고 강한 코드를 쓰고 싶다.
python의 모듈을 사용해서 주가 데이터를 가져와 보는 것을 생각했다. python에는 finance-datareader1라는 모듈이 있는데 잘 동작해 줄 것으로 기대한다.
R에서 python의 패키지를 사용할 수 있다. R의 reticulate 패키지를 사용하면 마치 R의 함수를 사용하듯이 python의 함수를 사용할 수도 있고 python의 REPL을 작동할 수도 있으며 py 스크립트를 실행 할 수도 있다.
R에서 python을 구동하는 패키지 reticulate 은 https://rstudio.github.io/reticulate/ 사이트에 설명이 있다.
install.packages("reticulate")
R도 잘 배워서 능숙하게 사용하고 python도 역시 잘 사용할 수 있게 되고자 하면 둘 다 제대로 사용하지 못할 것 같다는 생각에 R을 주로 사용해야겠다고 생각했었다. 실제로 python은 생각보다 많이 어렵다. python을 쉽게 생각했다가 한도 끝도 없이 깊어지는 것을 풍자하는 그림 같은 것들이 웹에 떠다니기도 한다. 그러나 python에 구현되어 있는 좋은 기능이 있으면 가져다 쓰면 R이 포함하지 못하는 것까지 구현이 가능하다. 완벽한 프로그램은 없다. R도 python도 무료 오픈소스 프로그램이므로 공짜로 유연하게 사용할 수 있는 것 자체로 감사하다.
시작 일자와 마지막 일자를 문자열 객체 변수로 할당해 준다. 또한 코스피 코드와 주식 코드를 문자열 객체 변수로 할당한다.
start_date <- '2016-01-01'
end_date <- '2020-12-31'
index_code <- 'ks11'
stock_code <- '005930'
코스피 지수와 삼성전자의 2016년부터 2020년까지의 5년 동안의 주가지수와 개별주가를 가져와서 회귀분석의 결과를 나타낸다.
주가지수와 개별주식을 끌어 오는 것은 python의 finance-datareader가 맡고 회귀분석은 R의 lm() 함수가 맡는다.
library(reticulate)
fdr <- import("FinanceDataReader")
KOSPI <- fdr$DataReader(index_code, start_date, end_date)
samsung <- fdr$DataReader(stock_code, start_date, end_date)
Coeff <- lm(samsung$Change ~ KOSPI$Change)
Coeff[[1]][[2]]
python의 모듈 기능을 사용해서 주가를 가져와서 R의 lm 함수로 회귀분석을 하고 그 결과 중 기울기에 해당하는 베타 값을 뽑아 내는 코드가 단 몇줄로 해결할 수 있게 되었다. 여기에 반복문을 사용하면 여러 개의 회사에 대한 베타를 한번에 뽑아 내는 것도 쉽게 구현할 수 있을 것 같다.
멋지다!
-
finance-datareader는 conda로 설치 할 수 없으므로 R에서 reticulate::py_install() 함수로 설치할 수가 없는 것이 조금 아쉽다. shell에서 python의 pip를 사용하여 설치해야 한다. pip install -U finance-datareader ↩︎