본문 바로가기
  • You find inspiration to create your own path !
personal activity/stock

주식 종목 데이터를 구글 Sheet로 가져오기 #1

by ToolBOX01 2026. 6. 7.
반응형

윈도우 CMD(명령 프롬프트)에서 파이썬(Python)의 설치 버전과 설치 경로를 확인하는 방법

 

[python] 윈도우 cmd 에서 파이썬 설치 버전과 경로 확인하는 법

파이썬을 다시 사용해보려던 차에 버전이랑 설치 경로를 까먹어서 찾아본 김에 적어봄 1. 설치한 파이썬 버전 확인하는 법 1) cmd에서 파이썬 버전을 확인하는 법 C:\Users\Username>python --version 2) pytho

studyingpingu.tistory.com


FinanceDataReader

FinanceDataReader 패키지는 Investing.com에서 금융 데이터를 편하게 수집할 수 있는 파이썬 패키지입니다. 단순히 주식 가격 데이터만을 가져오는 것이 아니라, 주가지수, 환율, 채권, 암호화폐 등의 다양한 금융 데이터를 받을 수 있는 것이 장점입니다. 또한 주식 종목 리스트, ETF 리스트, 상장폐지 종목 리스트까지도 받을 수 있습니다.

 

1. StockListing (주식 종목 목록 조회)

국내외 주식 시장에 상장된 종목들의 리스트(종목코드, 이름, 시장 구분 등)를 가져옵니다.

  • 주요 매개변수 (market): 조회하고자 하는 시장의 이름을 문자열로 지정합니다.
  • 지원하는 세부 시장 리스트:
    • 국내 시장:
      • 'KRX': 한국거래소 전체 (KOSPI, KOSDAQ, KONEX 전체 통합)
      • 'KOSPI': 코스피 상장 종목
      • 'KOSDAQ': 코스닥 상장 종목
      • 'KONEX': 코넥스 상장 종목
    • 해외 시장 (미국):
      • 'NASDAQ': 나스닥 상장 종목
      • 'NYSE': 뉴욕증권거래소 상장 종목
      • 'AMEX': 아메리칸증권거래소 상장 종목
      • 'S&P500': S&P 500 지수 구성 종목
 

2. EtfListing (ETF 목록 조회)

한국 거래소에 상장된 ETF(상장지수펀드) 전체 목록과 세부 정보를 가져옵니다.

  • 별도의 매개변수 없이 fdr.EtfListing() 형식으로 호출합니다.
  • 제공하는 세부 데이터 필드:
    • Symbol: ETF 종목 코드
    • Name: ETF 명칭
    • Price: 현재가 (조회 시점 기준)
    • Return: 수익률
    • InceptionDate: 상장일
    • Category: ETF가 추종하는 자산 분류 (예: 국내 주식, 채권, 해외 주식 등)

 

3. DataReader (가격 데이터 조회)

주식, 지수, 환율, 암호화폐, 원자재 등 시계열 가격 데이터를 가져오는 가장 핵심적인 함수입니다. (참고로 함수명은 DataListing이 아니라 DataReader입니다.)

  • 기본 기본 구조: fdr.DataReader('심볼', '시작일', '종료일')
  • 가져올 수 있는 세부 데이터 종류:

① 국내외 개별 주식 가격

  • 국내 주식: 종목코드 6자리 입력 ('005930' 등)
  • 미국 주식: 티커(Ticker) 입력 ('AAPL', 'TSLA', 'NVDA' 등)
  • 출력 필드: Open(시가), High(고가), Low(저가), Close(종가), Volume(거래량), Change(대비)

② 국내외 주가지수

  • 국내 지수: 'KS11' (코스피), 'KQ11' (코스닥)
  • 미국 지수: 'DJI' (다우존스), 'IXIC' (나스닥 종합), 'US500' (S&P 500)
  • 기타 글로벌 지수: 'JP225' (닛케이), 'STOXX50E' (유로스탁스 50), 'CSI300' (중국 CSI300)

③ 환율 (FX)

  • 원화 기반 환율뿐만 아니라 글로벌 주요 통화 쌍을 지원합니다.
  • 입력 예시: 'USD/KRW' (달러/원), 'EUR/USD' (유로/달러), 'JPY/KRW' (엔화/원)

④ 암호화폐 (Cryptocurrency)

  • 빗썸(Bithumb) 및 야후 파이낸스 데이터를 기반으로 암호화폐 가격을 가져옵니다.
  • 입력 예시: 'BTC/KRW' (비트코인/원), 'ETH/USD' (이더리움/달러)

⑤ 채권 수익률 (국채 금리)

  • 주요국의 국채 금리 시계열 데이터를 제공합니다.
  • 입력 예시: 'US10YT' (미국 10년 만기 국채 금리), 'KR10YT' (한국 10년 만기 국채 금리)

⑥ 주요 상품 및 원자재 가격

  • 입력 예시: 'NG' (천연가스 선물), 'GC' (금 선물), 'CL' (WTI 원유 선물)

1. StockListing (주식 종목 목록 조회)

국내외 주식 시장에 상장된 종목들의 리스트

📊 StockListing("KRX")이 제공하는 전체 항목 리스트

컬럼명 (Column) 의미 설명
Code 종목코드
주식 주문이나 조회 시 사용하는 6자리 숫자 코드 (예: '005930')
ISU_CD 표준코드
국제 표준 규격의 종목 코드 (예: 'KR7005930003')
Name 종목명
기업 또는 상품의 한글 명칭
Market 소속 시장
해당 종목이 속한 시장 (KOSPI, KOSDAQ, KONEX)
Dept 소속 부서
거래소에서 지정한 소속 (예: 우량기업부, 투자유의기업부 등)
Close 종가
전 거래일 기준의 최종 가격
ChangeCode 대비 부호
전일비 등락 부호 (1: 상한가, 2: 상승, 3: 보합, 4: 하한가, 5: 하락 등)
Changes 전일비
전 거래일 종가 대비 변동된 가격의 절대치
ChgRate 등락률
전 거래일 대비 변동 퍼센트(%)
Open 시가
당일 거래 시작 가격
High 고가 당일 최고 가격
Low 저가 당일 최저 가격
Volume 거래량
당일 거래된 주식의 총 수량
Amount 거래대금
당일 거래된 총 대금 (원 단위)
MarCap 시가총액
기업의 총 가치 (종가 × 상장주식수, 원 단위)
Stocks 상장주식수
해당 기업이 발행하여 상장한 총 주식 수

 

예제 코드

# -*- coding: utf-8 -*-
import os
import sys
import io

"""KRX 상장목록을 가져와서 시가총액 기준으로 필터링하는 안전한 스크립트."""

# Windows 콘솔 UTF-8 적용
if os.name == 'nt':
    try:
        os.system('chcp 65001 > nul')
    except Exception:
        pass

try:
    if hasattr(sys.stdout, 'buffer'):
        sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace', line_buffering=True)
        sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace', line_buffering=True)
except Exception:
    pass


def safe_imports():
    try:
        import pandas as pd
    except ImportError:
        print('Missing package: pandas. 설치: pip install pandas')
        return None, None
    try:
        import FinanceDataReader as fdr
    except ImportError:
        print('Missing package: FinanceDataReader. 설치: pip install finance-datareader openpyxl')
        return None, None
    return pd, fdr


def find_column(df, keywords):
    cols = {c.lower(): c for c in df.columns}
    for kw in keywords:
        if kw.lower() in cols:
            return cols[kw.lower()]
    # 부분 일치 검색 (Substring match)
    for k, orig in cols.items():
        for kw in keywords:
            if kw.lower() in k:
                return orig
    return None


def parse_number_series(pd, s):
    try:
        # 문자열 공백 및 콤마 제거 (raw string r'' 사용)
        cleaned = s.astype(str).str.replace(r',', '', regex=True).str.replace(r'\s+', '', regex=True)
        # 숫자, 마침표, 마이너스 부호 제외한 모든 문자 제거
        cleaned = cleaned.str.replace(r'[^0-9\.\-]', '', regex=True)
        return pd.to_numeric(cleaned, errors='coerce')
    except Exception:
        return None


def main():
    pd, fdr = safe_imports()
    if pd is None or fdr is None:
        return

    krx_list = fdr.StockListing('KRX')
    if krx_list is None or krx_list.empty:
        print('KRX 목록을 불러오지 못했습니다.')
        return

    print('현재 데이터의 컬럼명 목록:', list(krx_list.columns))

    # 후보 컬럼명 매핑 테이블
    marcap_candidates = ['MarCap', 'MarketCap', 'Market Cap', 'marcap', '시가총액', '시총', '시가 총액']
    code_candidates = ['Symbol', 'Code', 'Ticker', '티커', '종목코드']
    name_candidates = ['Name', '종목명', '회사명']
    market_candidates = ['Market', '시장', '시장구분']

    cap_col = find_column(krx_list, marcap_candidates)
    code_col = find_column(krx_list, code_candidates)
    name_col = find_column(krx_list, name_candidates)
    mkt_col = find_column(krx_list, market_candidates)

    if not cap_col:
        print(f'\n시가총액 관련 컬럼을 찾지 못했습니다. (후보: {marcap_candidates})')
        return

    # 숫자 변환 및 필터링
    krx_list['_marcap_num'] = parse_number_series(pd, krx_list[cap_col])
    if krx_list['_marcap_num'] is None or krx_list['_marcap_num'].isna().all():
        print('\n시가총액 숫자 변환에 실패했습니다. 원본 샘플:')
        print(krx_list[cap_col].head(10))
        return

    large_stocks = (
        krx_list[krx_list['_marcap_num'] >= 1_000_000_000_000]
        .dropna(subset=['_marcap_num'])
        .sort_values('_marcap_num', ascending=False)
        .reset_index(drop=True)
    )

    print(f"\n시가총액 1조 원 이상 종목 수: {len(large_stocks)}개\n")
    display_cols = [c for c in [code_col, name_col, mkt_col, cap_col] if c]
    if not display_cols:
        display_cols = list(krx_list.columns[:5])

    print(large_stocks[display_cols].head(10).to_string(index=False))


if __name__ == '__main__':
    main()

 

프로그램 실행 화면

시가총액 1조 원 이상 종목 수: 342개

  Code     Name Market           Marcap
005930     삼성전자  KOSPI 1923425662032000
000660   SK하이닉스  KOSPI 1475293895550000
005935    삼성전자우  KOSPI  169300323833000
402340    SK스퀘어  KOSPI  166003649588000
005380      현대차  KOSPI  143330436200000
009150     삼성전기  KOSPI  131236823872000
373220 LG에너지솔루션  KOSPI   96876000000000
032830     삼성생명  KOSPI   82500000000000
028260     삼성물산  KOSPI   74678171050500
329180  HD현대중공업  KOSPI   69694253400000

 


2.  EtfListing (ETF 목록 조회)

함수(기존 EtfListing)를 사용하면, 한국 거래소(KRX)에 상장되어 거래되는 모든 ETF 상품의 실시간 데이터 및 핵심 요약 정보를 한눈에 조회할 수 있습니다.

📊 가져올 수 있는 세부 항목 (Data Fields)

데이터프레임을 호출하면 각 상품별로 아래의 정보들이 열(Column)로 구성되어 반환됩니다.

 

  • Symbol: ETF 종목코드 (시장 주문 시 사용하는 6자리 번호, 예: '360750')
  • Name: ETF 명칭 (예: TIGER 미국S&P500, KODEX 200)
  • Category: ETF 유형 분류 코드 (숫자로 구분되며 주식형, 채권형, 해외지수형 등을 의미)
  • Price: 현재 기준 종가 (또는 전일 종가)
  • RiseFall: 등락 구분 부호
  • Changes: 전일 대비 등락 제한 폭 (절대 금액)
  • ChgRate: 전일 대비 등락률 (%)
  • Volume: 당일 거래량 (주 수)
  • Amount: 당일 거래대금 (원 단위)
  • MarCap: ETF의 순자산총액(시가총액, 원 단위)

 

💡 실제로 어떤 상품군들을 조회할 수 있나요?

Name(종목명)이나 Category 데이터를 활용해 필터링하면 국내에 상장된 다음과 같은 다양한 자산군을 모두 추려낼 수 있습니다.

1. 국내 및 해외 주가지수 추종 ETF

  • 국내 대표 지수: 코스피 200, 코스닥 150 추종 상품 (KODEX 200, TIGER 200 등)
  • 해외 대표 지수: 미국의 S&P500, 나스닥100, 다우존스 또는 빅테크 탑10 추종 상품

2. 채권 및 금리형 ETF

  • 국내외 국채: 한국 국채 3년/10년물, 미국 국채 10년/30년물 등 초장기 채권 상품
  • 파킹형 (CD금리/KOFR): 양도성예금증서(CD) 금리나 한국무위험지표금리(KOFR)를 추종하는 고금리 파킹형 상품

3. 배당 및 고배당 커버드콜 ETF

  • 고배당/배당성장: 국내외 우량 배당주 및 분배율이 높은 배당성장형 상품
  • 커버드콜 옵션: 미국 국채나 나스닥 지수를 기반으로 옵션 프리미엄을 수취하는 고배당 커버드콜 상품

4. 원자재 및 섹터 테마 ETF

  • 원자재: 금(Gold), 은(Silver), 원유, 천연가스 선물 추종 상품
  • 테마/섹터: 반도체, AI, 2차전지, 헬스케어 등 특정 산업군 집중 투자 상품

 

🛠️ 활용 예시: 원하는 ETF만 골라내는 코드

가져온 전체 ETF 리스트 중에서 "미국 30년 국채"나 "배당/커버드콜" 관련 상품만 쏙 골라내고 싶을 때 아래와 같이 판다스(pandas) 문자열 포함 메서드(str.contains)를 사용하면 편리합니다.

 

import FinanceDataReader as fdr

# 1. 국내 상장 전체 ETF 목록 가져오기
etf_list = fdr.StockListing('ETF/KR')

# 2. 종목명에 '미국'과 '채권'이 모두 포함된 ETF만 필터링
us_bond_etfs = etf_list[etf_list['Name'].str.contains('미국') & etf_list['Name'].str.contains('채권')]

# 3. 시가총액(MarCap)이 높은 순서대로 상위 10개 출력
print(us_bond_etfs[['Symbol', 'Name', 'Price', 'MarCap']].sort_values(by='MarCap', ascending=False).head(10))

 

by korealionkk@gmail.com


 

 

 

반응형