Lovetoken

저는 개발 취향을 가진 데이터 분석가 Jr. 입니다.

Navigation
 » Home
 » About Me
 » Github

R에서 수익률 구해보며 lag(), diff() 함수 알아보기

18 May 2016 » R



시계열 데이터의 수익률을 계산하는 일들이 많아지면서
복잡한 모듈들을 만들 때 아래의 함수들과 패키지가 얼마나 유용한지 몰랐었다.

오늘 정리해보고자 하는 함수는 3가지이며, 부가적으로 시계열 데이터셋에 날짜의 전처리 부담을 줄여주는 xts package 를 조금씩 이용해보려 한다.

library(xts)



예제 데이터 만들기

오늘 날짜를 기준으로 약 한 달 전 까지의 코스닥 지수를 예제 데이터로 이용해 보고자 한다. (본 포스팅 글의 오늘 날짜는 스크립트를 작성한 기준 날짜를 기준으로 한다)
R에서는 특정 주가지수를 자동으로 불러올 수 있는 유용한 패키지가 있는데 바로 quantmod package이다.

library(quantmod)

quantmod package는 앞서 말한 xts package와 종속관계 이므로 quantmod package를 로드하면 같이 함께 로드된다. (zoo package 도 마찬가지)
여하튼 KOSPI 지수를 받기 위한 코드는 아래와 같다.1

today <- Sys.Date()
kq <- getSymbols("^kq11", from = today - 30, to = today, auto.assign = F)
kq
##            KQ11.Open KQ11.High KQ11.Low KQ11.Close KQ11.Volume
## 2018-04-30    886.29    886.60   870.54     875.95     1351100
## 2018-05-02    869.52    877.54   863.59     871.03     1357600
## 2018-05-03    873.34    876.08   866.05     866.07     1354500
## 2018-05-04    868.35    870.10   856.34     856.34     1132000
## 2018-05-08    860.56    863.56   827.20     827.22      948400
## 2018-05-09    833.48    851.28   815.27     850.85      905900
## 2018-05-10    852.28    855.82   846.14     854.93      857400
## 2018-05-11    855.25    866.86   855.25     865.93      941500
## 2018-05-14    869.44    869.92   855.54     858.70      922200
## 2018-05-15    865.53    867.13   858.55     862.94     1007600
## 2018-05-16    857.24    857.24   846.90     850.29     1210600
## 2018-05-17    854.46    857.56   852.91     855.62     1037400
## 2018-05-18    858.08    869.80   857.66     869.45     1064500
## 2018-05-21    871.49    876.12   870.52     872.96      998500
## 2018-05-23    875.12    875.36   867.28     869.16      874600
## 2018-05-24        NA        NA       NA         NA          NA
## 2018-05-25    866.20    870.71   859.09     868.35     1115000
## 2018-05-28    865.58    879.80   865.57     879.69     1270100
## 2018-05-29    881.53    884.64   868.81     870.08     1147700
## 2018-05-30    876.42    876.71   861.84     874.22     1117572
##            KQ11.Adjusted
## 2018-04-30        875.95
## 2018-05-02        871.03
## 2018-05-03        866.07
## 2018-05-04        856.34
## 2018-05-08        827.22
## 2018-05-09        850.85
## 2018-05-10        854.93
## 2018-05-11        865.93
## 2018-05-14        858.70
## 2018-05-15        862.94
## 2018-05-16        850.29
## 2018-05-17        855.62
## 2018-05-18        869.45
## 2018-05-21        872.96
## 2018-05-23        869.16
## 2018-05-24            NA
## 2018-05-25        868.35
## 2018-05-28        879.69
## 2018-05-29        870.08
## 2018-05-30        874.22
class(kq)
## [1] "xts" "zoo"

다양한 메시지와 함께 우리가 보고 싶은 결과물을 xts class 객체로 반환한다.
getSymbols() 함수의 쓰임 법에 대해서 간략히 설명하자면
조회하고자 하는 주가 심볼 문자열을 첫 번째 인자값으로 넣고 from, to 인자에 조회 날짜에 대한 기간 정보를 넣어줌으로써 활용이 가능하다.
예제데이터로 사용될 우리가 선택한 코스닥 심볼은 ‘^kq11’ 이다.
만약 다른 것을 조회하고 싶다면 해당되는 심볼을 찾은 후 기입하면 된다. (ex. 코스피200지수의 경우 ‘^ks11’)

반환된 결과물을 보면 open, high, low, close, volume, adjusted 6개의 상황별 지수가 있는데 종가지수인 close 만 관심의 대상이라 가정하고 subset 을 추출한 데이터 data 를 최종 예제데이터로 삼겠다.

data <- kq[,4]



일일 수익률 계산하기

예제데이터를 이용하여 일일 수익률을 계산해 보겠다.
현재의 수익률은 현재 시차 지수를 직전날 시차 지수로 나눠 준 후 1을 빼면 된다.
현재가 아닌 i번째 시차의 수익률은 i번째 시차지수를 i-1 시차 지수로 나눠준 후 1을 빼면 된다.
모든 i번째 시차에 대해 수익률을 보고싶다면 이를 일괄적으로 수행할 필요가 있다.
이를 간편하게 계산하기 위해 lag() 함수가 유용할 수 있다.

data
##            KQ11.Close
## 2018-04-30     875.95
## 2018-05-02     871.03
## 2018-05-03     866.07
## 2018-05-04     856.34
## 2018-05-08     827.22
## 2018-05-09     850.85
## 2018-05-10     854.93
## 2018-05-11     865.93
## 2018-05-14     858.70
## 2018-05-15     862.94
## 2018-05-16     850.29
## 2018-05-17     855.62
## 2018-05-18     869.45
## 2018-05-21     872.96
## 2018-05-23     869.16
## 2018-05-24         NA
## 2018-05-25     868.35
## 2018-05-28     879.69
## 2018-05-29     870.08
## 2018-05-30     874.22
lag(data)
##            KQ11.Close
## 2018-04-30         NA
## 2018-05-02     875.95
## 2018-05-03     871.03
## 2018-05-04     866.07
## 2018-05-08     856.34
## 2018-05-09     827.22
## 2018-05-10     850.85
## 2018-05-11     854.93
## 2018-05-14     865.93
## 2018-05-15     858.70
## 2018-05-16     862.94
## 2018-05-17     850.29
## 2018-05-18     855.62
## 2018-05-21     869.45
## 2018-05-23     872.96
## 2018-05-24     869.16
## 2018-05-25         NA
## 2018-05-28     868.35
## 2018-05-29     879.69
## 2018-05-30     870.08

날짜에 대한 처리 없이 알아서 주가 데이터가 하루 미루어진다.
lag() 함수의 두번째 인자는 k = 1 로 디폴트값이 잡혀있는데, 이를 조정하는것도 가능하다.
datalag(data) 를 나누고 상수 1을 뺌으로써 간단히 일일수익률을 계산할 수 있게 된다.

data/lag(data) - 1
##              KQ11.Close
## 2018-04-30           NA
## 2018-05-02 -0.005616739
## 2018-05-03 -0.005694433
## 2018-05-04 -0.011234635
## 2018-05-08 -0.034005249
## 2018-05-09  0.028565564
## 2018-05-10  0.004795225
## 2018-05-11  0.012866551
## 2018-05-14 -0.008349383
## 2018-05-15  0.004937685
## 2018-05-16 -0.014659216
## 2018-05-17  0.006268470
## 2018-05-18  0.016163738
## 2018-05-21  0.004037046
## 2018-05-23 -0.004353062
## 2018-05-24           NA
## 2018-05-25           NA
## 2018-05-28  0.013059281
## 2018-05-29 -0.010924286
## 2018-05-30  0.004758130

일일수익률이므로 직전시차 데이터가 존재하지 않는 날은 NA로 계산되고 이후 시차는 수익률을 잘 산출해 주는것을 볼 수 있다.
만약 lag() 함수를 알지 못한다면 아래와 같은 해괴망측한 수동적인 코드로써 구현해야 했을 것이다.

res <- data
res[1] <- NA

for(i in 2:nrow(data)){
    res[i] <- data[[i]]/data[[i - 1]] - 1
} # T_T.....



로그수익률 계산하기

만약 일일 로그수익률을 계산하고 싶다면 현시차 주가를 직전시차주가로 나눠준 후 로그함수를 씌워주면 되는데
방금 알게된 lag() 함수를 이용하면

log(data) - log(lag(data))
##              KQ11.Close
## 2018-04-30           NA
## 2018-05-02 -0.005632573
## 2018-05-03 -0.005710708
## 2018-05-04 -0.011298220
## 2018-05-08 -0.034596879
## 2018-05-09  0.028165175
## 2018-05-10  0.004783764
## 2018-05-11  0.012784480
## 2018-05-14 -0.008384434
## 2018-05-15  0.004925534
## 2018-05-16 -0.014767724
## 2018-05-17  0.006248905
## 2018-05-18  0.016034495
## 2018-05-21  0.004028919
## 2018-05-23 -0.004362564
## 2018-05-24           NA
## 2018-05-25           NA
## 2018-05-28  0.012974743
## 2018-05-29 -0.010984394
## 2018-05-30  0.004746846

의 코드로 일일 로그수익률을 계산할 수 있다.
그런데 log(), lag() 비슷비슷한 함수들이 있어 눈에 확 띄지 않고 복잡해 보인다.
현재는 현시차와 직전시차의 차이값을 구하는 과정이 필요하다.
이 차이를 자동으로 계산해주는 함수가 diff() 이다.
diff() 함수를 이용하여 코드를 더 간결하게 해본 결과이다.

diff(log(data))
##              KQ11.Close
## 2018-04-30           NA
## 2018-05-02 -0.005632573
## 2018-05-03 -0.005710708
## 2018-05-04 -0.011298220
## 2018-05-08 -0.034596879
## 2018-05-09  0.028165175
## 2018-05-10  0.004783764
## 2018-05-11  0.012784480
## 2018-05-14 -0.008384434
## 2018-05-15  0.004925534
## 2018-05-16 -0.014767724
## 2018-05-17  0.006248905
## 2018-05-18  0.016034495
## 2018-05-21  0.004028919
## 2018-05-23 -0.004362564
## 2018-05-24           NA
## 2018-05-25           NA
## 2018-05-28  0.012974743
## 2018-05-29 -0.010984394
## 2018-05-30  0.004746846

주가종목에 로그를 취한 후 현시차와 직전시차의 차이값을 diff() 를 통해 계산한다.
따라서 log(data) - log(lag(data)) 과 동일한 값이 반환되는 것을 확인할 수 있다.


  1. 필자는 quantmod package와, 주가지수데이터셋을 끌어올 수 있는 함수 및 코드를 카페회원분의 질문글을 통해 처음으로 알게 되었다.↩︎