Dự đoán giá cổ phiếu với Python: Machine Learning thực chiến

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ử.

Chia sẻ bài viết: