AI를 활용한 재밌는 것들을 개발합니다

2020년 6월 10일 수요일

R로 투자자별 기관 외국인 매매동향 크롤링 하기

안녕하세요. 개미퀀트 입니다.

지난 12월부터 시작된 방구석지니 퀀트자동매매가 어느덧 7개월차에 접어 들었습니다. 이게 진짜 수익이 날까 의문을 가지고 시작했던 1차 투자 실험에서는 300여만원을 가지고 했었는데 가능성을 봤었습니다. 비록 코로나 폭락으로 모든 종목이 매도되어 강제 투자 종료가 되긴 했지만요. 그 가능성에 힘입어 2차 투자는 1000만원을 가지고 4월부터 자동매수가 되기 시작했고, 5월부터는 3000만원으로 지금까지 방구석지니 퀀트자동매매 프로그램이 운영되고 있습니다. 



현재 보유 종목들의 평가 현황입니다. 코로나 폭락 이후 계속해서 상승장이었으나 이제 오를만큼 오른거 같습니다. 하락장에서 손실은 어떻게 할 수 없는 부분이나 횡보장에서도 계속해서 수익을 낼 수 있는 방법은 없을까 라는 고민이 이제 시작되었습니다.

제가 주식은 정말 잘 모릅니다. 지금의 퀀트 전략도 오직 가격의 모멘텀만 가지고 투자를 하고 있죠. 얼마 전에 퀀트로 검색하다 한 블로그에서 봤는데 외국인 매수랑 수익이 영향이 있다는 글을 봤습니다. 외국인 매수라... 우리나라 주식은 외국인 영향을 많이 받는다는 말도 어디선가 들어본 거 같고 해서 외국인 매수에 관한 정보를 퀀트전략에 넣어봐야겠다는 생각을 했습니다. 아울러 기관매수 데이터도 넣어보면 좋겠죠.

크롤링은 웹페이지에 있는 정보를 자동으로 읽어와서 저장할 수 있는 기법 같은건데요, 제가 사랑하는 책 'R을 이용한 퀀트 투자 포트폴리오 만들기'에서 배웠습니다. 이 책은 정말 멋진 책입니다. 제가 방구석지니를 만들 때 거의 모든 기반이 된 책입니다. 여러분들도 이 책은 꼭 사서 읽어보시고 직접 해보시기 바랍니다. 제 코드의 대부분도 이 책에서 따온 것들입니다.

암튼 네이버금용에 가보겠습니다.



빨간색으로 박스친 [투자자별 매매동향]을 클릭하면 아래에 [외국인, 기관 순매매 거래량]에 외국인과 기관의 순매매량이 일자별로 기록되어 있습니다. 전 이 정보를 크롤링 해서 저장할 겁니다. 제가 참고한 코드는 제가 사랑하는 책 'R을 이용한 퀀트 투자 포트폴리오 만들기' - '4장 크롤링 이해하기' - '4.2.3 네이버 금융에서 주식 티커 크롤링'에 있는 예제 코드입니다. 저자님 이런 좋은 코드 공개해 주셔서 정말 감사합니다. 

저자님 처럼 코드 한줄 한줄 마다 설명을 드리지는 않겠습니다. 제가 사랑하는 책에 설명이 자세히 다 나와 있습니다. 


#실제 크롤링 코드 
data = list()

url = paste0('https://finance.naver.com/item/frgn.nhn?code=005930')
down_table = GET(url)

#페이지 읽기
navi.final = read_html(down_table, encoding = 'EUC-KR') %>%
  html_nodes(., '.pgRR') %>%
  html_nodes(., 'a') %>%
  html_attr(., 'href')

#마지막 페이지 번호 추출
navi.final = navi.final %>%
  strsplit(., '=') %>%
  unlist() %>%
  tail(., 1) %>%
  as.numeric()

for(j in 1:navi.final) 
{
  url = paste0('https://finance.naver.com/item/frgn.nhn?code=005930&page=',j)
  down_table = GET(url)
  
  
  Sys.setlocale("LC_ALL", "English")
  
  table = read_html(down_table, encoding = "EUC-KR") %>%
    html_table(fill = TRUE)
  mytable = table[[3]]
  
  Sys.setlocale("LC_ALL", "Korean")
  
  #빈 행 제거 
  mytable = mytable[!apply(mytable=="",1,all),]
  colnames(mytable) = c("날짜","종가", "전일비","등락률","거래량","기관순매매량","외국인순매매량","외국인보유주수","외국인보유율")
  mytable = mytable[-1,]
  rownames(mytable) = NULL
  data[[j]] = mytable
  
  Sys.sleep(0.1)
}

data = do.call(rbind, data)

간단하게 삼성전자 종목에 대한 '외국인 기관 순매매 거래량' 데이터를 추출하는 코드입니다. 추출된 data를 보면 아래와 같습니다.

"","날짜","종가","전일비","등락률","거래량","기관순매매량","외국인순매매량","외국인보유주수","외국인보유율"
"1","2020.06.09","55,500","600","+1.09%","23,998,831","-2,723,503","+1,086,013","3,289,773,517","55.11%"
"2","2020.06.08","54,900","600","-1.08%","25,634,965","-1,145,041","-1,650,246","3,289,350,504","55.10%"
"3","2020.06.05","55,500","900","+1.65%","22,743,629","+2,748,553","-113,210","3,290,944,570","55.13%"
"4","2020.06.04","54,600","100","+0.18%","40,220,334","+1,608,999","+1,677,893","3,290,948,780","55.13%"
"5","2020.06.03","54,500","3,100","+6.03%","49,257,814","+9,562,698","+3,308,911","3,290,978,887","55.13%"
"6","2020.06.02","51,400","200","+0.39%","14,247,933","+901,384","-343,878","3,287,419,976","55.07%"
"7","2020.06.01","51,200","500","+0.99%","16,949,183","+2,097,711","-39,892","3,287,872,854","55.08%"
"8","2020.05.29","50,700","300","+0.60%","27,596,961","-1,892,811","+3,771,073","3,287,326,746","55.07%"
"9","2020.05.28","50,400","500","+1.00%","31,309,318","+2,771,160","+2,427,076","3,283,445,773","55.00%"
"10","2020.05.27","49,900","650","+1.32%","19,548,479","+124,198","+3,030,597","3,281,127,993","54.96%"
"11","2020.05.26","49,250","400","+0.82%","15,127,490","+1,661,696","-849,280","3,278,128,396","54.91%"
"12","2020.05.25","48,850","100","+0.21%","14,337,913","+223,787","-2,228,027","3,280,425,676","54.95%"
"13","2020.05.22","48,750","1,200","-2.40%","19,706,284","-2,867,180","-3,513,484","3,282,583,517","54.99%"
"14","2020.05.21","49,950","50","-0.10%","14,949,266","-2,354,362","+1,904,733","3,286,231,455","55.05%"
"15","2020.05.20","50,000","300","-0.60%","14,896,899","-135,032","+189,065","3,284,189,677","55.01%"
"16","2020.05.19","50,300","1,500","+3.07%","25,168,295","+5,221,214","+1,789,104","3,283,625,878","55.00%"
"17","2020.05.18","48,800","950","+1.99%","20,481,981","+1,776,147","+1,117,278","3,281,319,439","54.97%"
"18","2020.05.15","47,850","150","-0.31%","18,463,118","+1,837,854","-2,099,134","3,281,944,496","54.98%"
"19","2020.05.14","48,000","550","-1.13%","19,305,974","-1,274,757","-1,224,908","3,284,058,630","55.01%"
"20","2020.05.13","48,550","650","+1.36%","20,223,277","-499,195","-518,283","3,285,433,538","55.03%"
"21","2020.05.12","47,900","500","-1.03%","23,433,590","-3,274,163","-1,998,887","3,285,179,794","55.03%"
"22","2020.05.11","48,400","400","-0.82%","16,357,743","-1,688,512","-1,265,851","3,284,649,709","55.02%"
"23","2020.05.08","48,800","0","0.00%","15,319,700","+1,042,243","-2,215,231","3,286,011,560","55.04%"


이제 방구석지니가 선정한 포트폴리오 종목에 대한 모든 외국인기관 순매매 거래량 데이터를 확보해서 백테스트를 통해 더 나은 전략을 도출해 보려고 합니다. 어떤 결과가 나올지 정말 궁금한데요. 빨리 해보고 싶네요.

백테스트 결과는 다음 글에서....

댓글 1개:

  1. 최근에는 막힌건지 투자자별 매매동향 크롤링이 안됩니다 ㅠ_ㅠ

    답글삭제

가장 많이 본 글