Q

PRIVATE NAVIGATION MODE

ML4T 탭 잠금 해제

패스워드를 확인하면 이 브라우저에서 ML4T 탭과 검색 결과를 표시합니다.

STUDY SEARCH

학습 자료 검색

제목과 설명, 키워드, 학습 본문에서 찾습니다.

검색 범위

검색어를 입력해 주세요.

SEARCH THE NOTEBOOK

찾고 싶은 금융·통계·전략 개념을 입력해 보세요.

CONCEPTS / FOURIER TRANSFORM / STOCK MARKET APPLICATIONS

주식 시장에서 Fourier Transform(푸리에 변환) 활용하기

가상 종목의 주가를 단순 수익률로 바꾸고 평균을 제거한 뒤, DFT 스펙트럼에서 20거래일 반복 성분을 찾아 역 DFT로 복원하며 실제 시장 적용의 한계를 익힙니다.

Fourier Transform(푸리에 변환)초급 학습 노트

가상 주가에서 20거래일 반복 성분 찾기

앞에서 배운 Discrete Fourier Transform(이산 푸리에 변환, DFT)을 가상 종목의 일별 주가에 적용한다. 가격을 Simple return(단순 수익률)으로 바꾸고 평균을 제거한 뒤, 가장 강한 20거래일 성분을 찾아 시간 영역으로 복원한다.

주가에 푸리에 변환을 적용하면 무엇을 알 수 있을까

주식시장에서 푸리에 변환은 관측한 값이 어떤 반복 속도로 움직였는지 요약하는 데 사용할 수 있다. 예를 들어 최근 100거래일 수익률 안에 5거래일, 20거래일 또는 더 긴 간격으로 반복된 움직임이 있었는지 Frequency domain(주파수 영역)에서 비교할 수 있다.

여기서 가장 중요한 표현은 관측한 기간 안에서다. 스펙트럼의 높은 막대는 과거 자료와 특정 기준 파동이 잘 맞았다는 뜻이지, 같은 움직임이 미래에도 계속된다는 보장은 아니다.

이 페이지에서는 원리를 분명하게 보기 위해 실제 종목이 아닌 가상 종목 QSTK 하나만 사용한다. 시작 가격은 100원이고, 100거래일 동안 평균 수익률, 20거래일 반복 성분과 더 작은 고정 변동이 함께 나타나도록 구성한다.

Rt=0.0005+0.008cos(2πt20)+εt,Pt=Pt1(1+Rt).\begin{aligned} R_t &=0.0005 +0.008\cos\left(2\pi\frac{t}{20}\right) +\varepsilon_t,\\ P_t &=P_{t-1}\left(1+R_t\right). \end{aligned}
RtR_t
tt번째 거래일의 가상 Simple return(단순 수익률)
단위: 비율
tt
1부터 100까지의 거래일 번호
단위: 거래일
εt\varepsilon_t
20거래일 성분보다 작게 고정한 설명용 변동
단위: 비율
PtP_t
tt번째 거래일의 가상 종가
단위: 원/주
Pt1P_{t-1}
직전 거래일의 가상 종가이며 시작값은 100원
단위: 원/주
INTERACTIVE STUDY TOOL주가에서 20거래일 반복 성분 찾기가상 종목 QSTK의 같은 100거래일을 주가, 단순 수익률, 선택한 주기 성분으로 차례대로 바꾸어 봅니다.
같은 데이터를 어떤 단계에서 볼까?
  1. 1. 가격 수준의 큰 평균 성분을 확인합니다.
  2. 2. 단순 수익률로 바꾸고 평균을 제거합니다.
  3. 3. 20거래일 성분만 남겨 시간 영역으로 되돌립니다.

현재 해석

주가 수준에는 약 100원인 평균값이 들어 있어 0번 주파수 칸이 압도적으로 큽니다. 이 상태에서는 작은 반복 성분을 읽기 어렵습니다.

분석 표본
N=100
수익률에서 진폭이 가장 큰 성분
k=5
표본 안의 반복
100거래일에 5회
한 사이클 길이
1사이클 = 20거래일

DC는 진폭 자체가 아니라 k=0인 평균 성분입니다. 각 성분의 진폭은 스펙트럼 막대 높이로 읽습니다. 주파수 단위로는 0.05 cycle/trading day이며, 쉽게 말하면 20거래일마다 한 번 반복한다는 뜻입니다. 평균 단순 수익률 0.050%를 제거한 뒤 비교합니다.

가상 주가의 시간 영역

QSTK 가상 주가
가상 주가의 시간 영역100거래일 동안 움직이는 가상 종목 QSTK의 가격입니다.108원105원102원100원97원120406080100거래일

주가 수준의 단측 진폭 스펙트럼

진폭 단위: 원

주가 수준의 단측 진폭 스펙트럼0번 주파수 칸의 평균 가격 성분이 다른 주파수 칸보다 크게 나타납니다.0.051.1102.205101520주파수 칸 k

이 데이터는 20거래일 성분이 보이도록 만든 가상 예시입니다. 높은 막대는 과거 관측창 안의 반복을 나타낼 뿐, 다음 20거래일에도 같은 움직임이 이어진다는 예측은 아닙니다.

주가 수준을 바로 변환하면 평균 가격이 먼저 보인다

첫 번째 단계의 주가 그래프는 투자자가 평소 보는 가격의 움직임과 닮았다. 그러나 Price level(가격 수준)에는 약 100원이라는 큰 평균값과 시간이 지나며 누적된 변화가 함께 들어 있다.

DFT에서 k=0k=0은 시간이 지나도 변하지 않는 DC component(직류 성분), 즉 전체 평균을 나타낸다. DC라는 이름은 진폭의 크기가 아니라 주파수가 0인 성분을 뜻한다. 다만 스펙트럼에서 0번 막대의 높이는 이 DC 성분의 진폭을 보여 주며, 이 페이지의 단측 진폭 계산에서는 전체 평균 가격과 대응한다. 가격 수준을 바로 변환하면 이 막대가 다른 주파수 성분보다 훨씬 커진다. 작은 반복이 없어지는 것은 아니지만, 평균 가격과 완만한 추세 아래에 묻혀 읽기 어려워진다.

이 때문에 주식 분석에서는 가격 자체보다 한 거래일 동안 가격이 몇 퍼센트 변했는지를 먼저 보는 경우가 많다.

가격을 단순 수익률로 바꾼다

Simple return(단순 수익률)은 직전 가격에 비해 현재 가격이 얼마나 변했는지 나타낸다.

Rt=PtPt1Pt1.R_t=\frac{P_t-P_{t-1}}{P_{t-1}}.
RtR_t
t1t-1 거래일에서 tt 거래일까지의 Simple return(단순 수익률)
단위: 비율
PtP_t
tt번째 거래일의 종가
단위: 원/주
Pt1P_{t-1}
직전 거래일의 종가
단위: 원/주

예를 들어 가격이 100원에서 101원이 되었다면 단순 수익률은 0.01, 즉 1%다. 반대로 100원에서 99원이 되었다면 -0.01, 즉 -1%다. 로그수익률을 사용하지 않아도 DFT는 이 수익률 숫자 배열을 그대로 주파수별로 분리할 수 있다.

실제 자료에서는 Raw close(원시 종가)를 그대로 사용하지 않는다. Stock split(주식분할)과 Dividend(배당)가 가격을 기계적으로 바꿀 수 있으므로, 분석 목적과 데이터 공급자의 정의를 확인한 Adjusted price(조정 가격)에서 수익률을 계산해야 한다.

평균 수익률을 빼고 반복되는 변화에 집중한다

수익률에도 전체 기간의 평균 상승분이 들어 있다. 이 평균은 다시 k=0k=0 성분이 되므로, 반복 성분을 비교하기 전에 Mean centering(평균 중심화)을 적용한다.

R=1Nt=1NRt,yt=RtR.\begin{aligned} \overline{R} &=\frac{1}{N}\sum_{t=1}^{N}R_t,\\ y_t &=R_t-\overline{R}. \end{aligned}
R\overline{R}
전체 관측창의 평균 단순 수익률
단위: 비율
NN
분석에 사용하는 수익률 표본 수이며 현재 예제에서는 100
단위: 개
RtR_t
tt번째 거래일의 단순 수익률
단위: 비율
yty_t
평균 수익률을 제거한 tt번째 표본
단위: 비율

두 번째 단계에서는 평균이 0에 가까워지고, 양수와 음수 변화가 0선을 중심으로 오간다. 이 값을 DFT에 넣으면 가격 단위가 아니라 수익률의 반복 속도를 비교할 수 있다.

주파수 칸을 거래일 주기로 바꿔 읽는다

중심화한 수익률 yny_n의 푸리에 계수는 앞 장과 같은 방법으로 계산한다. 다만 일별 금융 자료에서는 주파수 단위를 Hertz(헤르츠, Hz)로 부르지 않는다. 하루에 몇 번 반복하는지가 아니라 거래일당 몇 번 반복하는지를 나타내기 때문이다.

Xk=n=0N1ynei2πknN,fk=kN,Lk=1fk=Nk.\begin{aligned} X_k &=\sum_{n=0}^{N-1}y_n e^{-i\frac{2\pi kn}{N}},\\ f_k &=\frac{k}{N},\\ L_k &=\frac{1}{f_k}=\frac{N}{k}. \end{aligned}
XkX_k
kk번째 Frequency bin(주파수 칸)의 푸리에 계수
단위: 수익률
yny_n
평균을 제거한 nn번째 단순 수익률 표본
단위: 비율
ii
i2=1i^2=-1을 만족하는 Imaginary unit(허수 단위)
단위: 없음
NN
분석에 사용하는 전체 수익률 표본 수
단위: 개
kk
0부터 N1N-1까지의 주파수 칸 번호
단위: 없음
fkf_k
kk번째 성분의 Frequency(주파수). 예를 들어 0.05는 20거래일마다 한 번 반복한다는 뜻
단위: cycle/trading day(거래일당 사이클 수)
LkL_k
kk번째 성분이 한 번 반복하는 데 걸리는 Period(주기)
단위: 거래일

현재 예제는 N=100N=100이다. 평균을 제거한 수익률에서 **진폭이 가장 큰 반복 성분은 k=5k=5**다. 먼저 100거래일 안에서 5번 반복한다고 읽으면 쉽다. 그러면 한 사이클의 길이는 100÷5=20100\div5=20거래일이다. 이를 주파수 단위로 쓰면 0.05 cycle/trading day지만, 일상적인 말로는 20거래일마다 한 번 반복한다는 뜻이다.

k=5k=5라는 숫자 자체가 5거래일 주기를 뜻하지 않는다. 주기는 반드시 전체 표본 수와 함께 N/kN/k로 계산해야 한다.

5번과 95번 계수만 남겨 20거래일 성분을 복원한다

실수로 이루어진 수익률에서는 양의 주파수 X5X_5와 켤레인 X95X_{95}가 한 쌍을 이룬다. 세 번째 단계는 이 두 계수만 남기고 나머지를 0으로 만든 뒤 Inverse DFT(역 이산 푸리에 변환)를 적용한다.

X~k={Xk,k{5,95},0,그 밖의 k,y~n=1Nk=0N1X~kei2πknN.\begin{aligned} \widetilde{X}_k &= \begin{cases} X_k, & k\in\{5,95\},\\ 0, & \text{그 밖의 }k, \end{cases}\\ \widetilde{y}_n &=\frac{1}{N}\sum_{k=0}^{N-1} \widetilde{X}_k e^{i\frac{2\pi kn}{N}}. \end{aligned}
X~k\widetilde{X}_k
20거래일 성분만 남긴 kk번째 푸리에 계수
단위: 수익률
XkX_k
중심화 수익률에서 계산한 원래 kk번째 푸리에 계수
단위: 수익률
kk
주파수 칸 번호
단위: 없음
y~n\widetilde{y}_n
20거래일 성분만 시간 영역으로 복원한 nn번째 값
단위: 비율
NN
전체 수익률 표본 수이며 현재 예제에서는 100
단위: 개
nn
0부터 N1N-1까지의 거래일 표본 번호
단위: 없음
ii
Imaginary unit(허수 단위)
단위: 없음

복원한 선은 원래 수익률을 그대로 예측한 값이 아니다. 여러 움직임이 섞인 수익률에서 “20거래일 간격과 맞는 부분만 남기면 어떤 모양인가?”를 보여 주는 설명이다.

실제 시장에서는 발견보다 검증이 더 중요하다

푸리에 변환은 시장 자료를 살펴보는 유용한 렌즈지만, 높은 스펙트럼 막대만으로 매매 규칙을 만들 수는 없다.

  • Observation window(관측창): 시작일과 종료일을 바꾸면 표본 수 NN, 주파수 칸과 가장 강한 주기가 함께 달라질 수 있다.
  • Spectral leakage(스펙트럼 누출): 실제 반복이 관측창 안에 정확히 정수 번 들어맞지 않으면 에너지가 여러 주파수 칸으로 퍼진다.
  • Regime change(시장 국면 변화): 한 기간에 강했던 반복이 변동성, 유동성 또는 참여자 행동이 바뀐 뒤 사라질 수 있다.
  • Look-ahead bias(미래정보 편향): 전체 기간을 보고 가장 좋은 주기를 고른 뒤 같은 기간의 성과를 평가하면 미래 자료로 규칙을 선택한 셈이 된다.
  • Execution(주문 실행): 당일 종가까지 사용해 수익률을 계산했다면 그 종가보다 앞선 시점에 신호를 안 것으로 처리할 수 없다.

실제 연구에서는 각 시점까지 이용할 수 있었던 과거 자료만으로 Rolling window(이동 관측창)의 스펙트럼을 계산하고, 다음 구간의 Out-of-sample performance(표본외 성과)를 거래비용과 함께 검증해야 한다. 이 과정을 통과하기 전까지 20거래일 성분은 발견한 과거 패턴이지 검증된 예측 신호가 아니다.

왜 가격 대신 단순 수익률을 사용했는가?

가격 수준의 큰 평균값과 누적 추세가 스펙트럼을 지배하지 않게 하고, 서로 다른 가격대의 종목도 비율 변화라는 같은 단위로 비교하기 위해서다.

로그수익률이 아니어도 푸리에 변환을 적용할 수 있는가?

가능하다. DFT는 유한한 숫자 배열을 입력으로 받으므로 단순 수익률도 그대로 사용할 수 있다. 이 페이지는 가격 변화율을 직관적으로 해석하기 위해 단순 수익률을 선택했다.

20거래일 막대가 가장 높으면 다음 달에도 같은 주기가 반복되는가?

아니다. 현재 관측창에서 해당 기준 파동과 가장 잘 맞았다는 뜻뿐이다. 과거 자료만 사용하는 이동 관측창과 별도의 표본외 기간에서 반복성과 거래 가능성을 다시 검증해야 한다.