미국 주식 데이터 수집 #11 미국 주식 증권 종류 수집

 안녕하세요, 게으른 퀀트입니다. 이번 포스팅에서는 미국 증권 거래소(뉴욕, 나스닥, 아멕스)에 상장된 주식들의 증권 종류를 스크래핑하는 방법에 대해서 알아보겠습니다.

 

1.문제 상황

 데이터를 수집하고 이를 활용하여 투자를 진행하다보니, 실제로 투자를 할 때 필요한 정보가 없는 종목들이 많이 발견되었습니다. 예를 들어 시가총액 정보가 없거나, 매출액, 영업이익, 순이익 등의 실적이 없는 종목들이 있었습니다. 아주 기본적인 정보임에도 Yahoo Finance나 Investing.com에 정보가 없는 종목들은 대체 뭘까?하고 찾아보던 중 우리가 일반적으로 알고 있는 주식(보통주)이 아니라는 사실을 알게 되었습니다.

 

 예를 들어서 한 종목(ACP)을 Yahoo Finance와 Investing.com에서 검색해보겠습니다.

 

Yahoo Finance에서 실적이 조회되지 않는 종목 예시(ACP)

 

 기본적인 주가 정보는 조회가 되지만, 종목 선정에서 중요한 실적 정보는 전혀 조회가 되지 않습니다. 실제로 크롤링한 데이터에도 실적정보가 Null 또는 0으로 되어있죠. 예시로 보았던 ACP는 investing.com에서도 실적 정보가 되지 않습니다. 마찬가지로 stockrow.com에서는 검색조차 되지 않았습니다🤣

 

Investing.com에서 실적이 조회되지 않는 종목 예시(ACP)

 

2.증권 종류 데이터

 위에서 보았던 것처럼 주가 데이터는 존재하지만, 그 외에 다른 정보가 많이 부족한 건들을 바탕으로 찾아보니 주로 폐쇄형 펀드(CEF) or 미국 예탁 증권(ADR) 등이었습니다. Enel Americas SA ADR나 Eaton Vance Enhanced Equity Income Fund처럼 티커의 종목 명으로 대충 유추는 할 수 있었지만, 정확히 알 수는 없었습니다.

 

 그렇게 또 어디에 있을지 모르는 증권 종류의 정보를 찾아 여러 사이트를 찾아다녔습니다. 등잔 밑이 어둡다고, 자주 방문하던 Investing.com에서 증권 종류에 대한 정보를 찾았습니다.

 

 Investing.com에서 티커로 검색을 한 뒤 General - Profile - Equity Type에서 구할 수 있습니다.

Investing.com에서 조회한 증권 종류(ACP)

 

3.데이터 스크래핑 방법

 이제 우리가 목표하는 데이터가 어디에 있는지 알아냈으니, 자동으로 수집하도록 코드만 작성하면 끝입니다. 우선 해당 페이지의 URL 부터 확인해보겠습니다. 예시로 보았던 ACP의 Profile 페이지 주소입니다. 티커마다 아래 빨간색으로 표기한 부분만 달라집니다. 

 

URL 예시) ACP

https://www.investing.com/equities/avenueome-credit-strategies-closed-company-profile

 

URL 예시) AAPL

https://www.investing.com/equities/apple-computer-inc-company-profile

 

깔끔하게 주소가 티커로 들어가면 좋겠지만, 종목명이 들어가서 조금 번거롭게 되었습니다. 우선 investing.com에서 사용되는 티커의 종목명을 확인하는 함수를 작성해보겠습니다.

# investing.com에서 검색 쿼리를 날려서 profile url 조회
def get_investing_profile_url(ticker):
    url = "https://api.investing.com/api/search/?q={}".format(ticker)
    json_data = json.loads(requests.get(url).text)
    query_result_list = json_data['quotes']
    
    profile_url = ''    
    
    for i, query_result in enumerate(query_result_list):
        if query_result['symbol'] == ticker and query_result['flag'] == 'US':
            profile_url = 'https://www.investing.com' + query_result['url']+'-company-profile'

    return profile_url

 위의 api를 호출해서 해당 티커명이 포함된 종목 리스트를 받아오고, 그 중 티커명이 정확히 일치하는 것과, 미국 시장에 상장된 것으로 해서 profile 페이지 주소를 생성해줍니다. 이제 이 profile 주소를 호출해서 웹페이지 html을 받아옵니다.

 

def get_equity_type(ticker):
    url = get_investing_profile_url(ticker)
    
    if url != '' :
        headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"}
        html = requests.get(url, headers=headers).text
        soup = BeautifulSoup(html, "html.parser")

        equity_type = soup.select('div.companyProfileHeader > div > p')[-1].text
    else :
        equity_type = ''
        
    return equity_type

 위의 코드를 보면 특별히 어려운 부분은 없습니다. 늘 사용하던 Beautiful soup를 사용해서 html 소스를 가져오고, 필요한 정보가 있는 영역을 찾아서 데이터를 수집합니다. 한 가지 특이사항은 headers를 명시적으로 기재한 것인데요, header 없이 그냥 request를 날리니 investing.com에서 차단하였습니다😅

 

 일반 사용자처럼 보이도록(?) header를 명시적으로 작성해서 request를 날려줍니다. 무사히 조회가 되고 정상적으로 Equity Type 정보를 가져올 수 있습니다.

 

 이렇게 수집된 증권 종류(Equity Type) 데이터를 DB에 잘 적재해줍니다. 이제 수집한 증권 종류 데이터를 바탕으로 실제로 필요한 데이터만 잘 정제해서 업로드 하려고 합니다. 너무 많은 데이터가 있어서 오히려 종목을 선정하는데 방해가 된 것 같네요. 이렇게 조금씩 데이터의 질을 높여가고 있으니 앞으로도 기대해주세요. 

 


공감댓글, 공유는 큰 힘이 됩니다!

도움이 되셨다면 널리널리 알려주세요😉

 

 

 

댓글()