본문 바로가기
Programming/Python_Etc

주식 시황 데이터 수집 스크립트(Python)

by Wilkyway 2025. 9. 30.
반응형

- 매일 주식 시황 데이터 수집

import pandas as pd
import FinanceDataReader as fdr
import schedule
import time
from datetime import datetime

# =================================================================
# 1. 설정 변수
# =================================================================
# 분석을 원하는 종목의 종목 코드 (예: 삼성전자)
STOCK_CODE = '005930' 
# 데이터를 가져올 시작 날짜 (6개월치 데이터 기준)
START_DATE = (datetime.now() - pd.Timedelta(days=180)).strftime('%Y-%m-%d')
# 저장할 파일 이름
OUTPUT_FILE = f'{STOCK_CODE}_stock_data.csv'

# =================================================================
# 2. 데이터 크롤링 및 저장 함수
# =================================================================
def fetch_and_save_data():
    """
    지정된 종목의 주가 및 수급 데이터를 가져와 CSV 파일에 저장하는 함수
    """
    try:
        print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 데이터 크롤링 시작...")
        
        # 1. 주가 데이터 (OHLCV) 가져오기
        # fdr.DataReader는 'Open', 'High', 'Low', 'Close', 'Volume'을 포함
        df_price = fdr.DataReader(STOCK_CODE, START_DATE)
        
        # 2. 수급 데이터 (기관/외국인 순매수) 가져오기
        # fdr.DataReader는 자동으로 기관, 외국인 수급 데이터를 포함하지 않을 수 있습니다.
        # 한국 시장의 경우, 별도의 라이브러리(예: pykrx)나 API가 필요합니다.
        # 여기서는 fdr이 제공하는 기본 데이터(Volume)와 가격 데이터만 사용하고, 
        # 수급 데이터는 별도 연동이 필요함을 주석으로 안내합니다.
        
        # *주의*: fdr.DataReader로 가져오는 데이터프레임에는 'Open', 'High', 'Low', 
        # 'Close', 'Volume' (총거래량)이 포함됩니다.
        # '기관수급' 및 '외국인수급'은 별도의 API나 크롤링이 필요하며, 
        # FinanceDataReader만으로는 정확한 순매수 데이터를 직접 가져오기 어렵습니다. 
        # 아래 코드에서는 일단 가격과 총거래량 데이터만 저장합니다.
        
        # 필요한 컬럼만 선택하고 이름 변경
        df_final = df_price[['Open', 'High', 'Low', 'Close', 'Volume']].copy()
        df_final.columns = ['시가', '고가', '저가', '종가', '총거래량']
        
        # CSV 파일 저장 (index=True로 날짜를 저장)
        df_final.to_csv(OUTPUT_FILE, mode='w', encoding='utf-8')
        
        print(f"데이터 크롤링 완료 및 {OUTPUT_FILE}에 저장되었습니다.")

    except Exception as e:
        print(f"오류 발생: {e}")

# =================================================================
# 3. 자동 실행 스케줄링 설정
# =================================================================

# 매일 한국 시간 기준 18시 00분에 fetch_and_save_data 함수 실행 예약
# (참고: 서버 환경 설정에 따라 시간이 다를 수 있으니, 실행 환경의 시간대를 확인해야 합니다.)
schedule.every().day.at("18:00").do(fetch_and_save_data)

print("크롤링 프로그램이 시작되었습니다. 매일 18:00에 실행될 예정입니다.")

# 무한 루프를 돌며 스케줄 확인
while True:
    schedule.run_pending()
    time.sleep(1)

 

 

1년치 데이터 수집

import pandas as pd
from pykrx.stock import get_market_ohlcv_by_date, get_market_investor_all
from datetime import datetime, timedelta

# =================================================================
# 1. 설정 변수
# =================================================================
STOCK_CODE = '005930'  # 삼성전자 종목 코드 (분석 원하는 종목으로 변경 가능)
TODAY = datetime.now().strftime('%Y%m%d')
# 1년 전 날짜 계산 (약 365일 전)
ONE_YEAR_AGO = (datetime.now() - timedelta(days=365)).strftime('%Y%m%d')
OUTPUT_FILE = f'{STOCK_CODE}_1_year_data.csv'

# =================================================================
# 2. 데이터 수집 및 통합 함수
# =================================================================
def fetch_and_combine_data(ticker, start_date, end_date):
    """
    pykrx를 사용하여 1년치 주가(OHLCV) 및 수급 데이터를 수집하고 통합하는 함수
    """
    print("1. 주가 데이터 (OHLCV) 수집 시작...")
    # pykrx를 사용하여 일별 시가, 고가, 저가, 종가, 거래량 데이터 수집
    df_price = get_market_ohlcv_by_date(start_date, end_date, ticker, detail=False)
    
    # 컬럼명 변경 (요청에 맞게 한글로 변경)
    df_price = df_price.rename(columns={
        '시가': '시가', 
        '고가': '고가', 
        '저가': '저가', 
        '종가': '종가', 
        '거래량': '총거래량'
    })
    
    print("2. 수급 데이터 (투자자별 순매수) 수집 시작...")
    # pykrx를 사용하여 투자자별 순매수 데이터 수집
    df_investors = get_market_investor_all(start_date, end_date, ticker)
    
    # 필요한 투자자(기관/외국인)의 순매수 데이터만 선택
    # 주의: pykrx의 '외국인합계'는 외국인 매매동향을 나타냅니다.
    # '기관합계'는 금융투자, 보험, 투신, 은행, 연기금 등의 합산입니다.
    df_investors = df_investors[['기관합계', '외국인합계']].rename(columns={
        '기관합계': '기관수급',
        '외국인합계': '외국인수급'
    })
    
    # 3. 주가 데이터와 수급 데이터 통합 (날짜 기준)
    df_combined = pd.merge(df_price, df_investors, left_index=True, right_index=True, how='inner')
    
    return df_combined

# =================================================================
# 3. 메인 실행
# =================================================================
if __name__ == "__main__":
    try:
        print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {STOCK_CODE} 종목의 1년치 데이터 수집을 시작합니다.")
        print(f"기간: {ONE_YEAR_AGO} ~ {TODAY}")
        
        # 데이터 수집 및 통합 함수 호출
        final_df = fetch_and_combine_data(STOCK_CODE, ONE_YEAR_AGO, TODAY)
        
        # CSV 파일로 저장
        final_df.to_csv(OUTPUT_FILE, encoding='utf-8')
        
        print("-" * 40)
        print(f"✅ 데이터 수집 완료! 총 {len(final_df)}일치 데이터가 {OUTPUT_FILE}에 저장되었습니다.")
        print("데이터 예시 (최근 5일):")
        print(final_df.tail())

    except Exception as e:
        print(f"❌ 데이터 수집 중 오류가 발생했습니다: {e}")
반응형