ChanYub Park

2017-11-22

tidyquant로 한국 주식 하려면 tqk

개요

tidyquant의  tq_get()으로 한국의 데이터를 가져오는데 제약이 있어 시작했습니다. 우선  code_get()으로 종목 코드를 가져오고,  tqk_get()으로  tq_get()과 같은 양식의 데이터를 확보하여 이후  tidyquant의 모든 기능을 한국 데이터로 활용할 수 있습니다.

사전준비

tidyquant와  tqk 패키지를 불러옵니다.

주식 데이터를 tidy 개념으로 tidyquant

tidyquant는  quantmod 등 주식 분석을 주 목적으로 하는 중요 함수를 제공하는 중요한 패키지입니다.  tidy data 개념을 활용한 데이터 핸들링,  ggplot과 연계된 강한 차트 그리기, 야후를 기본으로 구글 및 각자 독자적인 데이터 소스로 부터 필요한 데이터를 손쉽게 가져오는 기능, 성능 분석 함수들을 제공하고 있습니다.

주가 지수 가져오기

tidyquant는 야후 파이넨스에서 정보를 가져옵니다. 가져오는 데이터 소스를 바꾸고 싶으면 어떤 곳에서 가져올지 결정할 수 있는데,  tq_get_options()는 가능한 후보를 보여줍니다.

이때 코스피와 코스닥을 이르는 이름이 각각  ^KS11와  ^KOSDAQ입니다. 각각 한번 가져와 보겠습니다.

각 기업의 주가를 가져오려면 종목 번호를 알고 있어야 합니다. 양식은  종목 번호.KS입니다. 종목번호는 세종기업 데이터에서 가져온 정보를 활용하겠습니다.

삼성전자를 가져와 볼까요.

날짜를 지정할 수도 있습니다.

배당금 정보는  dividends 에서 확인하시면 됩니다.

야후 파이넨스가 데이터 소스이다 보니 모든 정보가 있다고 보기 어렵니다. 그것을 커버하기 위해서  tqk가 시작됬습니다.

종목 코드 가져오기

본래  tidyquant 패키지는 symbol(ex> 애플사는 AAPL)를 인자로 주식 데이터를 가져옵니다. 한국 주식은 각 종목별로 코드가 있으며 그것 때문에 코드와 종목명이 매치되있는 데이터를 확인할 수 있어야 합니다.  tqk 패키지는  code_get()함수를 통해 진행 가능합니다.

주식 데이터 가져오기

tqk_get()은 종목 코드로 데이터를 가져오도록 만들었습니다.

데이터는 주요 사이트인 n사, d사, p사 를 모두 대응하는 것을 목표로 하고 있고, 현재 p사(구현 편의성)로 작성되어 있습니다.

Quandl

Quandl은 방대한 양의 경제, 주식에 대한 정보를 가지고 서비스하는 데이터 판매 기업입니다.  Quandl이라는 자체 패키지만을 사용해도 되고,  tidyquant가 내장하고 있어서 같이 사용해도 됩니다.

tidyverse와 함께 사용하는 시계열 데이터

그 동안의 주식관련 패키지들은 파이프 연산자  %>%와 함꼐 사용하지 못했는데,  tidyquant는 그런 문제를 해결하였습니다. 아래 2가지 중요한 함수를 추가함으로써  dplyr과  tidyr의 함수와 함께 사용할 수 있게 되었습니다.

  • tq_transmute(): 계산된 내용의 컬럼만으로 데이터를 구성합니다.
  • tq_mutate(): 데이터에 계산된 내용의 컬럼을 추가합니다.

tq_에서 계산 가능한 함수들

tq_transmute_fun_options() 함수는 각 참고 패키지에서 활용할 수 있는 함수의 리스트를 보여줍니다. 모두  zooxtsquantmodTTRPerformanceAnalytics의 5개 패키지내의 함수를 지원합니다.

zoo 함수

  • 롤링관련 함수 :
    • 롤링 마진에 기능을 적용하는 일반적인 기능.
    • form : rollapply(data, width, FUN, ..., by = 1, by.column = TRUE, fill = if (na.pad) NA, na.pad = FALSE, partial = FALSE, align = c("center", "left", "right"), coredata = TRUE).
    • 옵션에는  rollmax, rollmean, rollmedian, rollsum 등이 있습니다.

xts 함수

  • 기간 적용 기능 :
    • 기능을 시간 세그먼트 (예 :  maxminmean 등)에 적용합니다.
    • 양식 : apply.daily (x, FUN, ...).
    • 옵션은 apply.daily, weekly, monthly, quarterly, yearly를 포함합니다.
  • 기간 기능 :
    • 시계열을 낮은 주기성의 시계열로 변환합니다 (예 : 매일 매일의 주기성으로 변환).
    • 형식 : to.period (x, period = 'months', k = 1, indexAt, name = NULL, OHLC = TRUE, ...).
    • 옵션에는 to.minutes, hourly, daily, weekly, monthly, quarterly, yearly가 포함됩니다.
    • 참고 : to.periodto.monthly ( to.weekly, to.quarterly 등) 양식의 리턴 구조는 다릅니다.  to.period는 날짜를 반환하고, to.months는 MON YYYY 문자를 반환합니다.  lubridate를 통해 시계열로 작업하고 싶다면 to.period를 사용하는 것이 가장 좋습니다.

quantmod 함수

  • 비율 변경 (Delt) 및 Lag 기능
    • Delt : Delt (x1, x2 = NULL, k = 0, type = c ( "arithmetic", "log"))
      • Delt의 변형 : ClCl, HiCl, LoCl, LoHi, OpCl, OpHi, OpLo, OpOp
      • 양식 : Opcl (OHLC)
    • Lag : Lag(x, k = 1)/ Next : Next(x, k = 1)( dplyr :: lagdplyr :: lead도 사용할 수 있습니다)
  • 기간 반환 함수 :
    • 매일, 매주, 매월, 분기 별 및 연간을 포함하는 다양한주기에 대한 산술 또는 로그 반환을 가져옵니다.
    • 형식 : periodReturn (x, period = 'monthly', 부분 집합 = NULL, type = 'arithmetic', leading = TRUE, ...)
  • 시리즈 기능 :
    • 계열을 설명하는 반환 값. 옵션에는 증감, 가감 및 고저 설명이 포함됩니다.
    • 양식 : seriesHi (x), seriesIncr (x, thresh = 0, diff. = 1L), seriesAccel (x)

TTR 함수

  • 웰즈 와일더의 방향 운동 지수 : * ADX (HLC, n = 14, maType, ...)
  • 볼린저 밴드 :
    • BBands (HLC, n = 20, maType, sd = 2, …) : 볼린저 밴드
  • 변화율 / 운동량 :  ROC (x, n = 1, type = c ( "연속", "이산"), na.pad = TRUE): 변화율  운동량 (x, n = 1, na.pad = TRUE): 운동량
  • 이동 평균 (maType) :  SMA (x, n = 10, ...): 단순 이동 평균  EMA (x, n = 10, wilder = FALSE, ratio = NULL, ...): 지수 이동 평균
    • DEMA (x, n = 10, v = 1, wilder = FALSE, ratio = NULL): 이중 지수 이동 평균
    • WMA (x, n = 10, wts = 1 : n, …): 가중 이동 평균
    • EVWMA (가격, 수량, n = 10, …) : 탄성, 체중 이동 평균  ZLEMA (x, n = 10, 비율 = NULL, ...): Zero Lag Exponential Moving Average  VWAP (가격, 물량, n = 10, ...): 물량 가중 평균 가격
    • VMA (x, w, 비율 = 1, …) : 가변 길이 이동 평균  HMA (x, n = 20, ...): 선체 이동 평균  ALMA (x, n = 9, offset = 0.85, sigma = 6, ...): Arnaud Legoux 이사 평균
  • MACD Oscillator : MACD (x, nFast = 12, nSlow = 26, nSig = 9, maType, percent = TRUE, …)
  • 상대 강도 지수 : * RSI (가격, n = 14, maType, ...)
  • runFun :  runSum (x, n = 10, cumulative = FALSE): n- 기간 이동 윈도우에 대한 합계를 반환합니다.  runMin (x, n = 10, cumulative = FALSE): n- 기간 이동 윈도우에 대한 최소값을 반환합니다.  runMax (x, n = 10, cumulative = FALSE): n- 기간 이동 윈도우에 대해 최대 값을 반환합니다.  runMean (x, n = 10, cumulative = FALSE): n-period 이동 윈도우를 의미합니다. * runMedian (x, n = 10, non.unique = "mean", cumulative = FALSE): n-period 이동 윈도우에 대한 중앙값을 반환합니다.
    • runCov (x, y, n = 10, use = "all.obs", sample = TRUE, 누적 = FALSE): n-period 이동 윈도우에 대한 공분산을 반환합니다.  runCor (x, y, n = 10, use = "all.obs", sample = TRUE, 누적 = FALSE): n-period 이동 윈도우에 대한 상관 관계를 반환합니다.  runVar (x, y = NULL, n = 10, 샘플 = TRUE, 누적 = FALSE): n- 기간 이동 윈도우에 대한 분산을 반환합니다.  runSD (x, n = 10, 샘플 = TRUE, 누적 = FALSE): n- 기간 이동 윈도우에 대한 표준 편차를 반환합니다.  runMAD (x, n = 10, center = NULL, stat = "중간 값", 상수 = 1.4826, non.unique = "평균", cumulative = FALSE)n 기간 이동에 대한 중간 / 평균 절대 편차를 반환합니다. 창문.  wilderSum (x, n = 10): n- 기간 이동 윈도우에 대해 Welles Wilder 스타일 가중치 합계를 되 돌린다.
  • Stochastic Oscillator / Stochastic Momentum Index : Stochastic Oscillator (HLC, nFastK = 14, nFastD = 3, nSlowD = 3, maType, bounded = TRUE, smooth = 1, …)
    • SMI (HLC, n = 13, nFast = 2, nSlow = 25, nSig = 9, maType, bounded = TRUE, …) : 확률 모멘텀 지수

PerformanceAnalytics 함수

Return.annualized 및 Return.annualized.excess : 기간 반환을 취하여 연간 수익으로 통합합니다.  Return.clean : 반환 값에서 특이 값을 제거합니다.  Return.excess : 무위험 이자율을 초과하는 수익률로 수익률에서 무위험 이자율을 제거합니다.  zerofill : ’NA’값을 0으로 대체하는 데 사용됩니다.

ggplot2와 연계된 차트 그리기

ggplot2 차트를 그리는데  R에서 가장 유명한 패키지 입니다.  gg는 Grammar of Graphics의 줄임말로 그림을 생성하는 것에 대한 규칙을 제안하고 있습니다.  tidyquant는  ggplot2에 더해 아래와 같은 기능을 추가로 제공합니다.

  • 차트 종류 : 두 개의 차트 타입 시각화는 geom_barchartgeom_candlestick을 사용하여 가능합니다.
  • 이동 평균 : ’geom_ma’를 사용하여 7 개의 이동 평균 시각화를 사용할 수 있습니다.
  • Bollinger Bands : Bollinger 밴드는 ’geom_bbands’를 사용하여 시각화 할 수 있습니다. BBand 이동 평균은 이동 평균에서 사용할 수있는 7 가지 중 하나 일 수 있습니다.
  • 날짜 범위 확대 : 차트의 특정 영역을 확대 할 때 데이터 손실을 방지하는 두 가지 coord 함수 ( coord_x_date 및 coord_x_datetime)를 사용할 수 있습니다. 이것은 이동 평균 및 Bollinger 밴드 기하학을 사용할 때 중요합니다.

살펴보기

tqk_get를 이용해서 사용할 데이터를 가져옵니다. 내장 데이터인  SHANK과 삼성, 네이버를 예시로 사용하겠습니다.

’end` 매개 변수는 예제 전체에서 날짜 제한을 설정할 때 사용됩니다.

차트 종류

라인 차트

tidyquant의  geom_함수를 사용하여 가로 막대형 차트와 촛대형 차트를 시각화하기 전에 단순한 선 차트로 주가를 시각화하여  그래픽 문법을 확인해보겠습니다. 이것은 ggplot2 패키지의 geom_line을 사용하여 이루어집니다. 주식 데이터로 시작하고 파이프 연산자 ( %> %)를 사용하여 ggplot ()함수로 보냅니다.

바 차트

바 차트는  geom_line를  geom_barchart로 바꾸는 걸로 해결됩니다.  aes()내의 내용을 의미에 맞게 조정하는 것으로 바 차트를 그리는 것이 끝납니다.

우리는 coord_x_date를 사용하여 특정 섹션을 확대 / 축소합니다.이 섹션에는 xlim 및 ylim 인수가 c (start, end)로 지정되어 차트의 특정 영역에 초점을 맞 춥니 다.  xlim의 경우 우리는 lubridate를 사용하여 문자 날짜를 날짜 클래스로 변환 한 다음 weeks ()함수를 사용하여 6 주를 뺍니다.  ylim의 경우 가격을 100에서 120까지 확대합니다.

색상은 color_up 및 color_down 인수를 사용하여 수정할 수 있으며 size와 같은 매개 변수를 사용하여 모양을 제어 할 수 있습니다.

캔들 차트

캔들 차트 또한 바 차트를 그리는 것과 거의 같습니다.

색상은 color_upcolor_down을 사용하여 선 색상을 조절할 수 있고,  fill_upfill_down은 사각형을 채 웁니다.

여러개의 차트를 그리기

facet_wrap을 사용하여 동시에 여러 주식을 시각화 할 수 있습니다.  ggplot ()의  aes()group을 추가하고 ggplot 워크 플로우의 끝에서 facet_wrap()함수와 결합함으로써 네 개의 “FANG”주식을 동시에 모두 볼 수 있습니다.

트랜드 시각화

Moving averages are critical to evaluating time-series trends.  tidyquant includes geoms to enable “rapid prototyping” to quickly visualize signals using moving averages and Bollinger bands.

이동 평균

tidyquant에서는 다양한 이동평균 함수를 제공합니다.

이동 평균은 geom_ma 함수로 차트에 추가 된 레이어로 적용됩니다. 기하 구조는 TTR 패키지에서 SMA, EMA, WMA, DEMA, ZLEMA, VWMA, EVWMA와 같은 기본 이동 평균 함수의 래퍼입니다.

Example 1: 50일/200일 단순 이동 평균 차트 작성

Example 2: 지수 이동 평균 차트

볼린저 밴드

[Bollinger Bands] https://en.wikipedia.org/wiki/Bollinger_Bands)는 이동 평균(일반적으로 상하 2SD) 주위의 범위를 플로팅하여 변동성을 시각화하는 데 사용됩니다. 그것들은 이동 평균을 사용하기 때문에, geom_bbands 함수는 geom_ma와 거의 동일하게 작동합니다. 동일한 7 개의 이동 평균이 호환됩니다. 가장 큰 차이점은 기본적으로 2 인 표준 편차 인 sd 인수와 밴드를 계산하는 데 필요한 ‘high’, ’low’및 ’close’를  aes()에 추가하는 것입니다.

Example 1: SMA를 사용하여 BBands 적용

간단한 이동 평균을 사용하여 Bollinger Bands를 추가하는 기본 예제를 살펴 보겠습니다.

Example 2: Bollinger Bands의 모양 바꾸기

모양은 color_ma, color_bands, alpha, fill 인자를 사용하여 수정할 수 있습니다. BBands에 새로운 서식을 적용한 Example 1과 같은 그림이 있습니다.