2023.03.25 - [시스템트레이딩] - KRX 수정주가 조회 및 계산방법
KRX 수정주가 조회 및 계산방법
분명히 예전에는 KRX 정보데이터 시스템에서 종목들의 일일 주가를 조회할 때 수정주가가 적용되지 않았는데 오랜만에 한국거래소 사이트에 들어갔더니 [12003] 개별종목 시세 추이에 수정주가
toniteifly.tistory.com
이전 글에 남긴 것처럼 KRX에서 수정주가를 조회할 수 있으니까 큰 의미는 없지만 나처럼 만들어놓은 데이터베이스가 [12001] 전종목 시세를 매일 크롤링해서 업데이트하고 있다면 특정 종목의 과거 가격 데이터를 긁어 와서 수정주가로 다시 변환하는 작업이 필요하다.
또한 수정주가라는 것이 현재 또는 미래에 벌어질 이벤트에 따라 과거 데이터를 모두 수정해야 되는 문제가 있어서 수정주가 이벤트가 있을 때마다 종목들의 과거 데이터를 모두 다시 크롤링해야 한다면 퍼포먼스 문제도 분명 존재한다. 이 때문에 매일 장 마감 후에 전체 종목들의 당일 가격만 따로 저장해서 데이터베이스화하고 있다.
위와 같은 형태의 DataFrame 자료가 있다고 가정할 경우 changes 컬럼의 가격변화를 이용해서 수정주가를 구하는 전체 코드는 아래와 같다.
import sqlite3
import pandas as pd
import matplotlib.pyplot as plt
pd.set_option('display.max_columns', None)
pd.options.display.expand_frame_repr = False
# 전종목 수정전주가 DB에서 해당종목의 수정전주가 데이터만 불러옴
def load_data(code):
DB_PATH = 'database_krx_marcap.db'
con = sqlite3.connect(DB_PATH)
query = f"SELECT * FROM stock WHERE code == '{code}'"
df = pd.read_sql(query, con)
return df
# 수정주가 계산하기
def cal_adj_price(df):
# changes: 대비 값을 이용해서 기준가격과 종가의 차이비율을 계산
df['adj_ratio'] = (df['close'] - df['changes']).shift(-1) / df['close']
df['adj_ratio'].iat[-1] = 1
# DataFrame의 순서를 바꿔어서 adj_ratio를 누적으로 곱하고(cumprod) 다시 순서를 원래대로 돌림
df['cum_adj_ratio'] = df['adj_ratio'].iloc[::-1].cumprod().iloc[::-1]
# open, high, low, close에 각각 adj_ratio를 곱하여 수정주가를 산출
for column in ['open', 'high', 'low', 'close']:
df[column + '_adj'] = round(df[column] * df['cum_adj_ratio'], 0)
return df
# 가격 차이 시각화
def plot_df(df):
df['date'] = pd.to_datetime(df['date'])
plt.rcParams['figure.figsize'] = (15, 8)
plt.rcParams['font.size'] = 8
plt.rcParams['font.family'] = 'Malgun Gothic'
fig, ax1 = plt.subplots()
ax1.plot(df['date'], df['close'], label='close', color='green')
ax1.legend(loc='upper left')
ax2 = ax1.twinx()
ax2.plot(df['date'], df['close_adj'], label='close_adj', color='blue')
ax2.legend(loc='upper right')
plt.title(df['code'].iat[-1] + '_' + df['name'].iat[-1])
plt.show()
code = '001260' # 남광토건
df = load_data(code)
# 수정주가 계산
df = cal_adj_price(df)
print(df)
# 가격 차이 시각화
plot_df(df)
위 코드를 실행하면 수정주가가 _adj 컬럼에 따로 저장되고 1995년 5월 29일의 종가(close_adj)는 430,173,611원으로 KRX에서 조회한 수정주가 ([12003] 개별종목 시세추이)와 일치한다.
'Python, API' 카테고리의 다른 글
[Python/키움API] 주식 틱차트 조회요청 (OPT10079) 및 저장 (2) | 2023.04.24 |
---|---|
[Python] DataFrame에 필터 적용 후 여러 개로 쪼개기 (0) | 2023.03.26 |
Pandas.read_sql 속도 비교 (chunksize, connectorx) (0) | 2023.02.26 |
[Telegram API] pyTelegramBotAPI로 메시지 보내기 (0) | 2023.02.08 |
[Python-telegram-bot] bot.sendMessage - RuntimeWarning: coroutine 'Bot.send_mes (0) | 2023.02.04 |