3. 튜토리얼/금융 분석 프로그래밍 응용

파이썬을 활용한 코스피, 달러 환율정보 수집부터 차트 시각화까지

swsong 2022. 6. 6. 10:00

Step 0. XHR 이란

XHR은 XMLHttpRequest의 약자로, Ajax처럼 페이지 리로드 없이 서버의 데이터를 불러올 수 있는 통신 방식이다. 브라우저 상에서 제공하는 객체 형태의 API라고 이해하면 좀 더 와닿겠다.

그래서 이 XHR은 기본적으로 브라우저가 웹서버와 통신하기 위한 수단이지만, 우리가 직접 사용해 웹 서버에서 직접 원하는 데이터를 호출할 수도 있다. 방식은 크게 2가지로, POST와 GET 방식이 있다. 여기서 두 케이스를 모두 경험해보기 위해 코스피 정보는 krx정보데이터시스템에서, 달러 정보는 yahoofinance에서 긁어보도록 하겠다. 참고로 이렇게 사이트마다 데이터를 호출하는 방식이 다르기 때문에 데이터를 수집하고자 한다면 어떤 형태로 서버와 통신하는지 사전에 확인해야 한다.

Step 1. KOSPI 200 거래 정보 가져오기

먼저, 두 방식 모두 url 주소로 데이터를 요청하게 되며 python은 requests 패키지를 사용한다. POST 방식의 경우 requests.post() 함수를 사용하는데, 이때 요청 정보를 함께 넘겨줘야 한다.

아래 화면은 Safari 브라우저에서 개발자 모드를 켠 다음 네트워크 탭의 XHR 영역을 보여준다. 해당 영역 하단에 '요청 데이터'라는 부분이 보인다. POST 방식은 이렇게 요청할 데이터를 넘겨주면 해당하는 데이터를 다시 반환해주는 구조다. 코드에서는 이 부분을 payloads 객체로 만들어서 requests.post(url, data=payloads) 형태로 넘겨줬다.

 

Step 2. 환율 정보 가져오기

다음은 yahoofinance다. 여기는 GET 방식으로 데이터를 가져오고 있으며, 별도의 '요청 데이터'는 넘겨주지 않아도 된다. 하지만 아래 화면에서 'header'를 url과 함께 넘겨줬는데, 이는 서버에서 보안상 헤더가 없는 요청은 봇이나 침입으로 감지하고 차단하기 때문이다. 헤더 없이 요청하면 403 에러를 볼 수 있는데, 모든 사이트가 그런 것은 아니지만 yahoofinance처럼 데이터를 서비스하는 사이트는 대부분 이러한 최소한의 조치를 하고 있다.

yahoofinance가 특이했던 점은 원달러 환율 정보를 요청할 때 기간 등 여러가지 옵션을 선택할 수 있는데, 예를 들면 언제부터 언제까지 며칠 주기의 데이터를 확인할 것인지에 대한 정보를 넘겨줘야 한다. 보통 이런 부분들을 POST로 구현하는데 yahoofinance의 경우 url 내에 query 형태로 던져주는 방식을 취하고 있다. 그래서 상단의 URL 부분을 보면 굉장히 긴데, 요청하고자 하는 정보가 담겨있다고 보면 된다.

긴 내용중에 우리가 눈여겨볼 부분은 period1, period2, 그리고 interval 부분이다. 짐작할 수 있듯이 period1은 조회 시작 날짜, period2는 조회 마지막 날짜, interval은 조회 간격이다. period는 기본적으로 unix 시간을 채택하고 있다. 참고로 unix 시간 체계는 1970년부터 초 단위로 계산되는 표준 시간 단위이며, python을 사용해 오늘 날짜를 unix 시간으로 변경할 수 있다. 우리는 yahoofinance에서 제공하는 최대 기간을 모두 조회할 것이기 때문에 period1은 0으로 설정했다. unix 시간은 정수형이기 때문에 꼭 특정 값을 입력하지 않고 가장 작은 숫자를 입력해줘도 알아서 최솟값을 잡아준다. 물론 서버마다 처리 로직이 다를 수 있으니 무조건 통용되는 방법은 아니다.

 

이렇게 데이터를 호출하면 json 형태의 결과값을 받을 수 있는데, 계층 구조가 눈에 확 들어오지 않기 때문에 key값을 한 단계씩 조회해보면서 데이터를 확인하면 된다.

이렇게 찾아가다보면 우리가 필요한 두 list를 추출할 수 있는데, 하나는 시간이고 다른 하나는 환율 정보다.

 

Step 3. 데이터 병합

이렇게 KOSPI 200과 환율 정보를 확보했으므로 데이터를 합쳐주겠다.

일자를 기준으로 inner join 방식의 집계를 사용했다. 두 데이터의 길이가 다르기 때문에 중복 구간만 추출하는 것이다. 우리는 여기서 종가, per, pbr, 환율만 사용할 것이며 4개의 데이터는 분석을 위해 모두 실수형으로 변환해줘야 한다. 또한 index는 '일자'로 설정해줘서 시계열 분석이 편하도록 세팅한다.

 

Step 4. 평균 및 표준편차를 포함한 시계열 데이터 그리기

10년간 각 지표의 평균치를 붉은 점선으로 그렸고, 붉은 박스 영역은 평균으로부터 1 표준편차 이내의 영역을 알려준다. 이는 각 지표의 높낮이에 대한 가늠좌가 되어준다.

 

Step 5. 표준화를 통해 시계열 겹쳐보기

위 그래프를 보면 y 축의 수치가 모두 다르다. 그래프를 겹쳐서 보고 싶다면 방법은 2가지인데, 하나는 2중 y축(왼쪽+오른쪽)을 사용하는 방식, 다른 하나는 각 지표에 대해 표준화 혹은 정규화를 수행하는 방식이 있다. 여기서는 후자의 사례를 보여준다.

이렇게 표준화를 해주면 4개의 지표 모두 평균이 0이고 표준편차가 1인 동일한 분포를 가질 수 있다.

이제 환율과 나머지 3개 지표를 겹쳐 그려보면 다음과 같다.

이를 통해 원달러 환율과 코스피 지표간의 움직임을 상대적으로 비교해서 확인할 수 있으며, 추후 rolling(시점 이동)이나 이동평균을 사용해 선/후행 지표를 찾아낼 수도 있다. 또한, 실시간으로 주가를 모니터링할 수 있도록 스케줄러를 사용하면 위 그래프의 실시간 추이도 확인할 수 있다. 그러니 더 멋진 아이디어로 발전시켜보길 바란다!