BigData

[인공지능] ARIMA -주가 예측 모델: 3-6-9개월 후 AMZN 주가 확인 -

IT오이시이 2024. 8. 12. 01:19
728x90

 



[인공지능] 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

728x90
반응형