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

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

by ToolBOX01 2026. 6. 7.
반응형

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

주식, 지수, 환율, 암호화폐, 원자재 등 시계열 가격 데이터를 가져오는 가장 핵심적인 함수입니다.

1) 기본 사용 구조

import FinanceDataReader as fdr

# 기본 형태
df = fdr.DataReader('심볼', '시작일', '종료일')

 

  • 시작일과 종료일은 '2026-01-01' 또는 '20260101' 형태의 문자열로 지정합니다.
  • 종료일을 생략하면 현재 날짜까지의 데이터를 가져옵니다.
  • 결과물은 날짜(Date)가 인덱스(Index)인 Pandas DataFrame 형태로 반환됩니다.

 

2) 자산군별 세부 심볼 및 수집 데이터

① 국내 주식 (KOSPI, KOSDAQ, KONEX)

  • 입력 방법: 거래소 종목코드 6자리 문자열을 입력합니다.
  • 예시:
    fdr.DataReader('005930', '2025') (삼성전자 2025년부터 현재까지)
    fdr.DataReader('066570', '2026-01-01', '2026-06-30') (LG전자)
  • 반환 열: Open(시가), High(고가), Low(저가), Close(종가), Volume(거래량), Change(전일 대비 등락률)

 

예제 코드

# -*- coding: utf-8 -*-
import os
import sys
import io
from datetime import date

# 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

try:
    import FinanceDataReader as fdr
    import pandas as pd
except ImportError as e:
    print(f"필수 패키지가 누락되었습니다. 설치가 필요합니다: {e}")
    sys.exit(1)


def main():
    ticker     = '225570'
    start_date = '2026-04-01'
    end_date   = date.today().strftime('%Y-%m-%d')  # 오늘 날짜 자동 적용

    print(f"넥슨게임즈({ticker}) {start_date} ~ {end_date} 데이터 불러오는 중...")

    df = fdr.DataReader(ticker, start_date, end_date)

    if df.empty:
        print("해당 기간의 데이터가 존재하지 않거나 가져오지 못했습니다.")
        return

    # Pandas 출력 옵션
    pd.set_option('display.max_rows', None)
    pd.set_option('display.max_columns', None)
    pd.set_option('display.width', 1000)

    # 존재하는 컬럼만 선택 (Change 없는 경우 대비)
    wanted_cols = ['Open', 'High', 'Low', 'Close', 'Volume', 'Change']
    target_cols = [c for c in wanted_cols if c in df.columns]

    missing = set(wanted_cols) - set(target_cols)
    if missing:
        print(f"※ 다음 컬럼은 데이터에 없어 제외됩니다: {missing}")

    print("\n[조회 결과]")
    print(df[target_cols])


if __name__ == '__main__':
    main()

 

프로그램 실행 결과

 

2) 거시경제(Macro) 및 채권 금리 데이터

주식 시장의 방향성을 결정하는 가장 중요한 원동력인 글로벌 경제 지표들을 가져올 수 있습니다. 미국 연방준비제도(FRED)의 방대한 데이터를 기반으로 합니다.

  • 국채 금리 (Yield):
    • 미국 국채 금리 (연준의 통화정책 기준이 되는 2년물, 10년물, 30년물 등 일별 금리 추이).
    • 한국 국채 금리 (1년, 3년, 5년, 10년물 등).
  • 주요 경제 지표:
    • 미국의 소비자물가지수(CPI), 실업률(Unemployment Rate), 국내총생산(GDP).
    • 미국의 기준금리 추이(Fed Funds Rate).

4) 원자재 및 상품(Commodity) 가격

원자재 투자나 인플레이션 헤지 분석을 할 때 필수적인 데이터입니다.

  • 에너지: 서부 텍사스산 원유(WTI) 가격, 브렌트유 가격, 천연가스 가격.
  • 귀금속: 국제 금(Gold) 가격, 은(Silver) 가격.

5) 환율 및 달러 인덱스 (FX)

전 세계 통화 간의 상대적 가치를 나타내는 환율 데이터를 가져옵니다.

  • 주요 환율: 원/달러(USD/KRW), 원/엔(JPY/KRW), 원/유로(EUR/KRW).
  • 달러 인덱스 (US Dollar Index): 세계 주요 6개국 통화 대비 달러화의 가치를 지수화한 데이터로, 글로벌 자금의 흐름을 읽을 때 필수적입니다.

구글 sheet를 연결테스트 코드

import os
import sys
import io
import gspread
import pandas as pd
from google.oauth2.service_account import Credentials

# [수정] 윈도우 콘솔창 한글 깨짐 방지 설정
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding='utf-8')

# 실행 중인 스크립트의 실제 폴더 경로 추적
current_dir = os.path.dirname(os.path.abspath(__file__))
KEY_FILE = os.path.join(current_dir, 'credentials.json')

scopes = [
    'https://www.googleapis.com/auth/spreadsheets',
    'https://www.googleapis.com/auth/drive'
]

try:
    credentials = Credentials.from_service_account_file(KEY_FILE, scopes=scopes)
    gc = gspread.authorize(credentials)
    
    # 시트 이름 지정
    SHEET_NAME = "stock-01"  
    sh = gc.open(SHEET_NAME)
    
    # TODO: 데이터가 있는 탭 번호 지정 (첫 번째 탭은 0, 두 번째 탭은 1)
    worksheet = sh.get_worksheet(0)

    # 시트의 전체 데이터를 가져와 변환
    data = worksheet.get_all_records()
    df = pd.DataFrame(data)

    print("=== 구글 시트 데이터 로드 성공 ===")
    
    # 데이터가 비어 있는지 확인
    if df.empty:
        print("시트는 연결되었으나 가져올 데이터가 없습니다.")
        print("첫 번째 행에 '제목(헤더)'이 있고 그 아래에 데이터가 있는지 확인해 주세요.")
        print("또는 데이터가 다른 탭에 있다면 코드를 수정해야 합니다.")
    else:
        print(df.head())

except FileNotFoundError:
    print(f"오류: '{KEY_FILE}' 경로에서 파일을 찾을 수 없습니다.")
except gspread.exceptions.SpreadsheetNotFound:
    print(f"오류: '{SHEET_NAME}' 이름의 스프레드시트를 찾을 수 없습니다.")
except Exception as e:
    print(f"알 수 없는 오류가 발생했습니다: {e}")

반응형