다항회귀모형을 이용한 주가 예측

2020. 7. 15. 21:50금융 데이터 분석

반응형

지난번 포스팅에서 단순 회귀를 이용하여 주가의 추세를 분석해 보았습니다. 하지만 단순 회귀는 선형적으로만 추세를 추정하기 때문에 비선형성을 전혀 반영할 수 없었습니다.

그렇기 때문에 이번에는 비선형성을 반영할 수 있는 다항회귀모형(Polynomial Regression)을 활용하여 주가를 분석해 보도록 하겠습니다.

기본 단순 회귀 모형이 Y= αX+β의 모습을 가졌다면 다항회귀모형은 아래와 같은 모습을 가졌습니다.

기존의 독립변수 X를 제곱한 값을 또 하나의 독립 변수로 활용하는 것입니다. 이렇게 되면 독립변수 X와 종속변수 y간의 비선형적인 관계도 분석할 수 있게 됩니다.

단순회귀모형 포스팅(https://direction-f.tistory.com/8)에서와 마찬가지로 필요한 Module과 수집한 삼성전자 주가 데이터를 불러오도록 하겠습니다.

import statsmodels.api as sm
import statsmodels.formula.api as smf
import numpy as np
import pandas as pd
import os
import matplotlib.pyplot as plt
os.chdir(".../stock_price")

data = pd.read_csv("samsung.csv")

## 시간 Column 추가
data["time"]=data.sort_index(ascending=False).index+1
data.rename(columns ={"종가":"Close"}, inplace =True) ## 이름 변경

이번에는 다항회귀를 위하여 추가적으로 time의 제곱값이 입력된 Column을 추가하고 Train Set과 Test Set을 분리하도록 하겠습니다.

## time*time Column 추가
data["timebytime"]=data["time"]*data["time"]

## Train, test set 분리
train_data =data.loc[data.time <= 400][["Close", "time", "timebytime"]]
print(len(train_data))
test_data =data.loc[data.time > 400][["Close", "time","timebytime"]]
print(len(test_data))

분리한 Train Set을 이용하여 회귀모형을 구성해보도록 하겠습니다.

## Input Data 만들기
Close_tr = train_data["Close"]
time_tr = train_data[["time", "timebytime"]]
time_tr = sm.add_constant(time_tr)

## 회귀분석 수행
mod = sm.OLS(Close_tr, time_tr)
res = mod.fit()
print(res.summary())

모델을 분석한 Summary를 출력해보면 time과 timebytime모두 유의함을 확인 할 수 있습니다.

그렇다면 해당 모형을 이용하여 예측값과 Train Set의 실제값과의 추세를 분석해 보겠습니다.

train_result=res.predict(time_tr)
plt.plot(train_data["time"], train_result, label = "Predict")
plt.plot(train_data["time"], Close_tr, label = "Real")
plt.xlabel("time")
plt.ylabel("Close")
plt.legend()
plt.title("Real vs Predict")
plt.show()

단순회귀를 썼을 때보다 예측값이 훨씬 더 실제 값과 일치함을 확인할 수 있습니다.

이제 Test Set의 실제값과 예측값을 비교해보겠습니다.

test_result=res.predict(time_test)
plt.plot(test_data["time"], test_result, label = "Predict")
plt.plot(test_data["time"], Close_test, label = "Real")
plt.xlabel("time")
plt.ylabel("Close")
plt.legend()
plt.title("Real vs Predict")
plt.show(

예측값은 단순 회귀보다도 오히려 추세를 잘 설명하지 못하고 있음을 확인할 수 있습니다. 이와 같이 독립변수를 단순히 Polynomial형태로 늘린다고 Test 결과 값이 좋아지지는 않음을 확인할 수 있습니다. 

우리가 다항회귀를 활용할 때 주의해야 하는 것이 바로 Train Set에만 잘 Fitting이 되는 Over-Fitting 문제입니다. 그렇기 때문에 적절한 모형을 선택하는 것은 데이터에 따라 달라져야 함을 확인 할 수 있습니다.

반응형