나의 경험/커리어하이 DT 금융업무 자동화 교육

파이썬 pykrx 이용해서 금융데이터 받아 DB 생성하기

LeeJaeJun 2024. 1. 20. 17:38
728x90
반응형
KOSPI 시장 데이터를 수집하고 데이터베이스에 저장하는 과정을 구현
  • pykrx 라이브러리 : 데이터 수집에 사용
  • sqlite3 라이브러리: 데이터를 로컬 SQLite 데이터베이스에 저장
import pandas as pd
import datetime

today = datetime.datetime.today() # 현재 날짜와 시간 저장합

start_date = today - datetime.timedelta(days=7) # 일주일 전 날짜를 계산하여 'start_date' 변수에 저장

today_str = datetime.datetime.strftime(today, '%m/%d/%y') # 날짜를 문자열 형식 '%m/%d/%y'로 변환

start_date_str = datetime.datetime.strftime(start_date, '%m/%d/%y') # 날짜를 문자열 형식 '%m/%d/%y'로 변환

date_range = pd.date_range(start=start_date_str, end=today_str) # 'start_date_str'부터 'today_str'까지의 날짜 범위를 생성

datelist = [] # 날짜 저장을 위한 리스트

for date in date_range:
    datelist.append(date.strftime("%Y%m%d")) # 'date_range'에 있는 각 날짜를 'YYYYMMDD' 형식으로 변환하여 'datelist'에 추가

import time
from pykrx import stock

res = pd.DataFrame() # 결과를 저장할 데이터프레임

for d in datelist:
    df = stock.get_market_ohlcv(d, market="KOSPI") # 'datelist'의 각 날짜에 대해 KOSPI 시장의 OHLCV 데이터를 가져와 'df'에 저장
    df = df.assign(일자=d) # 'df'에 '일자' 열을 추가하고, 현재 날짜 'd'를 값으로 설정
    res = pd.concat([res, df], axis=0) # 'res' 데이터프레임에 'df'를 행 방향으로 병합
    time.sleep(1) # API 제한을 피하기 위해 1초 동안 실행을 멈춥니다.

res = res.assign(티커=res.index) # 'res' 데이터프레임에 '티커' 열을 추가하고, 인덱스 값을 '티커' 열의 값으로 설정

import numpy as np

kospi_hist_price = ((res.pivot(index='일자', columns='티커', values='종가')).replace(0, np.nan)).dropna(how="all", axis=0)
# 'res' 데이터프레임을 피벗하여 '일자'를 인덱스, '티커'를 컬럼, '종가'를 값으로 사용하고, 0을 NaN으로 대체한 후 모든 값이 NaN인 행을 제거

kospi_hist_trading_amount = ((res.pivot(index='일자', columns='티커', values='거래대금')).replace(0, np.nan)).dropna(how="all", axis=0)
# 'res' 데이터프레임을 피벗하여 '일자'를 인덱스, '티커'를 컬럼, '거래대금'을 값으로 사용하고, 0을 NaN으로 대체한 후 모든 값이 NaN인 행을 제거

import sqlite3

conn = sqlite3.connect("데이터베이스 이름을 넣으세요.db", isolation_level=None) # SQLite 데이터베이스 'projectoring.db'에 연결합니다. isolation_level=None은 자동 커밋 모드

c = conn.cursor() # 데이터베이스 연결에 대한 커서를 생성

c.execute("CREATE TABLE KOSPI_LASTPRICE (TICKER text, DATE text, LASTPRICE integer)") # 'KOSPI_LASTPRICE' 테이블을 생성하는 SQL 명령 실행

c.execute("CREATE TABLE KOSPI_TA (TICKER text, DATE text, TRADINGAMOUNT integer)") # 'KOSPI_TA' 테이블을 생성하는 SQL 명령 실행

input_data1, input_data2 = [], [] # 데이터베이스에 삽입할 데이터를 저장할 두 개의 리스트를 생성

for i in range(len(res.index)):
    temp1 = res.iloc[i, [-1, -2, -6]].tolist()
    temp2 = res.iloc[i, [-1, -2, -4]].tolist()
    # 'res'의 각 행에서 필요한 데이터를 선택하여 'temp1', 'temp2' 리스트에 저장

    temp1[-1] = int(temp1[-1])
    temp2[-1] = int(temp2[-1])
    # 마지막 원소(종가 또는 거래대금)를 정수형으로 변환

    input_data1.append(tuple(temp1))
    input_data2.append(tuple(temp2))
    # 'temp1', 'temp2'를 튜플로 변환하여 각각 'input_data1', 'input_data2' 리스트에 추가

input_data1 = tuple(input_data1)
input_data2 = tuple(input_data2)

c.executemany("INSERT INTO KOSPI_LASTPRICE(TICKER, DATE, LASTPRICE) VALUES(?,?,?)", input_data1) # 'input_data1'을 사용하여 'KOSPI_LASTPRICE' 테이블에 데이터를 삽입

c.executemany("INSERT INTO KOSPI_TA (TICKER, DATE, TRADINGAMOUNT) VALUES(?,?,?)", input_data2) # 'input_data2'를 사용하여 'KOSPI_TA' 테이블에 데이터를 삽입

c.close()
conn.close()

 

 

함수 버전
# 데이터베이스에 KOSPI 데이터를 적재하는 함수
def kospidata_to_DB(date=datetime.datetime.today()):
    import sqlite3
    from pykrx import stock

    conn = sqlite3.connect("데이터베이스 이름을 넣으세요.db", isolation_level=None)
    c = conn.cursor()
   
    today_str = datetime.datetime.strftime(date, "%Y%m%d")

    today_table = stock.get_market_ohlcv(today_str, market="KOSPI") # 'today_str' 날짜의 KOSPI 시장 OHLCV 데이터를 가져옴

    today_table = today_table.assign(일자=today_str, 티커=today_table.index) # 'today_table'에 '일자'와 '티커' 열을 추가

    input_data1_, input_data2_ = [], []

    for i in range(len(today_table.index)):
    	# 'today_table'의 각 행에서 필요한 데이터를 선택하여 'temp1_', 'temp2_' 리스트에 저장
        temp1_ = today_table.iloc[i, [-1, -2, -6]].tolist()
        temp2_ = today_table.iloc[i, [-1, -2, -4]].tolist()
        
		# 마지막 원소(종가 또는 거래대금)를 정수형으로 변환
        temp1_[-1] = int(temp1_[-1])
        temp2_[-1] = int(temp2_[-1])
        
		# 'temp1_', 'temp2_'를 튜플로 변환하여 각각 'input_data1_', 'input_data2_' 리스트에 추가
        input_data1_.append(tuple(temp1_))
        input_data2_.append(tuple(temp2_))
        
    input_data1_ = tuple(input_data1_)
    input_data2_ = tuple(input_data2_)
    
	# 'input_data1_'을 사용하여 'KOSPI_LASTPRICE' 테이블에 데이터를 삽입
    c.executemany("INSERT INTO KOSPI_LASTPRICE(TICKER, DATE, LASTPRICE) VALUES(?,?,?)", input_data1_)

	# 'input_data2_'를 사용하여 'KOSPI_TA' 테이블에 데이터를 삽입
    c.executemany("INSERT INTO KOSPI_TA (TICKER, DATE, TRADINGAMOUNT) VALUES(?,?,?)", input_data2_)
    

    c.close()
    conn.close()
728x90
반응형