반응형
- 매일 주식 시황 데이터 수집
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}")반응형
'Programming > Python_Etc' 카테고리의 다른 글
| Python Oracle 연결하여 Insert하기 (cx_Oracle -> oracledb 사용) (0) | 2024.04.24 |
|---|---|
| 파이썬 turtle 라이브러리 (0) | 2024.04.02 |
| Tkinter 위젯 배치 스터디 - frame (0) | 2024.04.02 |
| Tkinter 위젯 배치 스터디 - grid / pack / place (0) | 2024.03.29 |
| Tkinter 기본 활용 (1) | 2024.03.28 |