기술적 분석 1장: 차트를 믿어도 될까?
기술적 분석 글은 흔히 특정 종목의 차트를 보여주며 시작합니다. 하지만 하나의 차트가 예쁘게 설명된다는 사실과 그 신호가 여러 종목에서 반복적으로 작동한다는 사실은 다릅니다. 이 시리즈에서는 차트를 먼저 믿지 않고, 퀀티랩의 실제 일봉 데이터로 신호를 만들고 이후 수익률을 측정합니다.
이번 분석의 데이터 기준
Section titled “이번 분석의 데이터 기준”분석 기준일은 2026년 9월 4일입니다. 기준일 거래대금이 큰 일반 주식 300개를 표본으로 선정하고, 2024년 1월 1일부터 2026년 9월 4일까지의 일봉을 사용했습니다. ETF, ETN, 인버스, 레버리지, 채권형 상품은 제외했습니다.
| 항목 | 값 |
|---|---|
| 표본 종목 수 | 300개 |
| OHLCV 원자료 행 수 | 175,375개 |
| 120일 워밍업 이후 지표 행 수 | 150,419개 |
| 가격 데이터 기간 | 2024-01-01 ~ 2026-09-04 |
| 학습 구간 | 2024-01-01 ~ 2025-12-31 |
| 검증 구간 | 2026-01-01 ~ 2026-09-04 |
표본은 모든 상장 종목을 대표하지 않습니다. 거래대금 상위 종목을 사용했기 때문에 유동성이 낮은 종목의 체결 문제를 줄이는 대신, 대형주와 관심 종목에 유리한 표본 편향이 생깁니다. 이 한계를 숨기지 않고 원자료와 조건을 함께 공개합니다.
OHLCV를 읽고 수익률을 계산하기
Section titled “OHLCV를 읽고 수익률을 계산하기”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())이 코드의 핵심은 종목별로 날짜를 정렬한 뒤 수익률을 계산하는 것입니다. 전체 데이터를 날짜만 기준으로 정렬하면 서로 다른 회사의 가격이 이어지는 오류가 생깁니다.
첫 번째 결과
Section titled “첫 번째 결과”이번 시리즈의 모든 지표는 동일한 300개 종목과 동일한 검증 기간을 사용합니다. 따라서 RSI, MACD, 볼린저 밴드, 거래량 돌파 신호의 결과를 서로 비교할 수 있습니다. 신호가 발생한 날의 종가로 수익률을 계산하지 않고, 신호 이후 5·20·60거래일의 종가를 비교해 미래 정보를 미리 사용하지 않도록 했습니다.
데이터에서 얻은 첫 번째 인사이트
Section titled “데이터에서 얻은 첫 번째 인사이트”기술적 분석에서 가장 중요한 것은 지표의 이름이 아니라 표본과 실행 시점의 고정입니다.
- 어떤 종목을 분석했는가
- 신호는 장 마감 전에 알 수 있었는가
- 매수는 당일 종가인가, 다음 거래일인가
- 거래비용과 슬리피지를 반영했는가
- 수익률은 평균만 봤는가, 중앙값과 손실 구간도 봤는가
이 기준을 먼저 정하지 않으면 어떤 지표도 쉽게 좋아 보일 수 있습니다. 다음 장부터는 이 데이터에 이동평균선을 계산하고, 추세 신호가 실제로 어떤 결과를 냈는지 확인합니다.
원본은 OHLCV CSV, 종목 유니버스, 전체 데이터 설명에서 확인할 수 있습니다. 전체 재현 코드는 technical_analysis.py로 제공합니다.