키움 API Tick Data - Task2

2021/01/27


Note: 이 페이지는 키움 API를 통해 Real Time Tick Data를 받아온 후 데이터를 클리닝 하는 과정을 보여주고 있습니다. 오류 및 문의사항은 으로 메일주시면 감사하겠습니다

데이터 자체에 대한 질문과 데이터 제공에 관한 문의는 000 으로 메일 주시면 감사하겠습니다

R code 블럭과 Python code 블럭은 다음과 같이 색깔로 구분하겠습니다. 결과창은 동일하게 Ivory 색 블럭으로 표시됩니다.

# "이것은 R 코드 입니다."
# "이것은 Python 코드 입니다."

TASK2: Cleaning 준비

Rendering 시간이 많이 걸려서 코드는 웹사이트를 만드는데, 아래의 코드들은 실행되지 않았습니다.

wd_win = "G:/공유 드라이브/Project_TBD/Stock_Data/real_time/kiwoom_stocks/2021-01-26"
wd_mac = "/Volumes/GoogleDrive/공유 드라이브/Project_TBD/Stock_Data/real_time/kiwoom_stocks/2021-01-25"

tbl =
  list.files(path = wd_mac, pattern = '.*stocks_trade.*\\.csv') %>%
  map_df(~readr::read_csv(paste(wd_mac,.,sep = '/'),
                          col_names = c('code','trade_date','timestamp','price','open','high','low','size','cum_size','ask1','bid1','rotation','bs_ratio', 'mkt_type', 'mkt_cap'),
                          col_types = cols(.default="d", code = "c")
                   )
         )

wd2 = "/Volumes/GoogleDrive/공유
드라이브/Project_TBD/Stock_Data/real_time/kiwoom_stocks/2021-01-25"
tbl =
  list.files(path = wd2, pattern = '.*stocks_trade.*\\.csv')[2:8] %>%
  map_df(~readr::read_csv(paste(wd2,.,sep = '/'),
                          col_names = c('code','trade_date','timestamp','price','open','high','low','size','cum_size','ask1','bid1','rotation','bs_ration', 'mkt_type', 'mkt_cap'),
                          col_types = cols(.default="d", code = "c")
                   )
         )

sum(is.na(tbl))
gc()
dim(tbl)
head(tbl)

1.타임 스탬프 Sort 하기

키움 API를 통해서 데이터를 받자마자 Timestamp를 찍고 DB에 저장하는데 저장되는 순서는 데이터 들어오는 순서와 다르므로 Timestamp를 다시한번 Sort 해주어야 한다.

2. 장중 데이터만 가지고 오기

Exchangehours Only!

키움 API 290 장구분

  • 장전시간외: 1
  • 장중: 2
  • 장후시간외: 3

3. DATE는 날짜 TIME은 시간

df = 
  tbl %>%
  filter(mkt_type==2) %>%
  select('code','timestamp','price','size','ask1','bid1','mkt_type','bs_ratio') %>%
  mutate_at(vars(timestamp), function(x) x*1000) %>%
  mutate_at(vars(code), function(x) paste0('KR',x)) %>%
  arrange(.,timestamp) %>%
  mutate(DATE = paste(substr(as.character(timestamp),1,4),
                      substr(as.character(timestamp),5,6),
                      substr(as.character(timestamp),7,8),
                      sep ="-" 
                      )) %>%
  mutate(TIME = paste(substr(as.character(timestamp),9,10),
                      substr(as.character(timestamp),11,12),
                      paste(substr(as.character(timestamp),13,14),
                            substr(as.character(timestamp),15,18),
                            sep='.'),
                      sep =":" 
                      )) %>%
  rename(SYMBOL = code) %>%
  rename(BID = bid1) %>%
  rename(OFR = ask1) %>%
  rename(SIZE = size) %>%
  rename(PRICE = price) %>%
  rename(VP = bs_ratio) %>%
  select(!c('timestamp', 'mkt_type')) %>%
  relocate(DATE, TIME, SYMBOL, PRICE, SIZE, BID, OFR, VP)
  
head(df)
rm(list = "tbl")
gc()

5. Symbol 별로 분리해서 폴더에 집어넣기

Seperate by Ticker

dfs = split(df, df$SYMBOL)
datas = split(data, data$종목코드)

dest = "G:/공유 드라이브/Project_TBD/Stock_Data/Symbol"
for (dn in names(dfs)){
    output_loc = paste(dest,dn,'tick',sep = "/")
    info_loc = paste(dest,dn,'info',sep='/')
    dir.create(paste(dest,dn,sep = "/"))
    dir.create(paste(dest,dn,'tick',sep = "/"))
    dir.create(paste(dest,dn,'info',sep='/'))
    sub_dfs <- split(dfs[[dn]], dfs[[dn]]$DATE)
    for (fn in names(sub_dfs)){
        write.csv(sub_dfs[[fn]], 
                  file.path(output_loc, paste0(fn, ".csv")), 
                  row.names = FALSE)
        write.csv(datas[[dn]], 
                  file.path(info_loc, paste0(fn, ".csv")),
                  row.names = FALSE)
    }
}

Source

  • 데이터 provided by 00 Team