개발일지/프로그래밍

[공부중] 파이썬 증권 데이터 분석_1(코딩)

22rodnjf 2021. 7. 22. 23:18

주식은 꽤나 예전(아마 대학교 1학년 때가 시작이었을 것이다.)부터 해오고 있었고,

데이터 분석을 업으로 삼아 공부하고, 일하기 시작하면서 당연하게도

나는 이 둘을 접목 시켜야 되겠다는 생각을 예전부터 해오고 있었다.

게다가 이런 생각은 비단 나만 해온 것이 아닐 것이다.

방대한 양의 데이터, 게다가 시계열로 정돈된 이쁜 데이터는

데이터 분석을 한다면 당연히 한 번쯤 ML 같은 걸로 돌려보고 싶을 것이다.

 

이런저런 생각을 하며 공부하기 위해서 책을 몇 권 뒤적이다, 내가 생각했던 것을 설명해주는 좋은 책이 있었다.

 

파이썬 증권 데이터 분석

투자 기법과 프로그래밍 기술로 자신만의 퀀트 투자 시스템을 완성하라이 책은 웹 스크레이핑으로 증권 데이터를 주기적으로 자동 수집, 분석, 자동 매매, 예측하는 전 과정을 파이썬으로 직접

ridibooks.com

리디북스 링크를 봐주시라.

 

파이썬을 다루는 기본 방법부터, HeidiSQL(Maria DB)와 웹 크롤링까지

데이터 분석을 하는데 필요한 모든 방법과 코드가 다 들어 있었다.

게다가 크레온 API 를 이용해 자동 매매에 마지막에 짧게 들어 있지만 Tensorflow2를 이용한 LSTM까지

 

비단 증권 분석을 하는 것 만이 아니라 파이썬을 공부하기 위해서도 기본적인 지식이 있다는 하에서는

굉장히 좋은 책이었다.

 


다만 2020.7.23일 최초 출간된 책이다 보니 네이버 파이낸스가 웹크롤링을 막으면서 현재 동작하지 않는 부분이 일부 있었다.

원인을 못찾아서 모든 코드에 Print() 구문을 붙여서 문제가 발생하는 코드를 추적해서 검수를 했었다.

확인 결과 위에 말한 것처럼 네이버 파이낸스가 웹크롤링을 막으면서 발생하게 된 문제였다.

 

웹크롤링을 막는 방법을 해제하는 방법을 찾아봤을 때

우선 헤더의 내용을 변경해서 봇이 크롤링하는 것으로 보이는 헤더를

실제 유저가 사이트에 접근하는 것처럼 헤더를 바꿔주는 방법이 있다고 해서

해당 방법을 적용하기 위해서 코드를 확인했다.

 

 

네이버 금융 웹 스크랩핑

파이썬 증권데이터 분석이라는 책을 참조하여 작성하였습니다. 제 4단락 웹 스크랩핑을 사용한 데이터 분석이라는 부분에서 네이버 금융페이지에서 관심있는 주식 종목의 일별 시세를 데이터

ekyoo.tistory.com

원인이나 해결 방법은 이분이 상당히 잘 설명을 해주셔서 코드를 참고했다.

작성해주신 코드는 매우 간결하고 잘 만들어져 있었지만(다시 한번 감사드립니다.)

해당 업체의 데이터를 책처럼 100페이지까지(대략 4년 치 데이터) 가져오는 것이 아니라

해당 업체의 데이터를 전부 다 가져오는 것으로 되어 있었다.

멋모르고 그대로 돌렸다가 코드가 가장 앞에 있는 동화약품은 20년치가 넘게 적재되었다.

이 부분의 코드를 조금 수정하고 기존 책에 있는 것과 동일하게 pages_to_fetch 데이터를 가져오도록 작업했다.

헤더 부분이 포함된 스크린샷이라 일부러 조금 잘리게 찍었다.

last_page = doc.find('td',class_='pgRR').a['href'].split('=')[-1]

해당 구문의 경우 마지막 페이지부터 모든 데이터를 가져오도록 되어 있기 때문에 위에서 설명한 것처럼 pages_to_fetch를 가져오도록 수정했다.

아래 코드를 긁어서 user_header에 자신의 헤더 값을 넣으면 현재 책에서 말하는 100page를 가져온 뒤 json 파일이 있을 경우 1페이지씩 업로드되는 형태로 코드 수정이 가능하다.

            headers=('User-Agent',user_header)#본인의 헤더값 넣기
            url = f"http://finance.naver.com/item/sise_day.nhn?code={code}"

            opener = req.build_opener()
            opener.addheaders = [headers]
            response = opener.open(url)
            doc=BeautifulSoup(response,'lxml')
            #last_page = doc.find('td',class_='pgRR').a['href'].split('=')[-1]
            last_page = pages_to_fetch
            print('총페이지 : '+str(last_page))

            df = pd.DataFrame()
            for page in range(1, int(last_page)+1):
                page_url='{}&page={}'.format(url,page)
                response = opener.open(page_url)
                df=df.append(pd.read_html(response,header=0)[0])
                print('{}페이지 데이터 추가'.format(page))

            df = df.rename(columns = {'날짜':'date','종가':'close','전일비':'diff'
                                      ,'시가':'open','고가':'high','저가':'low','거래량':'volume'})
            df['date'] = df['date'].replace('.','-')
            df = df.dropna()
            print(df)
            df[['close','diff','open','high','low','volume']] = df[['close',
                'diff','open','high','low','volume']].astype(int)

볼린저 밴드 추종은 과거 코로나 이전까지의 데이터의 경우 정확도가 높은 편이었는데,

코로나 사태 이후 선진국들의 과도한 양적완화와 금리인하로 인해서 유동성이 워낙 높아졌다 보니

기존의 예측기법은 많이 벗어나는 경향을 보였다.

 

아무래도 현재처럼 단순한 주가 추종 데이터만이 아니라 웹 크롤링을 통한 뉴스 정보 수집과

이전에 올렸던 코로나 대시보드에 있던 확진자 수 같은 지표를 좀 더 추가해서 상관 분석을 하는 것이

아무래도 정확도를 더 높이는 방법이 될 것 같다.

 

뒤쪽 페이지에 있는 LSTM을 이용한 Tensorflow 역시 2019년 이전까지는 적중률이 높다가..

코로나 이유로는 정확도가 확 떨어졌다.

 

그래서 아무래도 다른 데이터를 추가로 MariaDB에 축적해야 할 것 같다.