[인공지능] ARIMA -주가 예측 모델: 3-6-9개월 후 AMZN 주가 확인 -
[인공지능] ARIMA -주가 예측 모델 : 3-6-9개월 후 "AMZN" 주가는 어떻게 될까요
인터넷 검색 도구를 사용하여 아마존 주식의 과거 데이터를 수집하고 모델을 학습하여 주식을 예측 라는 방법입니다.
1. 데이터 수집
아마존 주식의 과거 데이터를 수집하기 위해 다음과 같은 웹사이트를 사용할 수 있습니다:
Yahoo Finance: Yahoo Finance - Amazon
Google Finance: Google Finance - Amazon
Bloomberg: Bloomberg - Amazon
이 웹사이트에서 데이터를 CSV 파일로 다운로드할 수 있습니다.
. 먼저, Yahoo Finance에서 아마존 주식 데이터를 CSV 파일 형식으로 다운로드합니다.
. Yahoo Finance - Amazon로 이동합니다.
. 페이지 하단에 있는 "Download Data" 버튼을 클릭하여 CSV 파일을 다운로드합니다.
https://query1.finance.yahoo.com/v7/finance/download/AMZN?period1=1691730584&period2=1723352984&interval=1d&events=history&includeAdjustedClose=true
2. 데이터 전처리
Python을 사용하여 데이터를 전처리할 수 있습니다. 예를 들어, Pandas 라이브러리를 사용하여 결측치와 이상치를 처리하고 데이터를 정규화할 수 있습니다.
import pandas as pd
# 데이터 로드
data = pd.read_csv('amazon_stock_data.csv')
# 결측치 처리
data = data.dropna()
# 이상치 처리 (예: Z-Score를 사용하여 이상치 제거)
from scipy import stats
data = data[(np.abs(stats.zscore(data['Close'])) < 3)]
# 데이터 정규화
data['Close'] = (data['Close'] - data['Close'].mean()) / data['Close'].std()
3. 데이터 분석
기술적 지표를 계산하고 패턴을 분석할 수 있습니다. 예를 들어, 이동평균선을 계산할 수 있습니다.
# 이동평균선 계산
data['MA50'] = data['Close'].rolling(window=50).mean()
data['MA200'] = data['Close'].rolling(window=200).mean()
4. 모델 선택 및 학습
ARIMA 모델을 사용하여 주가를 예측할 수 있습니다.
ARIMA 모델 (AutoRegressive Integrated Moving Average)
ARIMA 모델은 위의 세 가지 구성 요소를 결합하여 시계열 데이터를 분석하고 예측합니다. ARIMA(p, d, q) 모델은 p개의 자기회귀 항, d개의 차분, q개의 이동평균 항을 사용합니다.
예제
ARIMA(3, 1, 0) 모델은 다음과 같이 구성됩니다:
자기회귀 항: 3개
차분: 1회
이동평균 항: 없음
이 모델은 과거 3개의 값과 1회의 차분을 사용하여 현재 값을 예측합니다.
from statsmodels.tsa.arima_model import ARIMA
# 모델 학습
model = ARIMA(data['Close'], order=(5, 1, 0))
model_fit = model.fit(disp=0)
# 모델 평가
print(model_fit.summary())
model = ARIMA(df['Close'], order=(5, 1, 0)) AI가 생성한 코드입니다.
ARIMA는 AutoRegressive Integrated Moving Average의 약자로, 시계열 데이터를 예측하는 데 사용되는 통계 모델입니다.
- df['Close']는 종가 데이터를 의미합니다.
- order=(5, 1, 0)는 ARIMA 모델의 파라미터를 설정합니다.
여기서 (p, d, q)로 구성되며, 각각의 의미는 다음과 같습니다:
* p: AR(자기회귀) 부분의 차수 (여기서는 5) : 최적의 p를 찾아야 합니다.(아래 참조)
* d: 차분 횟수 (여기서는 1)
* q: MA(이동평균) 부분의 차수 (여기서는 0)
AIC와 BIC의 정의
위의 값 p : "5" 값은 어떻게 만들어야 하나 ?
아래와 같은 방법으로 "최적의 p를 찾아야 합니다."
AIC(Akaike Information Criterion)와 BIC(Bayesian Information Criterion)는 모델의 적합성을 평가하는 데 사용되는 통계적 기준입니다.
- AIC (Akaike Information Criterion): 모델의 적합도와 복잡성을 고려하여 모델을 평가합니다.
AIC 값이 낮을수록 모델이 더 적합하다고 판단합니다.
- BIC (Bayesian Information Criterion): AIC와 유사하지만, 모델의 복잡성에 더 큰 패널티를 부여합니다.
BIC 값이 낮을수록 모델이 더 적합하다고 판단합니다.
최적의 p 값을 찾는 방법
모델 생성 및 학습: 여러 가지 p 값을 사용하여 ARIMA 모델을 생성하고 학습합니다.
AIC와 BIC 계산: 각 모델의 AIC와 BIC 값을 계산합니다.
최적의 모델 선택: AIC와 BIC 값이 가장 낮은 모델을 선택합니다.
# AIC (Akaike Information Criterion) , BIC (Bayesian Information Criterion): 찾는법
#
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
# CSV 파일 URL
url = 'https://query1.finance.yahoo.com/v7/finance/download/AMZN?period1=1691730584&period2=1723352984&interval=1d&events=history&includeAdjustedClose=true'
# CSV 파일을 데이터프레임으로 읽기
df = pd.read_csv(url)
# 데이터 전처리
df['Close'] = (df['Close'] - df['Close'].mean()) / df['Close'].std()
# 최적의 p 값을 찾기 위한 변수 초기화
best_aic = float('inf')
best_bic = float('inf')
best_p = None
# 여러 가지 p 값을 사용하여 모델 학습 및 평가
for p in range(1, 11):
model = ARIMA(df['Close'], order=(p, 1, 0))
model_fit = model.fit()
aic = model_fit.aic
bic = model_fit.bic
if aic < best_aic:
best_aic = aic
best_p_aic = p
if bic < best_bic:
best_bic = bic
best_p_bic = p
print(f"최적의 p 값 (AIC 기준): {best_p_aic}, AIC: {best_aic}")
print(f"최적의 p 값 (BIC 기준): {best_p_bic}, BIC: {best_bic}")
# 2024.8.11
# 최적의 p 값 (AIC 기준): 3, AIC: -318.0206586487865
# 최적의 p 값 (BIC 기준): 2, BIC: -306.8721183453865
여기에서 AIC 3 BIC 2 가 나왔은데 아래 소스에는 "3" 을 적용하여 작성해 봅니다.
5. 주가 예측
학습된 모델을 사용하여 향후 3개월, 6개월, 12개월 주가를 예측할 수 있습니다.
# 주가 예측
forecast_3m = model_fit.forecast(steps=90)[0]
forecast_6m = model_fit.forecast(steps=180)[0]
forecast_12m = model_fit.forecast(steps=365)[0]
print("3개월 예측 주가:", forecast_3m)
print("6개월 예측 주가:", forecast_6m)
print("12개월 예측 주가:", forecast_12m)
위의 코드를 통해 아마존 주식 데이터를 수집, 전처리, 분석 및 예측할 수 있습니다. 이를 통해 향후 주가를 예측하는 데 도움이 될 것입니다.
현재 환경에서는 실제로 인터넷 검색을 통해 데이터를 수집하거나 Python 코드를 실행할 수 없습니다. 하지만, 제가 제공한 가이드를 따라 직접 실행해보실 수 있습니다. 다음은 그 과정에 대한 좀 더 상세한 설명입니다.
위의 코드를 실행하기 위해서는 Python 환경이 필요하며, pandas, numpy, scipy, statsmodels 등의 라이브러리를 설치해야 합니다.
데이터 검증을 위해서 미리 알고있는 주식 차트가 맞는지 확인해 보려면 아래와 같이 하면 됩니다.
- df = df1.tail(200).head(100) 최근 100일 전 예측을 찾을 경우
df = df1 : 현재 기준 예측을 찾을 경우
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
# CSV 파일 URL
url = 'https://query1.finance.yahoo.com/v7/finance/download/AMZN?period1=1691730584&period2=1723352984&interval=1d&events=history&includeAdjustedClose=true'
# CSV 파일을 데이터프레임으로 읽기
df1 = pd.read_csv(url)
# 최근 200일 전데이터에서 100일치 데이터로 100일전을 예측할 경우
df = df1.tail(200).head(100)
# 데이터프레임 출력
print(df.head())
# 데이터 전처리
df.loc[:, 'Close2'] = (df['Close'] - df['Close'].mean()) / df['Close'].std()
# 모델 학습
model = ARIMA(df['Close2'], order=(3, 1, 0)) # 최적의 p 값 (AIC 기준) 사용
model_fit = model.fit()
# 주가 예측
forecast_7d = model_fit.forecast(steps=7)
forecast_14d = model_fit.forecast(steps=14)
forecast_20d = model_fit.forecast(steps=20)
forecast_3m = model_fit.forecast(steps=90)
forecast_6m = model_fit.forecast(steps=180)
forecast_12m = model_fit.forecast(steps=365)
print("7일 예측 주가:", forecast_7d)
print("14일 예측 주가:", forecast_14d)
print("20일 예측 주가:", forecast_20d)
print("3개월 예측 주가:", forecast_3m)
print("6개월 예측 주가:", forecast_6m)
print("12개월 예측 주가:", forecast_12m)
print("예측값은 표준화 값으로 역표준화 값으로 실제 가격 도출-----------")
mean_close = df['Close'].mean()
std_close = df['Close'].std()
forecast_7d_actual = forecast_7d * std_close + mean_close
forecast_14d_actual = forecast_14d * std_close + mean_close
forecast_20d_actual = forecast_20d * std_close + mean_close
forecast_3m_actual = forecast_3m * std_close + mean_close
forecast_6m_actual = forecast_6m * std_close + mean_close
forecast_12m_actual = forecast_12m * std_close + mean_close
print("7일 예측 주가 (실제 값):", forecast_7d_actual)
print("14일 예측 주가 (실제 값):", forecast_14d_actual)
print("20일 예측 주가 (실제 값):", forecast_20d_actual)
print("3개월 예측 주가 (실제 값):", forecast_3m_actual)
print("6개월 예측 주가 (실제 값):", forecast_6m_actual)
print("12개월 예측 주가 (실제 값):", forecast_12m_actual)
이를 위해 다음과 같이 라이브러리를 설치할 수 있습니다:
pip install pandas numpy scipy statsmodels
이제 위의 단계를 따라 직접 데이터를 수집하고 분석해보세요.
Date Open High Low Close Adj Close \
51 2023-10-24 127.739998 128.800003 126.339996 128.559998 128.559998
52 2023-10-25 126.040001 126.339996 120.790001 121.389999 121.389999
53 2023-10-26 120.629997 121.639999 118.349998 119.570000 119.570000
54 2023-10-27 126.199997 130.020004 125.519997 127.739998 127.739998
55 2023-10-30 129.720001 133.000000 128.559998 132.710007 132.710007
Volume
51 46477400
52 74577500
53 100419500
54 125309300
55 72485500
7일 예측 주가: 151 1.465209
152 1.465391
153 1.437072
154 1.436690
155 1.445076
156 1.445287
157 1.442805
Name: predicted_mean, dtype: float64
14일 예측 주가: 151 1.465209
152 1.465391
153 1.437072
154 1.436690
155 1.445076
156 1.445287
157 1.442805
158 1.442713
159 1.443448
160 1.443483
161 1.443266
162 1.443253
163 1.443317
164 1.443322
Name: predicted_mean, dtype: float64
20일 예측 주가: 151 1.465209
152 1.465391
153 1.437072
154 1.436690
155 1.445076
156 1.445287
157 1.442805
158 1.442713
159 1.443448
160 1.443483
161 1.443266
162 1.443253
163 1.443317
164 1.443322
165 1.443303
166 1.443301
167 1.443307
168 1.443307
169 1.443306
170 1.443306
Name: predicted_mean, dtype: float64
3개월 예측 주가: 151 1.465209
152 1.465391
153 1.437072
154 1.436690
155 1.445076
...
236 1.443306
237 1.443306
238 1.443306
239 1.443306
240 1.443306
Name: predicted_mean, Length: 90, dtype: float64
6개월 예측 주가: 151 1.465209
152 1.465391
153 1.437072
154 1.436690
155 1.445076
...
326 1.443306
327 1.443306
328 1.443306
329 1.443306
330 1.443306
Name: predicted_mean, Length: 180, dtype: float64
12개월 예측 주가: 151 1.465209
152 1.465391
153 1.437072
154 1.436690
155 1.445076
...
511 1.443306
512 1.443306
513 1.443306
514 1.443306
515 1.443306
Name: predicted_mean, Length: 365, dtype: float64
예측값은 표준화 값으로 역표준화 값으로 실제 가격 도출-----------
7일 예측 주가 (실제 값): 151 175.823301
152 175.825864
153 175.428282
154 175.422925
155 175.540656
156 175.543614
157 175.508768
Name: predicted_mean, dtype: float64
14일 예측 주가 (실제 값): 151 175.823301
152 175.825864
153 175.428282
154 175.422925
155 175.540656
156 175.543614
157 175.508768
158 175.507486
159 175.517795
160 175.518295
161 175.515247
162 175.515063
163 175.515964
164 175.516029
Name: predicted_mean, dtype: float64
20일 예측 주가 (실제 값): 151 175.823301
152 175.825864
153 175.428282
154 175.422925
155 175.540656
156 175.543614
157 175.508768
158 175.507486
159 175.517795
160 175.518295
161 175.515247
162 175.515063
163 175.515964
164 175.516029
165 175.515763
166 175.515740
167 175.515819
168 175.515826
169 175.515803
170 175.515801
Name: predicted_mean, dtype: float64
3개월 예측 주가 (실제 값): 151 175.823301
152 175.825864
153 175.428282
154 175.422925
155 175.540656
...
236 175.515807
237 175.515807
238 175.515807
239 175.515807
240 175.515807
Name: predicted_mean, Length: 90, dtype: float64
6개월 예측 주가 (실제 값): 151 175.823301
152 175.825864
153 175.428282
154 175.422925
155 175.540656
...
326 175.515807
327 175.515807
328 175.515807
329 175.515807
330 175.515807
Name: predicted_mean, Length: 180, dtype: float64
12개월 예측 주가 (실제 값): 151 175.823301
152 175.825864
153 175.428282
154 175.422925
155 175.540656
...
511 175.515807
512 175.515807
513 175.515807
514 175.515807
515 175.515807
Name: predicted_mean, Length: 365, dtype: float64
(참고)
Yahoo Finance: Yahoo Finance - Amazon
https://finance.yahoo.com/quote/AMZN/history?p=AMZN
Google Finance: Google Finance - Amazon
https://www.google.com/finance/quote/AMZN:NASDAQ
Bloomberg: Bloomberg - Amazon
https://www.bloomberg.com/quote/AMZN:US