파이썬으로 급등주 포착 알리미 만들기 : Part 2
토이 프로젝트/급등주 포착 알리미 만들기

파이썬으로 급등주 포착 알리미 만들기 : Part 2

by TechNyang 2024. 9. 22.
반응형

이전 포스팅에는 아나콘다 및 파이썬을 설치한 후 코스닥 종목코드와 현재가를 가져오는 방법에 대해 서술했습니다.

 

 

파이썬으로 급등주 포착 알라미 만들기 : Part 1

급등주 포착을 위해서는 우선 주식종목 정보를 웹에서 가져와야 합니다.이럴 때 웹 스크래핑은 매우 효과적인 방법이 됩니다. 이번 글에서는 파이썬을 이용한 웹 스크래핑의 기초 과정을 다룹

technyang.tistory.com

이번에는 종목별 주가정보를 가져오도록 하겠습니다.

 

 

종목별 주가정보 가져오기

이전 포스팅에서 획득한 종목코드를 가지고 종목별로 과거부터 현재까지 주가정보를 가져오는 함수를 만들겠습니다.

네이버 금융에서 알테오젠을 클릭하고 시세를 클릭하면 아래와 같은 화면이 나옵니다.

알테오젠-일자별-종가
알테오젠 일자별 주가

 

그리고 나서 밑에 페이지를 클릭해보면, 페이지는 넘어가지만 URL은 그대로임을 알 수 있습니다.

F12키를 눌러서 아래와 같이 Network가 선택되어져 있는지 확인합니다.

 

개발자-도구-화면
개발자 도구 화면

 

그리고 페이지를 클릭하면 어떤 URL을 호출하는지 알 수 있습니다.

아래 그림을 참고해주세요. 

페이지-선택시-호출하는-URL
페이지 선택시 호출하는 URL

 

이제 우리는 종목별로 일자별 주가정보를 가져올 수 있게 되었습니다.

이 정보들을 활용하면 여러 기술적 분석 기법들을 활용할 수 있습니다.

 

 

종목정보를 바탕으로 Data Frame 만들기

 

그런데 저 정보들을 어떤 방법으로 활용하면 좋을까요?

엑셀과 같은 표 형식으로 변환할 수 있으면 보다 용이하게 데이터를 다룰 수 있을 것 같습니다.

 

그래서 필요한 것이 판다스(Pandas)입니다.

판다스는 쉽게 말씀드리면, 파이썬에서 엑셀과 같은 기능을 할 수 있게 하는 라이브러리입니다.

 

이 판다스를 이용해서 주가정보 DATA를 보기좋게 가공해 보도록 하겠습니다.

그전에 판다스는 외부 모듈이기 때문에  Import를 해주셔야 합니다.

 

import pandas as pd

 

pandas 뒤에 as pd는 앞으로 판다스 모듈을 사용할 때 pd라는 약자를 사용하겠다.라는 뜻입니다.

주가정보를 표 형식으로 변환시키는 makeDataFrame이라는 함수를 만들고 코드를 작성하겠습니다.

 

def makeDataFrame(codeList):
    for code in codeList:
        stockDf = pd.DataFrame()
        for page in range(1, 21):
            try:
               headers = {'User-Agent' : 'Mozilla/5.0'}
               priceUrl = 'https://finance.naver.com/item/sise_day.naver?code='+str(code)+'&page='+str(page)
               response = requests.get(priceUrl, headers = headers)
               html = BeautifulSoup(response.text, 'html.parser')
               table = html.select('table')

               if table:
                   # stockDf가 초기화되지 않았다면 빈 DataFrame으로 초기화
                   if 'stockDf' not in locals():
                       stockDf = pd.DataFrame()

                   # 테이블을 DataFrame에 추가
                   html_string = str(table[0])
                   new_df = pd.read_html(StringIO(html_string))[0]
                   stockDf = pd.concat([stockDf, new_df], ignore_index=True)

               time.sleep(0.1)
            except Exception as e:
                print(e)
                continue
        stockDf = stockDf.dropna()

 

makeDataFrame함수를 호출하는 부분은 getStockData 함수에서 반복문이 모두 수행된 후에, 종목코드가 저장된 리스트를 매개변수로 하여 makeDataFrame함수를 호출하도록 합니다.

def getStockData():
    kosdaq200List = []
    for page in range(1, 5):
        kosdaqUrl = 'https://finance.naver.com/sise/sise_market_sum.nhn?sosok=1&page=' + str(page)  # 1페이지당 50종목
        reqKosdaq = urlopen(kosdaqUrl)
        bsObjKosdaq = BeautifulSoup(reqKosdaq, 'html.parser')
        kosdaqList = bsObjKosdaq.find_all('a', {'class': 'tltle'})
        for codeKosdaq in kosdaqList:
            try:
                kosdaqCmpNm = codeKosdaq.get_text()
                kosdaqHrefTxt = codeKosdaq.get('href')
                kosdaqPattern = re.compile(r'\d+')
                codeKosdaqTxt = re.search(kosdaqPattern, kosdaqHrefTxt)
                if codeKosdaqTxt != None:
                    kosdaqCd = str(codeKosdaqTxt.group())
                    kosdaq200_list_dic[kosdaqCd] = kosdaqCmpNm
                    kosdaq200List.append(kosdaqCd)
            except:
                continue
        time.sleep(0.1)
        
    makeDataFrame(kosdaq200List)

 

codeList라는 리스트에 저장되어 있는 종목들을 모두 반영하기 위한 반복문을 수행한 후, pd.DataFrame()을 써서 데이터 프레임 객체를 생성합니다.

그리고 과거 주가정보를 가져오기 위하여 순차적으로 페이지에 접근하는 반복문을 수행합니다.

 

stockDf = stockDf.append(pd.read_html(str(table))[0], ignore_index=True)

 

stockDf는 우리가 방금 생성했던 데이터프레임 객체입니다.

append는 리스트에서 요소를 추가하는 명령어입니다.

 

그런데 DataFrame에서는 엑셀에서의 행 추가와 비슷합니다. 이 append를 쓴 이유는 각 페이지에서 얻어온 주가정보를 위에서 아래로 붙여나감으로써 하나의 DataFrame으로 만들기 위함입니다.

 

pd.read_html은 html소스에서 테이블 속성에 해당하는 값을 가져오는 함수입니다.

즉, 웹페이지의 표를 그대로 가지고 오는 것이라고 보면 됩니다.

 

pd.read_html(priceUrl)

 

결과값 형태는 아래와 같이 리스트 형식입니다.

첫 번째에 보이는 날짜, 종가, 전일비, 시가, 고가 ,저가, 거래량은 컬럼명으로 사용하면 좋을 것 같습니다. 
그래서 priceUrl 옆에 header = 0이라는 옵션을 줍니다. 그리고 위 그림에서 콤마를 기준으로 왼쪽에 있는 데이터가 필요하고 오른쪽에 있는 데이터는 필요가 없습니다. 

결과값이 리스트 형식이니까 콤마 기준 왼쪽 데이터는 리스트 0번째 데이터입니다. 그래서 아래와 같은 코드가 만들어지는 것 입니다.

결과값-화면
결과값 화면

 

다음은 ignore_index=True 입니다. ignore_index, 문자열 그대로 해석하면 인덱스를 무시한다라는 말이죠.

ignore_index를 True로 지정해야만, 가장 좌측의 0부터 시작되는 번호가 순서대로 적영됩니다.

 

다음은 dropna()라는 함수입니다. 위 에서도 보셨겠지만 NaN이라는 결측값들이 존재하는 것을 보셨을 것입니다.

이런 결측값은 데이터를 활용하는데에 있어서 여러가지 문제를 발생시킵니다.

이런 결측값을 삭제하는 함수가 dropna()라는 함수입니다.  

 

dropna()함수를 사용한 결과
dropna()함수를 사용한 결과

 

위 모습은 dropna()함수를 사용한 결과입니다.

결측값없이 데이터가 한층 깔끔해졌습니다.

 

다음에는 기술적 분석기법을 이용한 추천주를 생성하는 방법에 대해 알아보겠습니다.

반응형

TOP

Designed by 티스토리

loading