Dữ liệu chứng khoán
Sử dụng thư viện yfinance để tải dữ liệu chứng khoán miễn phí từ Yahoo Finance.
import yfinance as yf
import pandas as pd
# Tải dữ liệu VN-Index
data = yf.download("^VNINDEX", start="2020-01-01", end="2024-12-31")
print(data.head())
print(f"Tổng: {len(data)} ngày giao dịch")
Feature Engineering
df = data.copy()
df['SMA_20'] = df['Close'].rolling(window=20).mean()
df['SMA_50'] = df['Close'].rolling(window=50).mean()
df['RSI'] = compute_rsi(df['Close'], 14)
df['MACD'] = df['Close'].ewm(span=12).mean() - df['Close'].ewm(span=26).mean()
df['Volume_Change'] = df['Volume'].pct_change()
df['Price_Change'] = df['Close'].pct_change()
df['Target'] = (df['Close'].shift(-1) > df['Close']).astype(int)
df.dropna(inplace=True)
LSTM cho dự đoán chuỗi thời gian
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaled = scaler.fit_transform(df[['Close']].values)
# Tạo sequences
def create_sequences(data, seq_length=60):
X, y = [], []
for i in range(seq_length, len(data)):
X.append(data[i-seq_length:i])
y.append(data[i])
return np.array(X), np.array(y)
X, y = create_sequences(scaled)
# LSTM model
model = Sequential([
LSTM(50, return_sequences=True, input_shape=(60, 1)),
Dropout(0.2),
LSTM(50, return_sequences=False),
Dropout(0.2),
Dense(25),
Dense(1)
])
model.compile(optimizer='adam', loss='mse')
model.fit(X_train, y_train, epochs=20, batch_size=32)
Lưu ý quan trọng
⚠️ Không có mô hình nào dự đoán chính xác 100% giá cổ phiếu. Dự án này mang tính học tập — thị trường chịu ảnh hưởng bởi nhiều yếu tố ngoài dữ liệu lịch sử.