콘텐츠로 이동
4 posts with the tag “데이터 분석”

기본적 분석 1장: 재무지표를 주가 데이터와 연결하는 법

재무지표와 가격 데이터를 연결하는 분석 장면

기본적 분석은 “좋은 기업을 찾는 방법”으로 설명되지만, 데이터 분석에서는 질문을 더 정확하게 써야 합니다.

특정 시점에 관측할 수 있었던 재무지표가 이후 수익률과 관련이 있었는가?

이 질문을 바꾸지 않으면 결과가 좋아 보여도 실제 투자 시점에는 사용할 수 없는 정보가 섞일 수 있습니다. 이 시리즈는 2024년 1월 2일부터 2026년 9월 4일까지의 가격·재무 데이터와 거래대금 상위 300개 종목을 사용한 탐색 분석입니다. 표본은 KOSPI 170개, KOSDAQ 130개이며 2025년 연간 재무 데이터를 보유한 종목은 294개입니다.

항목이번 시리즈의 기준
분석 단위종목-거래일 관측치
설명 변수PER, PBR, ROE, ROA, 부채비율, 마진, 성장률, 배당수익률 등
결과 변수관측일 종가 이후 5·20·60거래일 수익률
검증 구간2026-01-01 ~ 2026-09-04

단, 연간 재무지표가 실제 시장에 발표된 날짜까지 완전히 반영된 데이터인지 확인되지 않는다면 이 결과는 시점 누수 가능성이 있는 탐색 결과로 봐야 합니다. 연간 결산 숫자를 1월 1일부터 사용한 것처럼 처리하면 미래 정보를 과거에 미리 알고 투자한 셈이 될 수 있습니다.

import pandas as pd
prices = pd.read_csv("ohlcv.csv", dtype={"code": str})
prices = prices.sort_values(["code", "date"])
for horizon in [5, 20, 60]:
prices[f"forward_{horizon}d"] = (
prices.groupby("code")["close"].shift(-horizon)
/ prices["close"] - 1
)

이 수익률은 수수료, 세금, 슬리피지, 배당을 반영하지 않은 가격 수익률입니다. 신호를 종가 기준으로 계산했다면 체결은 다음 거래일로 미뤄야 하며, 그렇지 않으면 당일 종가를 알고 같은 가격에 매수한 것처럼 계산될 수 있습니다.

재무지표를 붙일 때 생기는 함정

섹션 제목: “재무지표를 붙일 때 생기는 함정”

재무지표를 거래일마다 반복해서 붙이는 것 자체는 편리하지만, 다음 조건이 지켜져야 합니다.

  • 재무지표의 기준일이 아니라 공시·발표일 이후에만 사용합니다.
  • 결측치를 전체 표본 중앙값으로 채우면 종목·섹터별 결측 패턴이 사라지므로 별도 표시합니다.
  • 현재 살아 있는 종목만 모으면 상장폐지·거래정지 종목이 빠지는 생존자 편향이 생깁니다.
  • 같은 기업의 연속된 거래일은 독립 표본이 아니므로 유의확률보다 기간별·종목별 재현성을 봅니다.

이번 시리즈에서 말할 수 있는 것과 없는 것

섹션 제목: “이번 시리즈에서 말할 수 있는 것과 없는 것”

현재 결과는 “어떤 지표가 반드시 주가를 예측한다”는 증명이 아닙니다. 동일한 표본과 제한된 기간에서 분위수별 미래 수익률이 어떻게 달랐는지 보여주는 가설 탐색입니다. 평균수익률 하나만으로 결론을 내리지 않고 중앙값, 양수 비율, 최대낙폭, 섹터별 결과를 함께 보겠습니다.

다음 장에서는 가장 널리 쓰이는 가치 지표인 PER을 보되, 금융업·적자 기업·일회성 이익처럼 PER이 왜곡되는 경우부터 분리해 보겠습니다.

  1. 이 숫자는 시장이 언제 알 수 있었는가?
  2. 미래 수익률의 시작 가격과 체결 시점은 일관적인가?
  3. 표본에서 빠진 종목은 없는가?
  4. 평균과 중앙값이 같은 방향인가?
  5. 다른 기간·섹터에서도 같은 결과가 나오는가?

이 다섯 질문에 답하지 못한 백테스트는 정교한 표보다 먼저 데이터 설계를 다시 봐야 합니다.


이 글은 교육 및 연구 목적의 자료이며 특정 종목의 매수·매도를 권유하지 않습니다. 과거의 분석 결과는 미래 수익을 보장하지 않습니다.

기본적 분석 2장: PER은 낮을수록 좋은가?

PER과 밸류에이션을 비교하는 장면

PER은 주가를 주당순이익으로 나눈 값입니다.

주가주당순이익

직관적으로는 “현재 이익이 계속된다고 가정할 때 몇 년 치 이익을 주가로 지불하는가”를 보여줍니다. 그러나 낮은 PER은 저평가일 수도 있고, 이익이 곧 줄어들 것이라는 시장의 경고일 수도 있습니다.

2024-01-02~2026-09-04 표본에서 PER을 종목·거래일 단위로 4분위로 나누고 이후 수익률을 계산했습니다.

PER 분위20일 평균20일 중앙값60일 평균60일 중앙값
Q1 낮은 PER+9.01%+3.52%+13.69%+2.92%
Q2+7.13%+4.04%+15.49%-0.62%
Q3+5.29%0.00%+5.83%-8.58%
Q4 높은 PER+0.49%-3.07%-10.45%-20.16%

낮은 PER 그룹이 높은 PER 그룹보다 좋았다는 방향성은 보입니다. 하지만 Q2의 60일 평균이 Q1보다 높고, 평균과 중앙값의 차이도 큽니다. 따라서 “PER이 낮을수록 수익률이 직선처럼 좋아진다”고 표현하면 결과를 과장하게 됩니다.

PER 분위수별 선행수익률

PER만으로 비교하면 안 되는 이유

섹션 제목: “PER만으로 비교하면 안 되는 이유”

PER의 분모인 이익은 과거 실적일 수 있고, 일회성 이익이나 경기 고점의 이익일 수 있습니다. 특히 다음 경우에는 낮은 PER을 할인 신호로 해석하기 어렵습니다.

  • 적자 전환 직전이라 과거 EPS가 높게 보이는 경우
  • 자산 매각·환율·세금 효과로 이익이 일시적으로 증가한 경우
  • 금융·지주·원자재 업종처럼 정상 이익의 정의가 다른 경우
  • 부채와 이자비용이 늘어 미래 이익이 줄어들 가능성이 있는 경우

PER을 단일 임계값으로 자르기보다 같은 산업 안에서 비교하고, 다음 질문을 함께 확인하는 편이 낫습니다.

  1. 최근 3년 이익이 안정적인가?
  2. 영업현금흐름이 순이익을 따라오는가?
  3. 이익 성장률과 영업이익률이 악화되고 있지 않은가?
  4. 저PER의 원인이 주가 하락인가, 이익의 일시적 고점인가?
  5. 낮은 PER이 PBR·부채비율·현금흐름과도 일관되는가?

이 결과는 저PER 전략의 가능성을 보여주지만, 저PER 종목을 곧바로 매수 후보로 확정하지는 않습니다. 다음 장에서는 장부가치와 부채를 함께 보면서 PER이 놓치는 자본구조 위험을 확인합니다.

결과 원본은 PER 분위수 수익률 CSV에서 확인할 수 있습니다.


이 글은 교육 및 연구 목적의 자료이며 특정 종목의 매수·매도를 권유하지 않습니다.

기술적 분석 1장: 지표 신호의 수익률 구분 능력

차트와 기술적 분석 데이터

기술적 분석에서 먼저 답해야 할 질문은 “이 지표가 유명한가?”가 아니라 “신호가 발생한 뒤의 수익률이 신호가 없을 때와 달라지는가?”입니다. 한 종목의 차트에서 그럴듯해 보이는 패턴만으로는 이 질문에 답할 수 없습니다.

이번 분석은 같은 표본과 같은 규칙으로 이동평균, RSI, MACD, 볼린저 밴드, 거래량, OBV 신호를 만들고, 신호 발생 뒤 5·20·60거래일 수익률을 비교합니다. 이 장에서는 분석에 사용할 데이터와 계산 규칙을 고정한 뒤, 전체 지표 결과를 먼저 훑어봅니다. 이후 각 장에서 지표를 하나씩 정의하고, 이 결과가 어떤 조건에서 유지되거나 무너지는지 확인합니다.

따라서 이 글의 결론은 “데이터를 공개했다”가 아닙니다. 어떤 신호가 이후 수익률과 더 강하게 연결됐고, 어떤 신호는 평균수익률만 좋아 보였는지를 구분하는 것이 이 장의 목적입니다.

분석 기준일은 2026년 9월 4일입니다. 기준일 거래대금이 큰 일반 주식 300개를 표본으로 선정하고, 2024년 1월 1일부터 2026년 9월 4일까지의 일봉을 사용했습니다. ETF, ETN, 인버스, 레버리지, 채권형 상품은 제외했습니다.

항목값
표본 종목 수300개
OHLCV 원자료 행 수185,309개
120일 워밍업 이후 지표 행 수150,419개
가격 데이터 기간2024-01-01 ~ 2026-09-04
학습 구간2024-01-01 ~ 2025-12-31
검증 구간2026-01-01 ~ 2026-09-04

표본은 모든 상장 종목을 대표하지 않습니다. 거래대금 상위 종목을 사용했기 때문에 유동성이 낮은 종목의 체결 문제를 줄이는 대신, 대형주와 관심 종목에 유리한 표본 편향이 생깁니다. 이 한계를 숨기지 않고 원자료와 조건을 함께 공개합니다.

import pandas as pd
df = pd.read_csv(
"ohlcv.csv",
dtype={"code": str},
parse_dates=["date"],
)
df = df.sort_values(["code", "date"])
df["return_1d"] = df.groupby("code")["close"].pct_change()
df["return_20d"] = df.groupby("code")["close"].pct_change(20)
print(df.shape)
print(df[["code", "date", "close", "return_20d"]].tail())

이 코드의 핵심은 종목별로 날짜를 정렬한 뒤 수익률을 계산하는 것입니다. 전체 데이터를 날짜만 기준으로 정렬하면 서로 다른 회사의 가격이 이어지는 오류가 생깁니다. 실제 지표 계산과 신호 정의는 공개한 Python 파일에서 재현할 수 있고, 이 장에서는 그 결과 파일을 같은 기준으로 읽어 비교합니다.

지표 신호와 20일 수익률의 관계

섹션 제목: “지표 신호와 20일 수익률의 관계”

먼저 중간 기간인 20거래일을 기준으로 비교합니다. 검증 구간은 2026년 1월 1일부터 9월 4일까지이며, 신호가 발생한 날의 종가부터 20거래일 뒤 종가까지의 수익률을 계산했습니다. 신호 당일의 수익률을 사용하지 않았기 때문에 신호 이후의 결과만 측정합니다.

import pandas as pd
results = pd.read_csv(
"event_results.csv",
encoding="utf-8-sig",
)
validation_20d = (
results.query(
"sample == '검증' and horizon_days == 20 "
"and signal != '복합 신호 진입'"
)
.assign(
positive_rate=lambda x: x["positive_rate"] * 100,
mean_return=lambda x: x["mean_return"] * 100,
median_return=lambda x: x["median_return"] * 100,
)
.loc[:, [
"signal", "events", "positive_rate",
"mean_return", "median_return",
]]
.sort_values("mean_return", ascending=False)
)
print(validation_20d.round(2).to_string(index=False))

실행 결과는 다음과 같습니다.

신호발생 횟수양수 비율평균 수익률중앙값 수익률
거래량 돌파2,72653.4%+9.75%+2.51%
MACD 골든크로스1,86855.1%+6.98%+2.72%
OBV 확인2,65353.8%+6.02%+2.03%
볼린저 하단 반등1,01549.4%+4.94%-0.27%
RSI 회복1,25847.1%+2.14%-0.91%

기술적 신호의 20일 선행수익률

이 표에서 가장 먼저 보이는 것은 평균수익률만으로 신호의 질을 판단하면 안 된다는 점입니다.

  • 거래량 돌파는 평균 수익률이 +9.75%로 가장 높고 중앙값도 +2.51%였습니다. 일부 대박 사례만으로 평균이 올라간 것이 아니라, 전형적인 신호에서도 수익률이 양수 쪽에 놓였다는 뜻입니다.
  • MACD 골든크로스는 양수 비율이 55.1%로 가장 높고 중앙값도 +2.72%였습니다. 이번 검증 구간에서는 추세 전환 신호 중 결과의 방향성이 가장 안정적이었습니다.
  • OBV 확인도 평균 +6.02%, 중앙값 +2.03%를 기록했습니다. 거래량 돌파와 함께 거래량을 확인하는 신호가 가격 반등만 보는 신호보다 일관된 결과를 보였다는 해석이 가능합니다.
  • RSI 회복과 볼린저 하단 반등은 평균수익률은 플러스였지만 중앙값이 각각 -0.91%, -0.27%였습니다. 소수의 큰 상승 사례가 평균을 끌어올렸을 가능성이 있어, “과매도 후 반등”을 반복적으로 기대하기에는 근거가 약합니다.

다만 이 결과가 신호가 발생하면 무조건 매수해야 한다는 뜻은 아닙니다. 가장 높은 양수 비율도 55.1%에 그쳤고, 모든 신호의 하위 25% 수익률은 마이너스였습니다. 즉 기술적 지표는 방향을 맞히는 단독 예언 도구라기보다, 어떤 상황에서 상대적으로 유리한 후보를 좁히는 필터로 해석하는 편이 적절합니다.

또한 이 표는 신호별 사건을 독립적으로 집계한 결과입니다. 신호가 겹치는 종목을 하나의 포트폴리오로 운용했을 때의 거래비용, 보유 비중, 최대낙폭은 아직 반영하지 않았습니다. 그래서 다음 장부터는 개별 지표의 신호 정의를 확인하고, 마지막 장에서 실제 전략 성과와 리스크를 별도로 비교합니다.

이번 결과는 다음 순서를 정하는 기준이 됩니다.

  • 이동평균과 MACD처럼 추세를 따라가는 신호는 왜 상대적으로 안정적이었는가
  • RSI와 볼린저 밴드의 반등 신호는 어떤 시장 국면에서 실패했는가
  • 거래량 돌파와 OBV 확인은 같은 정보를 반복해서 보는 것인가, 서로 보완하는가
  • 개별 신호의 관계가 실제 종목 스크리닝과 포트폴리오 백테스트에서도 유지되는가

다음 장에서는 이동평균선 신호를 전략으로 바꿔, 단순히 수익률이 높았다는 사실을 넘어 보유 시점과 최대낙폭까지 확인합니다.

원본은 OHLCV CSV, 종목 유니버스, 전체 데이터 설명에서 확인할 수 있습니다. 전체 재현 코드는 technical_analysis.py로 제공합니다.

코스피200 선물과 현물

이번 포스트에서는 코스피200 현물과 선물의 상관관계 분석 결과를 다룹니다.

코스피200 선물은 코스피200 현물 지수가 앞으로 어떻게 될지 예상하여 거래하는 가격입니다. 앞으로 코스피200이 상승할 것 같다고 판단한 투자자가 우세하면 선물 가격은 상승하고 코스피200이 하락할 것 같다고 판단한 투자자가 우세하면 선물 가격은 하락합니다.

즉, 선물 가격이 현물 가격을 선행한다고 할 수 있는데 정말 그런지 확인해보고자 합니다. 그렇다면 선물의 움직임을 보고 현물 투자에 참고하면 될테니 말입니다.

코스피200 선물과 현물의 상관관계

섹션 제목: “코스피200 선물과 현물의 상관관계”

다음 관계가 통계적으로 만족하는지 확인하고자 합니다.

  • 선물 가격 상승 -> 현물 가격 상승
  • 선물 가격 하락 -> 현물 가격 하락

선물과 현물의 증감을 시계열로 구한 뒤 상관관계(correlation)을 확인해봅니다.

코스피200 선물과 현물 값의 차이(basis)

섹션 제목: “코스피200 선물과 현물 값의 차이(basis)”

선물과 현물의 가격 차이를 베이시스(basis)라고 합니다. 코스피200의 베이시스를 구해보면 다음과 같습니다.

BASIS = KOSPI200F – KOSPI200
  • KOSPI200F: 코스피200선물 가격
  • KOSPI200: 코스피200현물 가격

1

베이시스가 양수일 때는 현물보다 선물의 가격이 높다는 뜻으로 현물이 앞으로 상승할 것 같다는 의견이 우세한 것입니다. 반대로 베이시스가 음수이면 현물이 떨어질 것 같다는 의견이 우세한 것입니다.

코스피200 현물 지표와 코스피200의 베이시스를 그려보면 다음과 같습니다.

2

대체적으로 베이시스는 양수인 경우가 많은 것을 알 수 있습니다.

종종 큰 값의 베이시스가 발생하는 부분을 살펴보며 현물의 움직임을 보면 그다지 밀접한 상관성이 보이지는 않습니다.

코스피200 현물과 베이시스의 상관관계 분석

섹션 제목: “코스피200 현물과 베이시스의 상관관계 분석”

다양한 해석이 가능하므로 참고만 하시기 바랍니다.

이견이 있으시면 자유롭게 댓글이나 메일 주시면 감사하겠습니다.

Correlation 분석 결과를 그려보면 다음과 같습니다.

3

이 결과를 다음과 같이 해석해 볼 수 있습니다.

  • 3일 뒤의 선물이 현재 현물과 가장 비슷하다.
  • 선물 가격 변화 다음날은 오히려 현물이 반대로 움직인 경우가 많다.
  • 확률적으로 선물 가격 변화 방향으로 2, 3일 뒤 현물 가격이 따라 가는 경우가 많다.