저자 조봉수 · 봉수 SSGlobal(주) · ΦΡΥΚΤΩΡΙΑ ΠΛΗΡΟΦΟΡΙΩΝ · 2026-10-21
실습 폴더: lesson03 (파일 7개 + 정답 1개 + 자료 2개: 비트코인 일봉 5,937일 · 구글 주간 1,156주)
AI 이용 고지: 이 교재와 실습 코드는 AI(Claude)와 함께 만들었습니다. 모든 숫자는 원자료와 코드로 다시 계산할 수 있습니다. 모든 매매는 모의 계산이며 투자 권유가 아닙니다.
목차
- 오늘의 질문
- 2강에서 가져오는 것
- 수업 진행표 (약 70분)
- 0단계 — 판다스 설치 확인
- 1단계 — 한 줄로 읽기
- 2단계 — 들고만 있기를 3줄로
- 3단계 — 하루 수익률을 한꺼번에
- 4단계 — 고점 대비 낙폭과 월별 수익률
- 5단계 — 0교시 복습: 원주가와 수정주가
- 6단계 — 내 손으로 다시 짜기
- 오늘의 발견 — 거래량 칸의 함정
- 면접 대비 / 현업 적용 체크리스트
- 숙제
- 정답 (먼저 풀고 나서 보기)
1. 오늘의 질문
2강에서는 비트코인 파일을 읽는 데만 12줄이 들었습니다. 현업에서는 수천 종목을 매일 다룹니다. 그때마다 for 문을 짤 수는 없습니다.
오늘은 판다스(pandas)를 씁니다. 판다스는 엑셀 표를 파이썬 안에 넣은 도구입니다. 2강의 숫자 -11.5%를 3줄로 똑같이 다시 냅니다. 같은 숫자가 나와야 새 도구를 믿을 수 있습니다.
2. 2강에서 가져오는 것
| 2강 | 오늘(판다스) |
|---|---|
csv.DictReader + for + sort (12줄) |
pd.read_csv(...).sort_index() (1줄) |
period(rows, a, b) 함수 |
df.loc[a:b] |
p[-1][1] / p[0][1] - 1 |
p.iloc[-1] / p.iloc[0] - 1 |
고점 peak = max(peak, price) 를 날마다 |
p.cummax() 한 번에 |
3. 수업 진행표 (약 70분)
| 시간 | 단계 | 대표님이 할 일 | 확인할 숫자 |
|---|---|---|---|
| 0~5분 | 0단계 | python step0_check.py |
"준비 끝" |
| 5~15분 | 1단계 | python step1_read.py |
(5937, 5) |
| 15~25분 | 2단계 | python step2_hold_3lines.py |
+462.1% / -11.5% |
| 25~35분 | 3단계 | python step3_returns.py |
변동성 43.8%, 검산 -11.5% |
| 35~45분 | 4단계 | python step4_drawdown_monthly.py |
MDD -53.1% |
| 45~55분 | 5단계 | python step5_googl_split.py |
-51.3%, -95.2% → 분할 |
| 55~70분 | 6단계 | 빈 파일 채우기 | -11.5% / 43.8% / -53.1% / 2개 |
규칙은 똑같습니다. 한 번에 하나만 바꿉니다. 에러 메시지는 끝까지 읽습니다.
4. 0단계 — 판다스 설치 확인
python step0_check.py
- "준비 끝 — pandas …"가 나오면 1단계로 갑니다.
- No module named 'pandas'가 나오면 python -m pip install pandas를 한 번 치고 다시 실행합니다.
5. 1단계 — 한 줄로 읽기
python step1_read.py
df = pd.read_csv("data/BTC_USD_daily.csv", parse_dates=["timestamp"], index_col="timestamp").sort_index()
parse_dates: 글자 "2025-01-01"을 진짜 날짜로 바꿉니다.index_col: 날짜를 줄 이름(인덱스)으로 씁니다. 그래서df.loc["2025-01-01"]처럼 날짜로 찾을 수 있습니다.sort_index(): 파일은 최근 날짜가 위에 있습니다. 옛날 → 최근 순서로 뒤집습니다(2강rows.sort와 같은 일).
나와야 하는 결과: 표 크기(줄, 칸): (5937, 5), 처음 종가 0.05, 끝 종가 81545.02
해 보기 - ① 2025-01-01 종가 (2강에서는 for + if로 찾았습니다) - ② 처음보다 몇 배인가 - ③ 거래량이 가장 컸던 날 → 11장 '오늘의 발견'으로 이어집니다
6. 2단계 — 들고만 있기를 3줄로
python step2_hold_3lines.py
p = df.loc[a:b, "close"] # 1줄: 기간 자르기 (끝 날짜도 포함)
r = p.iloc[-1] / p.iloc[0] - 1 # 2줄: 끝 ÷ 처음 - 1
print(f"{name}: 보유 {r:+.1%}") # 3줄: 찍기
| 구간 | 기간 | 날 수 | 보유 |
|---|---|---|---|
| 학습 | 2023-01-01 ~ 2024-12-31 | 731일 | +462.1% |
| 검증 | 2025-01-01 ~ 2026-09-30 | 638일 | -11.5% |
2강과 같은 숫자입니다. 새 도구로 옛 숫자를 다시 내는 것, 이것이 도구를 바꿀 때의 검증입니다.
- loc은 이름(날짜)으로, iloc은 순번(0, 1, … -1)으로 찾습니다.
7. 3단계 — 하루 수익률을 한꺼번에
python step3_returns.py
p.pct_change() 한 줄이 637개 하루 수익률을 한 번에 계산합니다. for 문이 없습니다. 이것을 벡터 계산이라고 합니다.
| 항목 | 검증구간 값 |
|---|---|
| 하루 표준편차 | 2.29% |
| 1년 변동성 (× √365) | 43.8% |
| 가장 좋은 날 | 2026-02-06 +12.3% |
| 가장 나쁜 날 | 2026-02-05 -14.0% (바로 전날) |
| 오른 날 / 내린 날 | 314 / 323 |
- 검산: 하루 수익률을 모두 곱하면
(1 + ret).prod() - 1= -11.5%. 2단계와 같아야 합니다. - 코인은 1년 365일 거래하므로 √365를 곱합니다. 주식은 보통 √252를 씁니다.
- 가장 나쁜 날과 가장 좋은 날이 붙어 있습니다. 변동성이 큰 자산은 하루 차이로 수익이 뒤집힙니다.
8. 4단계 — 고점 대비 낙폭과 월별 수익률
python step4_drawdown_monthly.py
peak = p.cummax() # 그날까지의 최고가
dd = p / peak - 1 # 고점 대비 낙폭
- 검증구간 최대낙폭(MDD) -53.1%: 고점 124,720달러에서 2026-06-30 바닥까지 절반 넘게 빠졌습니다.
- 고점 대비 2% 넘게 빠져 있던 날이 638일 중 585일입니다. 2강의 초파리 규칙("2% 빠지면 판다")이 99번이나 사고판 이유가 여기 있습니다. 비트코인은 거의 늘 고점보다 2% 이상 아래에 있습니다.
- 월별 수익률:
resample("ME").last().pct_change()— 달마다 마지막 날 종가로 달별 수익률을 냅니다. 오른 달 10개, 내린 달 10개입니다. - 함정: 표에 2025-01이 없습니다. 2024-12 종가를 잘라 버렸기 때문에 첫 달은 비교할 전달이 없습니다. 자르는 위치가 결과를 바꿉니다(2강 '기간을 적는다'와 같은 교훈).
9. 5단계 — 0교시 복습: 원주가와 수정주가
python step5_googl_split.py
| 주 | 원주가(close) | 수정주가(adjusted close) |
|---|---|---|
| 2014-04-04 | -51.3% | -2.9% |
| 2022-07-22 | -95.2% | -3.5% |
원주가로 보면 폭락이지만, 실제로는 주식 분할입니다(2014년 1→2, 2022년 1→20). 수정주가로 보면 -40% 넘게 빠진 주는 0개입니다. 0교시에서 for 문으로 찾던 것을 판다스는 raw[raw < -0.40] 한 줄로 찾습니다. 2부 2-2강 '기업행사와 수정주가'에서 자세히 다룹니다.
10. 6단계 — 내 손으로 다시 짜기
step6_rebuild.py에는 주석만 있습니다. 목표 네 개를 맞추면 수업이 끝납니다.
| 목표 | 값 |
|---|---|
| ① 검증구간 보유 | -11.5% |
| ② 검증구간 1년 변동성 | 43.8% |
| ③ 검증구간 최대낙폭 | -53.1% |
| ④ GOOGL 원주가 '폭락' 주 | 2개 |
막히면 answers/step6_answer.py를 봅니다. 정답은 9줄입니다. 보고 나서 다시 빈 파일에 처음부터 씁니다.
11. 오늘의 발견 — 거래량 칸의 함정
1단계 ③에서 거래량이 가장 컸던 날을 찾으면 2024-08-05, 거래량 약 2,122억이 나옵니다. 그런데 비트코인은 총 2,100만 개까지만 발행됩니다. 하루에 2,122억 개가 거래될 수는 없습니다.
df.loc["2024-12-20":"2024-12-25", "volume"]를 찍어 보면 이렇습니다.
| 날짜 | 거래량 |
|---|---|
| 2024-12-21 | 103,445,400,000 (약 1천억) |
| 2024-12-22 | 60,172,030,000 (약 6백억) |
| 2024-12-23 | 13,477 |
| 2024-12-24 | 13,355 |
2024-12-22까지와 2024-12-23부터 단위가 1천만 배 가까이 다릅니다. 앞쪽은 달러 금액이거나 여러 거래소를 합친 값, 뒤쪽은 한 곳의 비트코인 개수로 보입니다 [추정 — 자료 제공처 설명은 확인하지 못함]. 어느 쪽이든 한 칸 안에서 단위가 바뀐 자료입니다.
- 이 칸으로 "최근 거래량이 1천만 분의 1로 줄었다"라고 쓰면 완전히 틀린 분석이 됩니다.
- 2강·3강에서 종가(close)만 쓴 것은 다행이었습니다. 종가는 이어져 있습니다(검산 일치).
- 이것이 2부 '금융 데이터 품질'이 따로 있는 이유입니다. 넥스트증권 금융 데이터 분석가 공고의 '벤더 데이터 품질 검증'이 바로 이런 일입니다.
12. 면접 대비 / 현업 적용 체크리스트
면접 대비 - 질문 "판다스로 바꿨을 때 결과가 맞는지 어떻게 확인합니까?" - 답: 기존 방식으로 낸 숫자를 새 도구로 다시 냅니다. 이번 실습에서는 for 문으로 낸 -11.5%를 판다스 3줄로 똑같이 냈고, 하루 수익률을 곱해 다시 -11.5%로 검산했습니다. - 질문 "벤더 자료의 이상값을 어떻게 찾습니까?" - 답: 물리적 한계와 비교합니다. 비트코인 거래량이 총 발행 한도보다 크게 나오는 것을 보고, 날짜별로 찍어 2024-12-23에 단위가 바뀐 지점을 찾았습니다. 그 칸은 분석에 쓰기 전에 출처에 확인합니다.
현업 체크리스트 - [ ] 새 도구의 결과를 옛 결과와 맞춰 보았는가 - [ ] 날짜 순서를 정렬했는가 (파일은 최근이 위일 수 있다) - [ ] 연환산할 때 365와 252 중 맞는 것을 썼는가 - [ ] 한 칸 안에서 단위·출처가 바뀌는 지점이 없는가 - [ ] 원주가가 아니라 수정주가를 썼는가
13. 숙제
- 학습구간(2023~2024)의 1년 변동성과 최대낙폭을 구해, 검증구간과 비교해 한 줄로 쓰기.
- 거래량 칸을 2024-12-23 이후만 잘라 월별 합계를 구해 보기 (
resample("ME").sum()). - 다음 강 예고: 1-3강 — 그림으로 보기. 오늘 숫자(낙폭·월별 수익률)를 그래프로 그립니다.
14. 정답 (먼저 풀고 나서 보기) — 눌러서 펼치기
| 문제 | 정답 |
|---|---|
| 1단계 ① 2025-01-01 종가 | 94,383.59달러 (2강과 같음) |
| 1단계 ② 몇 배 | 약 163만 배 |
| 1단계 ③ 거래량 최대 | 2024-08-05, 약 2,122억 → 11장의 함정 |
| 2단계 ① 시작일 2025-01-31 | -18.4% (2강과 같음) |
| 2단계 ② 2026-01-01 ~ 2026-10-17 보유 | -8.1% (시작 88,738.34달러) |
| 3단계 ① 하루 -5% 넘게 빠진 날 (검증) | 12일 |
| 3단계 ② 학습구간 1년 변동성 | 48.6% → 검증(43.8%)보다 컸다 |
| 4단계 ① 학습구간 최대낙폭 | -26.2% (바닥 2024-09-06) |
| 4단계 ② 99번 산 이유 | 638일 중 585일이 고점 대비 -2% 아래 → 규칙이 거의 매일 팔고 다음 날 다시 삼 |
| 5단계 ① 전체 보유 (원주가 / 수정주가) | +229% / +13,145% → 진짜 성과는 수정주가 |
| 5단계 ② 배당 있는 주 | 11번 |
| 6단계 | -11.5% / 43.8% / -53.1% / 2개 |
자료: Alpha Vantage 비트코인/달러 일봉(2010-07-17 ~ 2026-10-17), GOOGL 주간 수정주가(2004-08-27 ~ 2026-10-15). 계산 확인: 2026-10-21 버디가 클라우드(pandas 3.0.5)에서 전 단계를 실행해 위 숫자와 일치함을 확인.

