CONCEPTS / FOURIER TRANSFORM / STOCK MARKET APPLICATIONS
주식 시장에서 Fourier Transform(푸리에 변환) 활용하기
가상 종목의 주가를 단순 수익률로 바꾸고 평균을 제거한 뒤, DFT 스펙트럼에서 20거래일 반복 성분을 찾아 역 DFT로 복원하며 실제 시장 적용의 한계를 익힙니다.
가상 주가에서 20거래일 반복 성분 찾기
앞에서 배운 Discrete Fourier Transform(이산 푸리에 변환, DFT)을 가상 종목의 일별 주가에 적용한다. 가격을 Simple return(단순 수익률)으로 바꾸고 평균을 제거한 뒤, 가장 강한 20거래일 성분을 찾아 시간 영역으로 복원한다.
주가에 푸리에 변환을 적용하면 무엇을 알 수 있을까
주식시장에서 푸리에 변환은 관측한 값이 어떤 반복 속도로 움직였는지 요약하는 데 사용할 수 있다. 예를 들어 최근 100거래일 수익률 안에 5거래일, 20거래일 또는 더 긴 간격으로 반복된 움직임이 있었는지 Frequency domain(주파수 영역)에서 비교할 수 있다.
여기서 가장 중요한 표현은 관측한 기간 안에서다. 스펙트럼의 높은 막대는 과거 자료와 특정 기준 파동이 잘 맞았다는 뜻이지, 같은 움직임이 미래에도 계속된다는 보장은 아니다.
이 페이지에서는 원리를 분명하게 보기 위해 실제 종목이 아닌 가상 종목 QSTK 하나만 사용한다. 시작 가격은 100원이고, 100거래일 동안 평균 수익률, 20거래일 반복 성분과 더 작은 고정 변동이 함께 나타나도록 구성한다.
- 번째 거래일의 가상 Simple return(단순 수익률)
- 단위: 비율
- 1부터 100까지의 거래일 번호
- 단위: 거래일
- 20거래일 성분보다 작게 고정한 설명용 변동
- 단위: 비율
- 번째 거래일의 가상 종가
- 단위: 원/주
- 직전 거래일의 가상 종가이며 시작값은 100원
- 단위: 원/주
- 1. 가격 수준의 큰 평균 성분을 확인합니다.
- 2. 단순 수익률로 바꾸고 평균을 제거합니다.
- 3. 20거래일 성분만 남겨 시간 영역으로 되돌립니다.
현재 해석
주가 수준에는 약 100원인 평균값이 들어 있어 0번 주파수 칸이 압도적으로 큽니다. 이 상태에서는 작은 반복 성분을 읽기 어렵습니다.
- 분석 표본
- N=100
- 수익률에서 진폭이 가장 큰 성분
- k=5
- 표본 안의 반복
- 100거래일에 5회
- 한 사이클 길이
- 1사이클 = 20거래일
DC는 진폭 자체가 아니라 k=0인 평균 성분입니다. 각 성분의 진폭은 스펙트럼 막대 높이로 읽습니다. 주파수 단위로는 0.05 cycle/trading day이며, 쉽게 말하면 20거래일마다 한 번 반복한다는 뜻입니다. 평균 단순 수익률 0.050%를 제거한 뒤 비교합니다.
가상 주가의 시간 영역
주가 수준의 단측 진폭 스펙트럼
진폭 단위: 원
이 데이터는 20거래일 성분이 보이도록 만든 가상 예시입니다. 높은 막대는 과거 관측창 안의 반복을 나타낼 뿐, 다음 20거래일에도 같은 움직임이 이어진다는 예측은 아닙니다.
주가 수준을 바로 변환하면 평균 가격이 먼저 보인다
첫 번째 단계의 주가 그래프는 투자자가 평소 보는 가격의 움직임과 닮았다. 그러나 Price level(가격 수준)에는 약 100원이라는 큰 평균값과 시간이 지나며 누적된 변화가 함께 들어 있다.
DFT에서 은 시간이 지나도 변하지 않는 DC component(직류 성분), 즉 전체 평균을 나타낸다. DC라는 이름은 진폭의 크기가 아니라 주파수가 0인 성분을 뜻한다. 다만 스펙트럼에서 0번 막대의 높이는 이 DC 성분의 진폭을 보여 주며, 이 페이지의 단측 진폭 계산에서는 전체 평균 가격과 대응한다. 가격 수준을 바로 변환하면 이 막대가 다른 주파수 성분보다 훨씬 커진다. 작은 반복이 없어지는 것은 아니지만, 평균 가격과 완만한 추세 아래에 묻혀 읽기 어려워진다.
이 때문에 주식 분석에서는 가격 자체보다 한 거래일 동안 가격이 몇 퍼센트 변했는지를 먼저 보는 경우가 많다.
가격을 단순 수익률로 바꾼다
Simple return(단순 수익률)은 직전 가격에 비해 현재 가격이 얼마나 변했는지 나타낸다.
- 거래일에서 거래일까지의 Simple return(단순 수익률)
- 단위: 비율
- 번째 거래일의 종가
- 단위: 원/주
- 직전 거래일의 종가
- 단위: 원/주
예를 들어 가격이 100원에서 101원이 되었다면 단순 수익률은 0.01, 즉 1%다. 반대로 100원에서 99원이 되었다면 -0.01, 즉 -1%다. 로그수익률을 사용하지 않아도 DFT는 이 수익률 숫자 배열을 그대로 주파수별로 분리할 수 있다.
실제 자료에서는 Raw close(원시 종가)를 그대로 사용하지 않는다. Stock split(주식분할)과 Dividend(배당)가 가격을 기계적으로 바꿀 수 있으므로, 분석 목적과 데이터 공급자의 정의를 확인한 Adjusted price(조정 가격)에서 수익률을 계산해야 한다.
평균 수익률을 빼고 반복되는 변화에 집중한다
수익률에도 전체 기간의 평균 상승분이 들어 있다. 이 평균은 다시 성분이 되므로, 반복 성분을 비교하기 전에 Mean centering(평균 중심화)을 적용한다.
- 전체 관측창의 평균 단순 수익률
- 단위: 비율
- 분석에 사용하는 수익률 표본 수이며 현재 예제에서는 100
- 단위: 개
- 번째 거래일의 단순 수익률
- 단위: 비율
- 평균 수익률을 제거한 번째 표본
- 단위: 비율
두 번째 단계에서는 평균이 0에 가까워지고, 양수와 음수 변화가 0선을 중심으로 오간다. 이 값을 DFT에 넣으면 가격 단위가 아니라 수익률의 반복 속도를 비교할 수 있다.
주파수 칸을 거래일 주기로 바꿔 읽는다
중심화한 수익률 의 푸리에 계수는 앞 장과 같은 방법으로 계산한다. 다만 일별 금융 자료에서는 주파수 단위를 Hertz(헤르츠, Hz)로 부르지 않는다. 하루에 몇 번 반복하는지가 아니라 거래일당 몇 번 반복하는지를 나타내기 때문이다.
- 번째 Frequency bin(주파수 칸)의 푸리에 계수
- 단위: 수익률
- 평균을 제거한 번째 단순 수익률 표본
- 단위: 비율
- 을 만족하는 Imaginary unit(허수 단위)
- 단위: 없음
- 분석에 사용하는 전체 수익률 표본 수
- 단위: 개
- 0부터 까지의 주파수 칸 번호
- 단위: 없음
- 번째 성분의 Frequency(주파수). 예를 들어 0.05는 20거래일마다 한 번 반복한다는 뜻
- 단위: cycle/trading day(거래일당 사이클 수)
- 번째 성분이 한 번 반복하는 데 걸리는 Period(주기)
- 단위: 거래일
현재 예제는 이다. 평균을 제거한 수익률에서 **진폭이 가장 큰 반복 성분은 **다. 먼저 100거래일 안에서 5번 반복한다고 읽으면 쉽다. 그러면 한 사이클의 길이는 거래일이다. 이를 주파수 단위로 쓰면 0.05 cycle/trading day지만, 일상적인 말로는 20거래일마다 한 번 반복한다는 뜻이다.
라는 숫자 자체가 5거래일 주기를 뜻하지 않는다. 주기는 반드시 전체 표본 수와 함께 로 계산해야 한다.
5번과 95번 계수만 남겨 20거래일 성분을 복원한다
실수로 이루어진 수익률에서는 양의 주파수 와 켤레인 가 한 쌍을 이룬다. 세 번째 단계는 이 두 계수만 남기고 나머지를 0으로 만든 뒤 Inverse DFT(역 이산 푸리에 변환)를 적용한다.
- 20거래일 성분만 남긴 번째 푸리에 계수
- 단위: 수익률
- 중심화 수익률에서 계산한 원래 번째 푸리에 계수
- 단위: 수익률
- 주파수 칸 번호
- 단위: 없음
- 20거래일 성분만 시간 영역으로 복원한 번째 값
- 단위: 비율
- 전체 수익률 표본 수이며 현재 예제에서는 100
- 단위: 개
- 0부터 까지의 거래일 표본 번호
- 단위: 없음
- Imaginary unit(허수 단위)
- 단위: 없음
복원한 선은 원래 수익률을 그대로 예측한 값이 아니다. 여러 움직임이 섞인 수익률에서 “20거래일 간격과 맞는 부분만 남기면 어떤 모양인가?”를 보여 주는 설명이다.
실제 시장에서는 발견보다 검증이 더 중요하다
푸리에 변환은 시장 자료를 살펴보는 유용한 렌즈지만, 높은 스펙트럼 막대만으로 매매 규칙을 만들 수는 없다.
- Observation window(관측창): 시작일과 종료일을 바꾸면 표본 수 , 주파수 칸과 가장 강한 주기가 함께 달라질 수 있다.
- Spectral leakage(스펙트럼 누출): 실제 반복이 관측창 안에 정확히 정수 번 들어맞지 않으면 에너지가 여러 주파수 칸으로 퍼진다.
- Regime change(시장 국면 변화): 한 기간에 강했던 반복이 변동성, 유동성 또는 참여자 행동이 바뀐 뒤 사라질 수 있다.
- Look-ahead bias(미래정보 편향): 전체 기간을 보고 가장 좋은 주기를 고른 뒤 같은 기간의 성과를 평가하면 미래 자료로 규칙을 선택한 셈이 된다.
- Execution(주문 실행): 당일 종가까지 사용해 수익률을 계산했다면 그 종가보다 앞선 시점에 신호를 안 것으로 처리할 수 없다.
실제 연구에서는 각 시점까지 이용할 수 있었던 과거 자료만으로 Rolling window(이동 관측창)의 스펙트럼을 계산하고, 다음 구간의 Out-of-sample performance(표본외 성과)를 거래비용과 함께 검증해야 한다. 이 과정을 통과하기 전까지 20거래일 성분은 발견한 과거 패턴이지 검증된 예측 신호가 아니다.
왜 가격 대신 단순 수익률을 사용했는가?
가격 수준의 큰 평균값과 누적 추세가 스펙트럼을 지배하지 않게 하고, 서로 다른 가격대의 종목도 비율 변화라는 같은 단위로 비교하기 위해서다.
로그수익률이 아니어도 푸리에 변환을 적용할 수 있는가?
가능하다. DFT는 유한한 숫자 배열을 입력으로 받으므로 단순 수익률도 그대로 사용할 수 있다. 이 페이지는 가격 변화율을 직관적으로 해석하기 위해 단순 수익률을 선택했다.
20거래일 막대가 가장 높으면 다음 달에도 같은 주기가 반복되는가?
아니다. 현재 관측창에서 해당 기준 파동과 가장 잘 맞았다는 뜻뿐이다. 과거 자료만 사용하는 이동 관측창과 별도의 표본외 기간에서 반복성과 거래 가능성을 다시 검증해야 한다.