Simple ARIMA Model
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import yfinance as yf
from sklearn.preprocessing import MinMaxScaler
from statsmodels.tsa.arima.model import ARIMA
import datetime
from google.colab import drive
# 授權 Google Drive
drive.mount('/content/drive')
# 下載資料的函數
def download_data(ticker, start_date):
data = yf.download(ticker, start=start_date)
data['Return'] = data['Adj Close'].pct_change()
data['Trade Amount'] = data['Volume'] * data['Adj Close']
data['MA7'] = data['Adj Close'].rolling(window=7).mean()
data['MA21'] = data['Adj Close'].rolling(window=21).mean()
data['MA50'] = data['Adj Close'].rolling(window=50).mean()
data['MA100'] = data['Adj Close'].rolling(window=100).mean()
data['RSI14'] = calculate_rsi(data['Adj Close'], 14)
data['Beta_60'] = calculate_beta(data['Return'], data['Return'].rolling(window=60).mean(), 60)
data['Beta_120'] = calculate_beta(data['Return'], data['Return'].rolling(window=120).mean(), 120)
return data
def calculate_rsi(series, period):
delta = series.diff(1)
gain = (delta.where(delta > 0, 0)).rolling(window=period).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=period).mean()
rs = gain / loss
rsi = 100 - (100 / (1 + rs))
return rsi
def calculate_beta(stock_returns, market_returns, window):
cov_matrix = stock_returns.rolling(window=window).cov(market_returns)
market_variance = market_returns.rolling(window=window).var()
beta = cov_matrix / market_variance
return beta
# 下載台股指數和個股資料
tickers = ["^TWII"]
data = {ticker: download_data(ticker, "2021-01-01") for ticker in tickers}
# 將資料保存為CSV文件到Google Drive
for ticker in tickers:
data[ticker].to_csv(f"/content/drive/My Drive/{ticker}.csv")
# 使用台灣股市指數的 Adj Close 數據
taiex_data = data["^TWII"]["Adj Close"]
# 構建 ARIMA 模型
model = ARIMA(taiex_data, order=(5,1,0)) # ARIMA(p,d,q) 中選擇適當的 p, d, q 參數
model_fit = model.fit()
# 預測未來180天
forecast_steps = 180
forecast = model_fit.forecast(steps=forecast_steps)
# 生成未來日期索引
last_date = taiex_data.index[-1]
future_dates = pd.date_range(start=last_date, periods=forecast_steps + 1)[1:]
# 繪圖
plt.figure(figsize=(14, 7))
plt.plot(taiex_data.index, taiex_data.values, label='Actual TAIEX')
plt.plot(future_dates, forecast, label='Future Prediction', color='red')
plt.title('TAIEX Prediction using ARIMA')
plt.xlabel('Date')
plt.ylabel('TAIEX Index')
plt.legend()
plt.grid(True)
plt.show()