주가를 신경망에 넣으려면 먼저 창으로 자르고, 미래 정보가 섞이지 않게 정규화하고, 무엇을 맞힐지(목표값) 정해야 한다. 이 편은 실제 애플 주가 506거래일로 "내일 = 오늘"이라는 가장 단순한 기준선, 선형 모델, LSTM을 같은 방식(워크포워드)으로 겨룬다. 결과는 좋든 나쁘든 그대로 싣는다. 교육용 예시이며 투자 조언이 아니다.
가격 줄 하나만으로는 학습할 수 없다. "지난 L일을 보고 다음 날을 맞힌다"는 문제로 바꿔야 한다. 창을 한 칸씩 밀면 (입력, 정답) 쌍이 하나씩 생긴다.
가격은 시기마다 수준이 달라(2015년 약 120달러, 2016년 약 90달러) 학습 때 본 적 없는 범위가 시험 때 나온다. 그래서 하루 변화율(로그 수익률 = log(오늘/어제) × 100%)로 바꾼다. 정규화(평균을 빼고 표준편차로 나누기)의 기준은 학습 구간에서만 계산한다. 전체 기간의 평균을 쓰면 시험 구간의 정보가 학습에 새어 들어간다(섹션 4의 누수). 목표값도 "다음 날 수익률(숫자)", "오를까 내릴까(방향)", "변동 크기" 가운데 무엇을 맞힐지 먼저 정해야 한다.
신경망은 여러 신호 사이의 비선형 관계를 스스로 찾는다. 그래서 주가처럼 많은 요인이 얽힌 문제에 기대를 받는다. 그런데 먼저 데이터에 물어볼 것이 있다. "어제의 수익률이 오늘의 수익률과 관련이 있는가?"
큰 연구 두 개의 결론이 서로 다르다. 어떤 조건에서 나아졌고 어떤 조건에서 아니었는지를 함께 봐야 한다.
주가 예측에서 "놀라운 성과"의 대부분은 이 네 가지 가운데 하나에서 나온다. 각각을 실제 데이터의 숫자로 본다.
실제로 쓸 때와 똑같이 평가한다. 그날까지의 과거로만 학습하고, 다음 몇 날을 예측하고, 그 날들이 지나면 그것까지 넣어 다시 학습한다. 시험 구간이 학습 구간보다 늘 뒤에 있어야 한다.
마지막 200거래일(2016-05-04 ~ 2017-02-16)을 워크포워드로 예측했다. 전략은 "오른다고 보면 보유, 내린다고 보면 현금"이고, 보유와 현금을 바꿀 때마다 0.1%를 뺀다.
두 코드 모두 Colab에 기본으로 설치된 라이브러리만 쓴다. "노트북(.ipynb) 내려받기" 후 Colab에서 파일 → 노트북 업로드로 열거나, 복사해서 새 노트북 칸에 붙여 넣는다.
공개 CSV를 내려받아 기준선 2개와 릿지 선형 모델을 워크포워드로 평가하고, 거래 비용을 뺀 전략을 사서 들고 있기와 비교한다. 누수와 과적합 함정도 숫자로 보여 준다. 내 데이터로 바꾸려면 PRICE를 바꾼다.
지난 20일 수익률로 다음 날을 예측하는 LSTM을 50일마다 다시 학습한다. 시드 2개의 결과를 따로 싣는다. 섹션 6의 표가 이 출력에서 바로 만들어진다.
ChatGPT, Qwen, Claude 같은 AI 도우미에 붙여 넣는 프롬프트다. "복사"를 누르면 프롬프트 뒤에 고른 코드가 함께 붙는다. 〔 〕 안을 내 상황으로 바꿔 쓰면 된다.
AI의 답은 출발점일 뿐이다. 제안된 논문·수치·라이브러리 함수는 반드시 원문과 공식 문서로 확인한다. 공모전·논문에 AI 도움을 받았다면 주최 측과 학술지의 규정에 따라 사용 사실과 범위를 밝힌다.
본문의 노란 점선 밑줄과 같은 사전이다. 시리즈 전체에서 같은 표기를 쓴다. 섹션 이름을 누르면 처음 나온 곳으로 간다.
비유는 이해의 첫걸음이지만 오해의 씨앗도 된다. 초파리·뇌 비유에는 강도를 표시했다. 직접 실제로 같은 일을 한다는 근거가 있음 · 부분 일부 성질만 닮음 · 없음 대응하는 것이 알려지지 않음
| 개념 | 일상 비유 | 초파리·뇌 비유 | 비유가 틀리는 지점 |
|---|---|---|---|
| 창 | 지난 일주일 날씨를 보고 내일 날씨 맞히기 | 부분 초파리도 최근 몇 초의 냄새 변화로 방향을 정한다 | 날씨에는 물리 법칙이 있지만, 주가는 사람들의 예측 자체가 가격을 바꾼다 |
| 기준선 | "내일도 오늘과 같다"고 말하는 일기예보관 | 없음 | 단순해 보여도 이기기 어렵다. 모든 모델은 이것부터 이겨야 한다 |
| 데이터 누수 | 시험 전에 답안지를 본 학생의 점수 | 없음 | 답안지를 본 줄 모르고 보는 경우가 대부분이다. 정규화·특징 계산에 숨어 든다 |
| 과적합(선택 편향) | 동전 100개를 던져 앞면이 많이 나온 동전을 "행운의 동전"이라 부르기 | 없음 | "행운"은 다음 던지기에서 사라진다. 그런데 실제 전략은 이것을 가려내기 훨씬 어렵다 |
| 구조 변화 | 여름옷 판매 기록으로 겨울 매출을 예측하기 | 부분 환경이 바뀌면 초파리의 학습된 기억도 새로 고쳐진다 | 계절은 예측할 수 있지만 시장 성격의 변화는 언제 올지 모른다 |
| 워크포워드 | 매주 지난 기록까지만 보고 다음 주를 예측하는 모의고사 | 없음 | 모의고사와 달리 시장은 내 예측이 맞든 틀리든 기다려 주지 않는다 |
E-1 저자 소개 · E-2 학술 레퍼런스 · E-3 그림 참고 자료
finance-charts-apple.csv (GitHub plotly/datasets). 배당 반영 종가(AAPL.Adjusted)를 썼다강사, 실무 OJT 담당자, 튜터를 위한 운영 안내다. 시간은 예상치이므로 실제 수업에 맞춰 조정한다. 이 편은 투자 권유로 읽히지 않도록 수업 시작과 끝에 "교육용 예시이며 투자 조언이 아니다"를 분명히 말한다.
| 대상 | 수요·매출·센서·가격 같은 시계열을 예측하려는 대학생·실무자, 핀테크 입문자 |
|---|---|
| 선수 지식 | 평균·표준편차, 3-2의 과적합과 검증, 3-7의 LSTM |
| 학습 목표 | ① 시계열을 창·정규화·목표값으로 학습 문제로 바꾼다 ② 누수·과적합·구조 변화·거래 비용을 숫자로 설명한다 ③ 워크포워드로 기준선과 모델을 같은 잣대로 비교한다 |
| 예상 시간 | 읽기 40~50분 · 시연 20분 · Colab 실습 30분 (코드 1 10분, 코드 2 실행 4분 + 해석 15분) |
도입 5분(히어로의 "LSTM이 기준선보다 나쁘다") → 섹션 1·2 15분 → 섹션 4 함정 네 개 15분 → 섹션 5·6 10분 → 확인 문제 5분.
우리 팀의 예측 대상(수요·매출 등)에서 기준선 정하기 15분 → 섹션 4를 우리 데이터의 누수 점검표로 바꾸기 25분 → 코드 1에 우리 시계열 넣기 35분 → 결과 보고 방식 토론 15분.
입문자는 섹션 1·4·6만. 중급자는 코드 1의 워크포워드 반복문을 손으로 따라가게 하고, 표준화 기준을 전체 기간으로 바꿨을 때 숫자가 어떻게 달라지는지 직접 확인하게 한다.
| 섹션 | 멈춰서 물어볼 질문 | 조작 팁 |
|---|---|---|
| 1 창·목표값 | "가격 그대로 넣으면 무엇이 문제일까?" | 가격 → 수익률 순서로 누른다 |
| 2 기대와 현실 | "방향과 변동 크기 중 무엇이 더 예측하기 쉬울까?" | 수익률 → 절댓값 순서로 눌러 띠를 벗어난 막대 수를 비교한다 |
| 3 연구 사례 | "두 연구의 결론이 왜 다를까?" | 데이터 크기와 문제 종류 행을 나란히 비교한다 |
| 4 함정 | "100개를 시험해 하나를 고르면 그 성적을 믿을 수 있을까?" | 과적합 → 거래 비용(0 → 0.3%) 순서로 본다 |
| 5 워크포워드 | "무작위로 섞어 나누면 왜 안 될까?" | 두 방식을 번갈아 누른다 |
| 6 비교 | "LSTM이 기준선보다 나빴다. 무엇을 바꿔 볼 수 있을까?" | RMSE → 전략 수익 순서로 본다 |
| 오해 | 바른 설명 | 보여 줄 장면 |
|---|---|---|
| LSTM은 시계열 전문이니 기준선보다 낫다 | 단서가 적은 문제에서는 기준선을 이기기 어렵다. 이 실험에서 LSTM은 기준선보다 나빴다 | 섹션 6 |
| 방향 적중률 55%면 돈을 번다 | 틀릴 때 크게 잃으면 손해다. 거래 비용과 들고 있기와의 비교도 필요하다 | 섹션 6의 기준선 행(55.0%) |
| 백테스트에서 좋았으면 실전에서도 좋다 | 여러 번 시도해 고르면 우연이 섞인다. 시장의 성격도 바뀐다 | 섹션 4 과적합·구조 변화 |
| 정규화는 전체 데이터로 한 번 하면 된다 | 학습 구간에서만 기준을 계산해야 한다. 아니면 미래 정보가 샌다 | 섹션 1, 섹션 4 누수 |
| 신경망은 주가 예측에 쓸모없다 | 큰 데이터·많은 신호·횡단면 문제에서는 나아진 연구가 있다. 조건이 중요하다 | 섹션 3 |
505 − 5 = 500개.
10번. 첫 학습은 500 − 200 = 300쌍, 마지막은 480쌍이다.
40 × 0.1 = 4%p(로그 수익 기준 근사).
많이 시도해 고른 결과는 우연에 맞춰진 것이라 새 구간에서 재현되지 않는다(과적합·선택 편향). 시험 구간은 마지막에 한 번만 써야 한다.
결과를 그대로 쓴다. "이 데이터(종목 1개, 506일, 신호는 과거 수익률)와 이 설정(창 20일, 50일마다 재학습, 40에폭)에서 LSTM은 기준선을 이기지 못했다(RMSE 1.462%·1.550% 대 1.209%)." 이어서 바꿔 볼 조건과 일반화의 한계를 밝힌다.
코드 1의 ridge_fit에서 표준화 기준(mu, sd)을 전체 기간(X 전체)으로 바꿔 다시 실행한다. RMSE와 전략 수익이 어떻게 바뀌는지 기록하고, 왜 이것이 누수인지 두 문장으로 쓴다.
코드 2의 목표를 "다음 날 수익률"에서 "다음 날 수익률의 절댓값(변동 크기)"으로 바꾼다. 기준선은 "과거 20일 평균 절댓값"으로 한다. 섹션 2의 자기상관과 연결해, 변동 예측에서 LSTM이 기준선을 이기는지 시드 3개 이상으로 보고한다.
| 입문자 | 섹션 2·3은 건너뛰어도 흐름이 끊기지 않는다. 섹션 4의 과적합과 섹션 6의 표 하나는 꼭 본다 |
|---|---|
| 심화 | 여러 번 시도한 백테스트의 성과를 어떻게 보정해야 하는지(다중 검정) 조사하게 한다. 조사한 논문은 원문으로 확인한다 |
| 더 배우기 | 안상선, 「비즈니스를 위한 데이터 과학」 강의안 (데이터 과학 전반) · STEP [K-디지털] 핀테크 데이터 분석 기초 (이 편과 직접 연결) · STEP [K-디지털] 인공지능 자연어 처리 (3-5·3-8과 연결) |
| 강사용 자료 | 확인 문제의 채점 기준과 과제 예시 답안은 교육자용 정답 페이지 (3-6)에서 볼 수 있다 |
「3-6 시계열·주가」 편을 끝까지 읽었어요. 연구실 식구들이 한마디씩 정리해 드립니다.