시계열 데이터의 수익률을 계산하는 일들이 많아지면서
복잡한 모듈들을 만들 때 아래의 함수들과 패키지가 얼마나 유용한지
몰랐었다.
오늘 정리해보고자 하는 함수는 3가지이며, 부가적으로 시계열 데이터셋에 날짜의 전처리 부담을 줄여주는 xts package 를 조금씩 이용해보려 한다.
library(xts)
예제 데이터 만들기
오늘 날짜를 기준으로 약 한 달 전 까지의 코스닥 지수를 예제 데이터로
이용해 보고자 한다. (본 포스팅 글의 오늘 날짜는 스크립트를 작성한 기준
날짜를 기준으로 한다)
R에서는 특정 주가지수를 자동으로 불러올 수 있는 유용한 패키지가 있는데
바로 quantmod package이다.
library(quantmod)
quantmod package는 앞서 말한 xts package와 종속관계 이므로 quantmod
package를 로드하면 같이 함께 로드된다. (zoo package 도 마찬가지)
여하튼 KOSPI 지수를 받기 위한 코드는 아래와 같다.1
<- Sys.Date()
today <- getSymbols("^kq11", from = today - 30, to = today, auto.assign = F)
kq 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
를 최종 예제데이터로 삼겠다.
<- kq[,4] data
일일 수익률 계산하기
예제데이터를 이용하여 일일 수익률을 계산해 보겠다.
현재의 수익률은 현재 시차 지수를 직전날 시차 지수로 나눠 준 후 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
로 디폴트값이
잡혀있는데, 이를 조정하는것도 가능하다.
data
와 lag(data)
를 나누고 상수 1을 뺌으로써
간단히 일일수익률을 계산할 수 있게 된다.
/lag(data) - 1 data
## 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()
함수를 알지 못한다면 아래와 같은 해괴망측한
수동적인 코드로써 구현해야 했을 것이다.
<- data
res 1] <- NA
res[
for(i in 2:nrow(data)){
<- data[[i]]/data[[i - 1]] - 1
res[i] # 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))
과 동일한 값이 반환되는
것을 확인할 수 있다.
필자는 quantmod package와, 주가지수데이터셋을 끌어올 수 있는 함수 및 코드를 카페회원분의 질문글을 통해 처음으로 알게 되었다.↩︎