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()