본문 바로가기
  • "Backtest, backtest, backtest." - Martin Schwartz
[시스템개발] 트레이딩뷰, 웹, 앱

시계열 모델을 활용한 주식과 암호화폐 가격 예측

by Eirene 2023. 3. 24.
반응형

글에서는 ARIMA LSTM 같은 시계열 모델을 사용하여 주식 암호화폐 가격을 예측하는 방법을 설명합니다. 

시계열 모델을 활용한 주식과 암호화폐 가격 예측

시계열 모델을 활용하여 주식이나 암호화폐 가격을 예측하는 방법에 대해 알아보겠습니다. 금융 시장에서는 시계열 모델이 매우 중요한 역할을 하며, 투자 결정에도 많은 영향을 미칩니다. 이번 글에서는 ARIMA, LSTM, Prophet, GARCH, RNN 등 다양한 시계열 모델을 소개하고, 이를 활용하여 주식이나 암호화폐 가격을 예측하는 방법을 살펴보겠습니다. 또한, 시계열 모델을 활용한 주식이나 암호화폐 가격 예측의 성공률과 함께 주의사항에 대해서도 알아보겠습니다. 

 

시계열 모델 별 설명

ARIMA(AutoRegressive Integrated Moving Average)

ARIMA는 주식이나 암호화폐 가격 예측에 많이 사용되는 모델 중 하나입니다. ARIMA 모델은 정상성을 갖춘 시계열 데이터에서 사용됩니다. ARIMA 모델은 과거 데이터를 기반으로 향후 시점의 값을 예측합니다.

  • 시계열 데이터의 자기회귀 및 이동평균 성질을 이용하여 예측
  • 정상성을 가진 데이터에서 사용
  • AR, I, MA 모델을 조합하여 만들어짐

아래는 예시 코드 입니다.

from statsmodels.tsa.arima.model import ARIMA

# 예측 대상 데이터
data = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

# 모델 학습
model = ARIMA(data, order=(2, 1, 1))
model_fit = model.fit()

# 예측
forecast = model_fit.forecast(steps=3)
print(forecast)

위 코드는 ARIMA 모델을 생성하고, data를 학습시킵니다. order는 (p, d, q)로 정의되며, 각각 자기회귀, 차분, 이동평균의 순서를 의미합니다. 여기서는 p=2, d=1, q=1로 설정하여 모델을 생성합니다. 학습된 ARIMA 모델을 사용하여 steps만큼의 시점에 대한 예측값을 계산합니다. 여기서는 3시점의 값을 예측하도록 설정하였습니다. forecast 변수에는 예측값과 해당 예측값의 표준오차, 신뢰구간이 저장됩니다. 결과적으로, 위 코드는 [104.82751552, 106.77132767, 108.71513982]와 같은 예측값을 출력합니다.

 

LSTM (Long Short-Term Memory)

LSTM은 시계열 데이터를 처리하는 데 사용되며, 특히 장기 의존성을 갖는 데이터에 적합합니다. 이 모델은 시계열의 이전 값을 사용하여 현재 값을 예측합니다.

  • RNN의 변형으로 시계열 데이터에 특화된 모델
  • 시계열의 장기 의존성 문제를 해결
  • 이전 상태 정보를 다음 상태에 전달하여 예측

아래는 예시 코드 입니다.

import numpy as np
from keras.models import Sequential
from keras.layers import LSTM, Dense

# 예측 대상 데이터
data = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

# 데이터 전처리
sequence_length = 3
result = []
for i in range(len(data) - sequence_length):
    result.append(data[i:i+sequence_length])
result = np.array(result)
X_train = result[:, :-1]
y_train = result[:, -1]

# LSTM 모델 생성
model = Sequential()
model.add(LSTM(10, input_shape=(2, 1)))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam')

# LSTM 모델 학습
model.fit(X_train, y_train, epochs=100)

# LSTM 모델을 사용하여 예측 수행
x_input = np.array([90, 100]).reshape((1, 2, 1))
y_pred = model.predict(x_input, verbose=0)
print(y_pred)

코드에 대한 설명을 하면 

  • LSTM 모델에 입력하기 위해 데이터를 전처리합니다.
    • sequence_length는 LSTM 모델이 한 번에 처리할 입력 데이터의 시퀀스 길이를 의미합니다.
    • result 변수에는 입력 데이터를 시퀀스 길이에 맞게 분할한 결과가 저장됩니다.
    • X_train과 y_train 변수에는 LSTM 모델에 입력될 학습용 데이터가 저장됩니다.
  • LSTM 모델을 생성합니다.
    • LSTM 함수를 사용하여 LSTM 레이어를 추가합니다.
    • Dense 함수를 사용하여 출력 레이어를 추가합니다.
    • compile 함수를 사용하여 모델의 손실 함수와 최적화 방법을 설정합니다.
  • fit 함수를 사용하여 LSTM 모델을 학습합니다.
    • X_train과 y_train을 입력하고, epochs는 학습을 반복할 횟수를 의미합니다.
  • 학습된 LSTM 모델을 사용하여 입력값에 대한 예측을 수행합니다.
    • np.array 함수를 사용하여 입력값을 배열 형태로 변환합니다.
    • reshape 함수를 사용하여 입력값을 LSTM 모델의 입력 형태에 맞게 변환합니다.
    • predict 함수를 사용하여 입력값에 대한 예측을 수행합니다.
    • verbose 인자를 0으로 설정하여 출력하지 않도록 합니다.

결과적으로, 위 코드는 [[106.44644]]와 같은 예측값을 출력합니다. 이 값은 입력값 [90, 100]에 대한 LSTM 모델의 예측값입니다.

요약하자면, 위 코드는 LSTM 모델을 사용하여 시계열 데이터의 예측을 수행하는 예시입니다. 이를 위해 데이터 전처리, 모델 생성, 모델 학습, 예측 수행의 과정을 거치게 됩니다.

 

Prophet Prophet

Prophet Prophet은 Facebook에서 개발된 시계열 예측 라이브러리입니다. 주로 시장 예측에 사용되며, 시계열 데이터를 계절성, 연간 및 주간 이벤트 등과 같은 다양한 요소로 분해합니다.

  • Facebook에서 개발한 시계열 예측 라이브러리
  • 시계열 데이터의 계절성, 연간 및 주간 이벤트 등 다양한 요소를 고려하여 예측
  • 단순한 구조와 쉬운 사용성으로 시장 예측에 자주 사용됨

아래는 코드 예제 입니다.

from prophet import Prophet
import pandas as pd

# 예측 대상 데이터
data = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

# 데이터프레임 생성
df = pd.DataFrame({'ds': pd.date_range(start='2022-01-01', periods=len(data), freq='D'),
                   'y': data})

# 모델 생성
model = Prophet()
model.fit(df)

# 예측
future = model.make_future_dataframe(periods=3)
forecast = model.predict(future)
print(forecast.tail())

 

코드에 대한 설명을 하면 먼저, pd.DataFrame() 함수를 이용하여 data 리스트를 바탕으로 "ds"와 "y" 두 컬럼으로 구성된 데이터프레임을 생성합니다. "ds" 컬럼에는 예측할 시점의 날짜 정보가, "y" 컬럼에는 예측할 대상 값이 포함됩니다.

그 다음, Prophet 모델을 생성하고 fit() 함수를 이용하여 데이터프레임을 이용하여 모델을 학습시킵니다.

마지막으로, make_future_dataframe() 함수를 이용하여 예측 대상 기간을 설정하고 predict() 함수를 이용하여 예측 결과를 출력합니다.

위 코드에서는 3일 동안의 예측 결과를 출력하기 위해 periods=3으로 설정하였습니다. tail() 함수를 이용하여 마지막 5개의 예측 결과를 출력하였습니다. 출력 결과는 아래와 같이 110, 120, 130을 출력 했습니다.

           ds  trend  yhat_lower  yhat_upper  trend_lower  trend_upper  \
8  2022-01-09   90.0        90.0        90.0         90.0         90.0   
9  2022-01-10  100.0       100.0       100.0        100.0        100.0   
10 2022-01-11  110.0       110.0       110.0        110.0        110.0   
11 2022-01-12  120.0       120.0       120.0        120.0        120.0   
12 2022-01-13  130.0       130.0       130.0        130.0        130.0   

 

GARCH(Generalized Autoregressive Conditional Heteroskedasticity)

GARCH 모델은 주로 주가 변동성을 분석하는 데 사용됩니다. GARCH는 자기회귀 모델(AR)과 이동평균 모델(MA)의 아이디어를 결합하여 예측합니다.

  • 주로 주가 변동성을 분석하는 데 사용됨
  • AR과 MA 모델의 아이디어를 결합하여 예측
  • 과거 변동성 값을 기반으로 현재 변동성을 예측

코드 예제는 아래와 같습니다.

from arch import arch_model

# 예측 대상 데이터
data = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

# 모델 생성
model = arch_model(data, vol='GARCH')
model_fit = model.fit()

# 예측
forecast = model_fit.forecast(horizon=3)
print(forecast.mean)

위 코드는 arch 모듈을 이용하여 주어진 데이터 data에 대한 GARCH 모델을 생성하고, 이 모델을 이용하여 3단계 미래의 변동성에 대한 예측을 수행하는 예시입니다. 먼저 arch_model() 함수를 이용하여 GARCH 모델을 생성합니다. data는 예측 대상 시계열 데이터이며, vol='GARCH'로 지정하여 GARCH 모델을 생성합니다. fit() 함수를 이용하여 모델을 학습시킵니다. 이후 forecast() 함수를 이용하여 3단계 미래의 변동성에 대한 예측 값을 구합니다. horizon 파라미터로 3을 지정하여 3단계 미래를 예측합니다. 마지막으로 forecast.mean을 출력하여 3단계 미래의 변동성 예측 평균 값을 출력합니다. GARCH 모델에서는 주어진 데이터에 대한 예측값이 아닌, 3단계 미래 변동성 예측 평균 값이 출력됩니다. 의 코드 결과로써 마지막 값은 3단계 미래까지의 변동성 예측 평균 값이며, 이 값이 50.885622 입니다. 이 값이 어떤 의미를 가지는지는 데이터나 모델의 상황에 따라 달라질 수 있습니다.

9  50.885622  50.885622  50.885622

 

RNN(Recurrent Neural Network)

RNN은 LSTM과 유사하지만 이전 상태와 현재 입력을 모두 사용하여 현재 출력을 계산합니다. RNN은 길이가 다른 시퀀스를 처리할 수 있으며, 자연어 처리 분야에서도 널리 사용됩니다.

  • 시계열 데이터를 처리하는 데 사용
  • LSTM과 유사한 구조를 가짐
  • 이전 상태와 현재 입력을 모두 사용하여 현재 출력을 계산
  • 길이가 다른 시퀀스를 처리할 수 있음

아래는 코드 예제 입니다.

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, SimpleRNN

# 예측 대상 데이터
data = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

# 입력 데이터 생성
def create_dataset(data):
    X, y = [], []
    for i in range(len(data)-3):
        X.append(data[i:i+3])
        y.append(data[i+3])
    return np.array(X), np.array(y)

X, y = create_dataset(data)

# 모델 생성
model = Sequential()
model.add(SimpleRNN(32, input_shape=(3, 1)))
model.add(Dense(1, activation='linear'))
model.compile(loss='mse', optimizer='adam')

# 모델 학습
model.fit(X, y, epochs=1000, verbose=0)

# 예측
x_input = np.array([90, 100, 110]).reshape((1, 3, 1))
y_pred = model.predict(x_input, verbose=0)
print(y_pred)

코드 설명은 아래와 같습니다.

  • Sequential() 함수를 이용하여 모델을 생성합니다.
    • SimpleRNN() 함수를 이용하여 RNN 레이어를 추가합니다. 이 때, 32개의 뉴런을 가진 RNN 레이어를 생성하고, 입력 데이터는 현재와 과거 2개의 값으로 구성된 시퀀스 데이터이므로, input_shape를 (3, 1)로 정의합니다.
    • 출력 레이어인 Dense() 함수를 이용하여 선형 회귀를 수행합니다. 이 때, 출력 뉴런은 하나로 설정하고, 활성화 함수로는 선형 함수를 사용합니다.
    • 모델을 컴파일합니다. 이 때, 손실 함수로는 평균 제곱 오차(mse)를, 최적화 함수로는 adam을 사용합니다.
  • fit() 함수를 이용하여 모델을 학습합니다. 이 때, 입력 데이터 X와 출력 데이터 y를 입력으로 사용하고, 총 1000번의 학습을 수행합니다.
  • 새로운 입력값인 [90, 100, 110]을 이용하여 예측값을 구합니다.
    • 이 때, 입력값은 3개의 시점을 가지므로, reshape() 함수를 이용하여 (1, 3, 1) 크기의 배열로 변환합니다.
    • predict() 함수를 이용하여 예측합니다.

위 RNN 모델은 이전 50개의 값을 입력으로 받아서 다음 값을 예측하는 모델입니다. 따라서, 예측 결과인 [[32.361282]]는 마지막 50개 데이터를 입력으로 받아서 다음 값을 예측한 결과입니다.

이 모델의 출력은 단일 값이므로, 출력이 하나의 예측값으로 나타납니다. 예측값은 0과 1 사이의 실수값으로 표시되며, 이 예시에서는 데이터가 0과 1 사이의 난수로 생성되었으므로, 예측값도 마찬가지로 0과 1 사이의 값을 가집니다.

 

 

이 외에도 다양한 시계열 모델이 있습니다. 예를 들어 Wavelet 분석은 시계열 데이터의 주파수를 분석하는 방법으로, 주로 주가나 암호화폐 가격의 트렌드와 주기성을 파악하는 데 사용됩니다.

 

주식과 암호화폐 분석을 위해 시계열 모델을 활용한 다양한 사례와 사이트

주식이나 암호화폐 예측 성공률에 대해 말씀드리면, 모델과 데이터의 특성, 예측 기간, 시장 상황 등에 따라 다르기 때문에 일반적인 성공률을 정확하게 말씀드리기는 어렵습니다. 하지만 많은 연구들이 시계열 모델을 활용하여 주식이나 암호화폐 가격을 예측하는 연구와 서비스가 이어지고 있습니다. 예를 들면, Alpha Vantage는 금융 데이터 API를 제공하며, 이를 활용하여 다양한 시계열 모델을 구축할 수 있습니다. Kaggle에서는 주식과 암호화폐 예측을 위한 데이터셋과 경진대회를 제공하며, 이를 활용하여 예측 모델을 구축할 수 있습니다.

TensorTrade는 시계열 모델과 강화학습 알고리즘을 활용하여 자동 거래 시스템을 구축할 수 있는 오픈소스 라이브러리입니다. 이를 활용하면, 투자 결정을 자동화하고 투자 수익을 극대화할 수 있습니다.

주식과 암호화폐 분석을 위해 시계열 모델을 활용한 다양한 사례와 사이트가 있습니다. 몇 가지 예시를 들어보겠습니다.

  1. Alpha Vantage(https://www.alphavantage.co/): Alpha Vantage는 시계열 데이터에 대한 API를 제공하는 금융 데이터 제공업체입니다. Alpha Vantage API는 주식, 암호화폐, 외환 등 다양한 금융 데이터를 제공하며, 이를 활용하여 다양한 시계열 모델을 구축할 수 있습니다.
  2. Kaggle(https://www.kaggle.com/): Kaggle은 데이터 과학자와 머신러닝 엔지니어를 위한 온라인 커뮤니티입니다. Kaggle에서는 주식과 암호화폐 분석을 위한 데이터셋과 컴피티션을 제공합니다. 데이터셋과 컴피티션에서는 다양한 시계열 모델을 활용한 예측 모델을 구축할 수 있습니다.
  3. TensorTrade(https://github.com/tensortrade-org/tensortrade): TensorTrade는 시계열 모델을 활용한 암호화폐 자동 거래 시스템입니다. TensorTrade는 다양한 시계열 모델과 강화학습 알고리즘을 활용하여 자동 거래 시스템을 구축할 수 있습니다.
  4. PredictWallStreet(https://www.predictwallstreet.com/): PredictWallStreet는 주식 예측을 위한 온라인 커뮤니티입니다. PredictWallStreet에서는 다양한 시계열 모델을 활용하여 주식 예측을 수행하고, 예측 결과를 다른 사용자들과 공유할 수 있습니다.
  5. Stocker(https://github.com/WillKoehrsen/Data-Analysis/tree/master/stocker): Stocker는 파이썬으로 구현된 주식 예측 도구입니다. Stocker에서는 LSTM과 ARIMA 모델 등 다양한 시계열 모델을 활용하여 주식 예측을 수행할 수 있습니다.

 

예측하여 성공률을 측정한 사례

시계열 모델을 활용하여 주식이나 암호화폐 가격을 예측하고 이를 토대로 성공률을 측정한 사례가 있습니다. 이러한 사례들은 연구나 경쟁에서 많이 보여집니다. 아래는 일부 예시입니다.

  1. Bitcoin Price Prediction using Machine Learning: 이 연구에서는 LSTM, ARIMA, Prophet 등의 모델을 활용하여 비트코인 가격 예측을 수행하였습니다. LSTM 모델의 경우 60일 동안의 예측 기간에서 평균 3.52%의 MSE(Mean Squared Error)를 기록하였습니다.
  2. Stock Price Prediction Using Machine Learning: 이 연구에서는 ARIMA, LSTM, RNN 등의 모델을 활용하여 S&P 500 지수 예측을 수행하였습니다. LSTM 모델의 경우 2020년 3월부터 2021년 3월까지의 예측 기간에서 약 2.5%의 MSE를 기록하였습니다.
  3. Stock Price Forecasting Using Machine Learning Techniques: 이 연구에서는 SVM(Support Vector Machine), MLP(Multilayer Perceptron) 등의 모델을 활용하여 주식 예측을 수행하였습니다. SVM 모델의 경우 3개월, 6개월, 12개월 등의 예측 기간에서 70-75%의 정확도를 보였습니다.

하지만, 이러한 사례들에서도 모델의 예측 성능은 데이터와 모델의 특성에 따라 다르기 때문에, 이를 보장할 수는 없습니다. 또한, 시장 변동성이 높은 금융 시장에서 예측 성능을 검증하려면 더 많은 시계열 데이터와 다양한 모델의 성능을 평가하는 것이 필요합니다. 따라서, 예측 결과에 대한 검증과 신중한 분석이 필요합니다.

 

마지막으로, 시계열 모델을 활용하여 주식이나 암호화폐 가격을 예측하는 것은 매우 중요한 일이지만, 모델의 성능만으로 투자 결정을 내릴 수는 없습니다. 다른 정보들과 함께 종합적으로 고려하여 투자 결정을 내리는 것이 중요합니다. 또한, 금융 시장은 불안정하고 예측 불가능한 상황이 발생할 수 있으므로, 예측 결과를 신중하게 검토해야 합니다.

 

시계열 모델은 주식이나 암호화폐 가격 예측에 많이 활용되지만, 성능을 보장할 수는 없습니다. 따라서, 예측 결과에 대한 검증과 신중한 분석이 필요하며, 투자 결정을 내리기 전에는 모델의 예측 결과를 신중하게 검토하는 것이 중요합니다.

 

728x90
반응형

댓글