목차
1. 들어가며
야후 파이낸스는 historical data에서 수정 종가를 Adj Close라는 항목으로 제공한다. Apple(AAPL)의 historical data를 검색해보면 다음과 같은 화면을 볼 수 있다.
주석의 설명에 따르면 Close는 분할(splits)을 고려한 가격이고, Adjusted close는 분할(splits)과 배당금(dividend) 또는 분배금(capital gain distribution)을 고려한 가격이라고 한다. 두 항목을 비교해보면 0.23 달러의 배당금이 지급된 이후에는 값이 동일하고, 배당금이 지급되기 이전 시점의 Close와 Adj Close는 배당금인 0.23 달러만큼 차이가 나는 것을 확인할 수 있다. 5월 4일에는 0.24차이가 나는데 화면에 표시되는 가격이 소수점 둘째자리로 반올림된 값이기 때문으로 보인다. yfinance 패키지를 사용하면서 수정 종가 항목이 있다는 것은 알고 있었지만 어떻게 계산되는지는 정확히 찾아본 적이 없었다. 이번 글을 통해 수정 종가의 개념과 수정 종가를 사용하는 이유, 수정 종가에 대한 비판 등을 정리해보려고 한다. 1
2. 수정 종가(adjusted close) - Yahoo Finance 기준
종가(close)는 시장이 마감되기 전 마지막으로 거래된 주가를 뜻하는데 수정 종가(adjusted close)는 해당 주식의 종가(close)에 분할(splits), 배당금 분배(dividend distributions) 등 주가에 영향을 미칠 수 있는 기업의 활동(corporate actions)을 반영한 후의 종가를 뜻한다. 수정 종가는 과거 수익률(historical returns)을 분석할 때 자주 사용된다.
Yahoo Finance 에서는 수정 종가를 다음과 같이 정의하고 있다.
Adjusted close is the closing price after adjustments for all applicable splits and dividend distributions. Data is adjusted using appropriate split and dividend multipliers, adhering to Center for Research in Security Prices(CRSP) standards.
CRSP 링크를 타고 들어가서 보면 Adjusted Data에 대한 설명을 찾아볼 수 있는데, 이 페이지의 설명만 읽고는 로직을 이해하기 쉽지 않다. 계산 로직에 대한 설명은 이 블로그의 글을 참고하였다.
수정 종가의 계산의 기준이 되는 날짜(base date)는 가장 최근의 거래일(the last available day of trading)이다. 수정 종가 계산 시, 날짜를 내림차순 정렬 해놓고 로직을 적용하면 된다. 계산 로직은 다음과 같다.
우선 계산 기준일자(base date)의 수정 종가는 해당일자의 종가와 동일하다. 그 다음부터는 하루씩 과거로 가면서 일정한 승수(multiplier)를 적용해주면 된다. 만약 분할(splits)이 없다면 수식을 다음과 같이 정리할 수 있다.
분할도 없고, 배당락일이 아니라면 수식을 다음과 같이 정리할 수 있다. 2
수식을 조금 살펴보면 기준일자부터 가장 최근의 배당락일 까지는 종가와 수정 종가가 동일하다는 것을 알 수 있다. 그리고 배당락일 전일부터는 해당일자의 종가에서 배당금이 차감된 후의 값이 누적되면서 수정 종가가 계산된다. 배당금을 빼는 이유는 현재 시점에서 봤을 때의 과거 주가의 가치를 정확하게 평가하기 위함이다. 과거 특정 시점부터 현재시점까지의 수익률을 계산해서 비교했을 때, 종가 기준 수익률에 배당 수익률을 더한 값이 수정 종가 기준 수익률이 된다. 이 논리를 설명한 유튜브 영상이 있어 3링크를 첨부한다. 4
수식으로만 보면 이해가 잘 안 될 수 있으니 엑셀에 값을 직접 넣어서 계산을 해보자.
2022년 5월 11일을 기준으로 수정 종가를 계산한다고 하면, 5월 11일의 수정 종가는 종가와 동일한 146.5 달러이다. 배당락일인 5월 6일까지는 위의 수식3의 케이스이므로 종가와 수정 종가가 동일하다. 배당락일 전일인 5월 5일 부터는 배당금을 차감하여 수정 종가를 계산하게 되고, 다시 그 이전 시전 배당락일 전일인 2022년 2월 3일 부터는 0.22 달러의 배당금까지 고려한 수정 종가를 계산하게 된다. Yahoo Finance에서 가져온 값과 실제로 계산한 값 사이에 조금 차이가 있는데 아마도 라운딩 에러 때문인 듯하다.
3. 수정 종가를 사용하는 이유
주식 가격은 일반적으로 시장 참가자의 수요와 공급에 영향을 받는다. 그러나 주식의 분할, 배당금 분배 및 유상증자와 같은 기업의 활동들도 주가에 영향을 미친다. 이러한 영향을 주가에 반영하면 투자자는 주식의 성과를 더 정확하게 평가할 수 있게 된다. 우선, 분할을 고려하기 때문에 과거 데이터를 통한 주가 수익률 계산이 가능해진다. 또한, 수정 종가를 통해 둘 이상의 자산의 성과를 비교할 수 있다. 배당금의 효과를 설명하지 못하면 가치주와 배당 성장주의 수익성이 과소평가되는 경향이 있다. 수정 종가를 사용하는 것은 장기간에 걸쳐 다양한 자산의 수익률을 비교할 때 필수적이다. 장기적 관점에서 자산 배분(asset allocation)을 고려하는 투자자라면 수정 종가를 사용해서 과거 수익률을 정확하게 평가할 수 있다. 배당금을 꾸준히 지급해온 애플(AAPL)과 배당금을 한 번도 지급한 적이 없는 아마존(AMZN)의 누적 수익률을 비교하려고 한다면 배당금의 효과를 고려한 수정 종가를 사용해야 공정한 비교가 가능해진다. 5
4. 수정 종가에 대한 비판
수정 종가를 사용하는 것이 모든 경우에 유용한 것은 아니다. 수정 종가를 사용하면 흔히 '마디 가격'이라 불리는 $100와 같은 특정 가격에 대한 정보의 손실이 있을 수 있다. 또한, 추세 추종 방식의 트레이딩을 주로 하는 투자자라면 배당금이 반영된 수정 종가를 사용하는 것이 큰 의미가 없을 수 있고, 특정한 경우에서는 명목 가격이 줄 수 있었던 정보의 손실 때문에 중요한 패턴을 놓치게 될 수 있다. 주식의 분할 자체도 단기적인 주가의 상승 혹은 하락을 만들어낼 수 있지만 수정 종가를 사용하면 이러한 패턴을 발견할 수 없게 된다. 6
5. 수정 종가를 사용해야 하는가?
자산 배분을 중요하게 생각하고, 재무정보를 활용하고자 하는 장기 투자자라면 분할과 배당금을 고려한 수정 종가를 사용하는 것이 좋아 보인다. 과거 시점의 주가를 현재 시점의 가치로 보정하기 위해 사용하는 것이 수정주가이기 때문이다. 반면, 단기 매매 위주로 기술적 지표를 중요시하는 트레이더라면 분할이나 배당의 효과를 수익률을 계산하는데 사용할 주가에 반영하는 것이 아니라 하나의 이벤트 지표로써 사용하는 것이 더 나은 선택이라고 생각한다.
6. python/excel 구현
로직 설명에 참고한 블로그를 보면 python 코드를 함께 제공하고 있다. 블로그에 있는 코드를 조금 더 알아보기 쉽게 정리해보았다. 엑셀 구현은 로직 설명 시 사용한 엑셀파일을 첨부하는 것으로 대체한다.
6.1 python
# ref: https://joshschertz.com/2016/08/27/Vectorizing-Adjusted-Close-with-Python/
import yfinance as yf
df = yf.Ticker('AAPL').history(period='max', back_adjust=False, auto_adjust=False)
##############################################################################
#### 수정종가 계산을 위한 함수
##############################################################################
def calculate_adjusted_prices_iterative(df, column):
"""
column에 투입한 항목에 대해 수정가격(adjusted price)을 계산한다.
결과 값으로 adj_<칼럼명>을 칼럼명으로 하는 새로운 칼럼이 생성된다.
데이터프레임에 배당금은 dividend, 분할비율은 split_ratio라는 이름으로 있어야 한다.
"""
adj_column = 'adj_' + column
# 0으로 채워진 빈 칼럼 생성
df[adj_column] = 0
# 가장 최근 날짜(기준일자)가 맨 위로 오도록 정렬
df = df.sort_index(ascending=False)
dates = list(df.index)
base_date = dates[0]
# 기준일자인 경우 주가 = 수정주가
df.loc[base_date, adj_column] = df.loc[base_date, column]
# 가장 최근 시점부터 과거 순으로 반복문 실행
"""
시점 변수명 예시
t next 2022.05.11
t-1 current 2022.05.10
"""
for i, date in enumerate(dates):
if i==0:
next_date = base_date
else:
next_date = dates[dates.index(date) - 1]
current_val = df.loc[date, column]
next_val = df.loc[next_date, column]
next_adj = df.loc[next_date, adj_column]
split_ratio = df.loc[next_date, 'split_ratio']
dividend = df.loc[next_date, 'dividend']
adj_price = (next_adj+next_adj*(
((current_val*split_ratio)-next_val-dividend)/next_val)
)
df.loc[date, adj_column] = adj_price
return df
##############################################################################
df['dividend'] = df.Dividends
df['split_ratio'] = 1 # yfinance의 Close는 이미 split이 적용된 값이다.
df_adj = calculate_adjusted_prices_iterative(df, 'Close')
df_adj = df_adj.assign(adj_close1 = round(df_adj['Adj Close'], 4),
adj_close2 = round(df_adj['adj_Close'], 4))
(df_adj['adj_close1']-df_adj['adj_close2']).plot();
6.2 excel
- ETF에서의 배당금이라고 보면 된다. [본문으로]
- 이 날까지 주식을 가지고 있으면 배당금을 받을 수 있다. [본문으로]
- 왜 배당락일 전일자부터 배당금을 빼는 보정을 하는지는 아직 정확하게 이해하지 못했다. 이해가 된다면 내용을 업데이트 해보려고 한다. [본문으로]
- https://www.youtube.com/watch?v=M7aTsgPbysc [본문으로]
- https://www.investopedia.com/terms/a/adjusted_closing_price.asp [본문으로]
- https://www.investopedia.com/terms/a/adjusted_closing_price.asp [본문으로]