미국 주식 데이터 수집 #7 미국 상장 주식 종목 리스트 가져오는 방법

 본격적인 포스팅을 시작하기에 앞서, 미국 상장 주식 리스트를 받고 싶어서 들어오신 분들은 아래 링크로 들어가시면 내려받으실 수 있습니다! 매주 새로운 데이터로 업데이트하니 "퀀트 데이터" 카테고리에서 최신 데이터로 받아주세요~

 

돈이 되는 미국 주식 퀀트 데이터(~2021.04.11)

 4월 둘째주 미국 주식 퀀트 데이터 업로드 합니다. 포함된 데이터는 종목코드, 종목명, 업종, 산업, 주가, 1개월 등락률, 3개월 등락률, 6개월 등락률, 9개월 등락률, 12개월 등락률, 일 거래량(10일

lazyquant.tistory.com

 

 안녕하세요, 게으른 퀀트입니다. 요즘 계속 미국 주식 데이터를 더 정교하게 만드는 작업을 진행하고 있습니다. 그 중 한 가지로 매주 종목 UPDATE하는 방법을 소개해드리려고 합니다. 작년 말에 처음으로 미국 주식 정보를 수집했었고, 그 이후로는 매주 실적만 UPDATE 했었습니다. 그러다 보니 신규로 상장되는 주식은 포함이 되지 않고, 상장 폐지된 종목은 계속 데이터에 남아있었죠.

 

 그래서 매주 그 시점을 기준으로 상장된 종목 리스트를 가져와서 신규 상장된 종목은 INSERT, 상장 폐지된 종목은 DELETE하는 작업을 진행하였습니다. 그리고 작업을 진행하면서 발견한 FinanceDataReader 라는 매우 유용한 라이브러리도 함께 소개해드리겠습니다.

 

import FinanceDataReader as fdr
import pymysql
import datetime
import pandas as pd
from dateutil.relativedelta import relativedelta
import math

# 최신 미국 주식 LIST 가져오기
df_nasdaq = fdr.StockListing('NASDAQ')
df_nyse = fdr.StockListing('NYSE')
df_amex = fdr.StockListing('AMEX')

df_stock = pd.concat([df_nasdaq,df_nyse,df_amex])
df_stock = df_stock.reset_index()

nasdaq = df_nasdaq.Symbol.tolist()
nyse = df_nyse.Symbol.tolist()
amex = df_amex.Symbol.tolist()

stock_list = nasdaq+nyse+amex
len(stock_list)

 

 우선 필요한 라이브러리들을 import하고 뉴욕증권거래소(NYSE), 나스닥(NASDAQ), 미국증권거래소(AMEX)의 종목 리스트를 가져옵니다. yahoo_fin과는 다르게 DataFrame 형태로 종목을 가져오고, 종목명과 산업군도 함께 기재되어 있습니다. 지난 번에 힘들게 업종/산업 정보를 스크래핑 했었는데, 굳이 그럴 필요가 없었네요😂

 

 

FinanceDataReader를 통해 수집한 정보

 

conn = connect_db()
curs = conn.cursor()

# 이미 입력된 TICKER 리스트
sql = "SELECT DISTINCT STOCK_CODE FROM USA_STOCK_INFO"
curs.execute(sql)
db_stock_list = [item[0] for item in curs.fetchall()]
conn.commit()

# 삭제 대상 리스트
delete_list = [x for x in db_stock_list if x not in stock_list]
len(delete_list)

 이미 DB에 입력된 종목 리스트 중에서 현재 기준 상장 종목 리스트에서 없는 건들은 삭제 대상으로 지정해줍니다. 현재 기준 상장 종목 리스트에 없다는 것은 상장 폐지가 되었다는 것을 의미하겠죠.

 

 위에서 구한 삭제 대상 종목들을 FOR문을 돌리면서 삭제해줍니다.

conn = connect_db()
curs = conn.cursor()

sql = """delete from USA_STOCK_INFO
          where STOCK_CODE = %s
        """

# 반복문 돌면서 INSERT
for i, ticker in enumerate(delete_list):
    try:
        curs.execute(sql, ticker)
        conn.commit()
    except Exception as e:
        print(i, ' 번 째 오류 발생 : ', ticker, ' 오류:', str(e))        

conn.close()

 

 다음은 추가 대상리스트를 추가해주는 작업입니다. 실제 작업하는 내용은 삭제해주는 것과 유사합니다.

# 추가 대상 리스트
insert_list = [x for x in stock_list if x not in db_stock_list]

today = datetime.datetime.now().strftime('%Y%m%d')

conn = connect_db()
curs = conn.cursor()

sql = """insert into USA_STOCK_INFO (STOCK_CODE, STOCK_NAME, INDUSTRY, RGST_YMD, MDFY_YMD) 
        values (%s, %s, %s, %s, %s)"""

# 반복문 돌면서 INSERT
for i, ticker in enumerate(insert_list):
    try:
        name = df_stock.loc[df_stock['Symbol'] == ticker, 'Name'].values[0]
        industry = df_stock.loc[df_stock['Symbol'] == ticker, 'Industry'].values[0]        
        if math.isnan(industry) : industry = None            
        curs.execute(sql, [ticker, name, industry, today, today])
        conn.commit()
    except Exception as e:
        print(i, ' 번 째 오류 발생 : ', ticker, ' 오류:', str(e))        

conn.close()   

 

 아래와 같이 종목코드, 종목명, 산업이 깔끔하게 잘 들어간 것을 확인할 수 있습니다.

DB에 입력된 결과

 

 매주 주가 및 실적을 업데이트하는 쿼리가 DB에서 종목코드를 읽어서 UPDATE 해주는 방식입니다. 그래서 매주 UPDATE 전에 위의 작업을 수행하면 항상 최신 상장 종목 리스트의 정보를 얻을 수 있습니다. 이번 주부터 반영하여 최대한 많은, 최신의 종목에 대한 정보를 제공하도록 하겠습니다. 기대해주세요!

 


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

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

 

 

 

댓글()