[환율 예측 모델] 기초 모델 설계하기

저번 글에서는 기초 모델을 설계하기 위한

다양한 파이썬 라이브러리들에 대해 알아보았다.

이번 글에서는 실제로 라이브러리를 사용하여

환율을 예측하는 기초 모델을 설계하고자 한다.


1. 데이터 수집

import yfinance as yf # Yahoo Finance에서 금융 데이터 다운로드
import pandas as pd # 데이터 조작 및 분석을 위한 라이브러리
from sklearn.linear_model import LinearRegression # 선형 회귀 모델
import matplotlib.pyplot as plt # 데이터 시각화 라이브러리

# 1. 데이터 수집
print("data loading...")
df = yf.download('KRW=X', start='2020-01-01') # 데이터 불러오기
print(df.head()) # head() 메서드로 데이터프레임의 처음 5행 출력

 

저번 글에서 학습했던 파이썬 라이브러리들을 import하여 불러온다.

 

먼저, yf 라이브러리를 사용하여 Yahoo Finance로부터 금융 데이터를 다운받아야 한다.

download() 함수를 사용하여

'KRW=X'(원/달러 환율), 'start = 2020-01-01'(2020년 1월 1부터의 데이터)로 설정하고,

df 변수에 데이터를 dataframe 형태로 저장한다.

head() 함수를 사용하여 df(데이터프레임)의 첫 5행만을 추출하여 출력한다.

즉 2020년 1월 1일 데이터부터 1월 2일, 3일, 6일, 7일 데이터가 출력된다.(주말 공휴일에는 금융시장 휴무)


2. 데이터 전처리

# 2. 데이터 전처리
df_ml = df[['Close']].copy() # 'Close' 열만 선택하여 복사
df_ml['Yesterday'] = df_ml['Close'].shift(1) # 'Yesterday' 열 추가 (전일 종가)
df_ml = df_ml.dropna() # 결측치 제거
print(df_ml.head()) # head() 메서드로 데이터프레임의 처음 5행 출력

 

앞서 만든 df(데이터 프레임)을 전처리하는 단계다.

먼저, 'Close' 열을 선택하여 copy()함수를 통해 복사하여 전처리된 데이터프레임 변수 df_ml에 저장한다.

'Close'열은 장이 마감될 때 결정된 최종가격인 종가 열이다.

보통 예측 모델을 만들 때 종가를 기준으로 하기 때문에 선택했다.

 

그리고, Yesterday라는 열을 추가해야한다.

Yesterday 열은 전날 환율을 표시하는 역할을 하게된다.

환율을 예측하는 모델을 설계해야 하므로

미래를 예측하기 위해 과거의 데이터를 참고하는 것이다.

즉, 어제의 환율 데이터를 보고 오늘 환율을 예측하기 위해 Yesterday(전날 환율) 열을 추가한다.

전날 종가를 가져오는 방법은 간단하다.

데이터 프레임상 한 칸 위의 데이터(전날 데이터)를 가져오면 된다.

shift(1)을 통해 프레임 상 한 칸 위의 데이터를 가져올 수 있다.

 

하지만 한가지 문제점이 있다.

1월 1일 이전 환율 데이터는 불러오지 않았기 때문에

NaN이라는 값이 표시된다.

이를 해결하기 위해 dropna() 함수를 사용하여 결측치 제거 작업을 진행한다.

그다음 5행만 출력해주면 2일, 3일, 6일, 7일, 8일의 Close열과 Yesterday열을 담은

데이터 프레임이 출력된다.


3. 데이터 나누기(학습용, 테스트용)

# 3. 데이터 나누기(학습용, 테스트용)
x = df_ml[['Yesterday']] # 독립 변수
y = df_ml['Close'] # 종속 변수
print(f"전체 데이터 개수: {len(df_ml)}") # 전체 데이터 개수 출력

split_count = int(len(x) * 0.8) # 80%를 학습용 데이터로 사용
x_train = x[:split_count] # 학습용 독립 변수(0 ~ 80%)
y_train = y[:split_count] # 학습용 종속 변수
x_test = x[split_count:] # 테스트용 독립 변수(80% ~ 100%)
y_test = y[split_count:] # 테스트용 종속 변수
print(f"학습용 데이터 개수: {len(x_train)}") # 학습용 데이터 개수 출력
print(f"테스트용 데이터 개수: {len(x_test)}") # 테스트용 데이터 개수 출력

 

이제 전처리된 데이터 프레임 df_ml을

학습용과 테스트용 데이터셋으로 분리하는 작업을 진행한다.

만약 분리하는 작업을 거치지 않는다면,

학습 모델이 훈련 데이터셋을 단순히 암기해버려

과적합(Overfitting) 현상이 발생할 가능성이 높아진다.

 

Yesterday(전날 종가)를 독립 변수(x)로,

Close(당일 종가)를 종속 변수(y)로 설정해주고,

훈련용 80%, 테스트용 20%로 나누기 위해 전체 데이터 개수를 계산한다.

 

금융 데이터는 시계열 데이터(Time Series)이기 때문에

시간 순서대로 split해야 한다.

즉, 순서대로 자르기 위해서 split_count(자르는 기준점)(여기서는 80% 지점)을 설정해준다.

그다음, x_train, y_train(학습 데이터)

x_test, y_test(테스트 데이터)를 split_count를 사용하여 나눠준다.


4. 모델 학습

# 4. 모델 학습
model = LinearRegression() # 선형 회귀 모델 생성
model.fit(x_train, y_train) # 모델 학습
print("model trained") # 모델 학습 완료 메시지 출력

 

이 글의 기초 모델에서는 선형 회귀 모델을 사용하여 학습한다.

LinearRegression()을 통해 선형 회귀 모델을 생성한다.

선형 회귀 모델에 앞서 만들었던 x_train(독립변수 학습 데이터)과 y_train(종속변수 학습 데이터)

를 fit()을 통해 학습시킨다.


5. 모델 평가(분석 및 시각화)

# 5. 모델 평가
y_pred = model.predict(x_test) # 테스트용 데이터로 예측 수행

plt.figure(figsize=(10, 6)) # 그래프 크기 설정
plt.plot(y_test.index, y_test, label='Actual(Real)', color='blue') # 실제 값 그래프
plt.plot(y_test.index, y_pred, label='Predicted(Model)', color='red') # 예측 값 그래프
plt.legend() # 범례 표시
plt.title("KRW Exchange Rate Prediction") # 그래프 제목
plt.xlabel("Date") # x축 라벨
plt.ylabel("Exchange Rate (KRW)") # y축 라벨
plt.show() # 그래프 출력
print("model evaluated") # 모델 평가 완료 메시지 출력

print(f"모델 점수(R-squared): {model.score(x_test, y_test):.4f}") # 모델의 결정 계수 출력

 

마지막으로 학습시킨 모델을 평가하는 단계다.

이 과정은 예측과 평가, 두 단계로 나뉜다.

predict() 함수를 통해 x_test(독립변수 테스트 데이터)를 입력하여 실제 예측을 하도록 만든다.

 

다음으로 matplotlib 라이브러리를 활용하여 예측치를 시각화하는 작업을 진행한다.

figure()을 통해 그래프 크기를 설정하고(도화지 역할),

plot()을 통해 그래프를 그려준다.

실제 값 그래프는 x축을 y_test.index(날짜) y축을 y_test(실제 환율)로 설정하고,

예측 값 그래프는 x축은 동일, y축은 y_pred(예측 환율)로 설정해준다.

label로 이름표도 설정해주고, color을 다르게 설정하여 얼마나 잘 예측했는지도 보여주게 설정한다.

legend()를 통해 범례를 표시하고,

title()을 통해 제목을, xlabel(), ylabel()을 통해 x축 y축 내용을 표시해준 다음

show()를 통해 그래프를 출력한다.

 

마지막으로 사이킷런(scikit-learn)에는 모델 예측 정확도를 계산해주는 기능도 있는데,

score()을 통해 모델의 결정 계수를 출력한다.


이번 글에서는 기초 예측 모델을 완성해보았다.

하지만 아직 부족한 점이 너무 많다.

대략 이런 느낌으로 전체적인 학습과 예측이 이루어진다는 것은 알게 되었다.

공부한 내용을 바탕으로 앞으로는

어떻게 하면 더 정교한 예측 모델을 만들 수 있을지 풀어나갈 예정이다.

'AI' 카테고리의 다른 글

[환율 예측 모델] 기초 파이썬 라이브러리  (0) 2026.01.08