📌Demo dự đoán tăng/giảm phiên tiếp theo🧾
Mình sẽ làm demo dự đoán tăng/giảm phiên tiếp theo dùng OHLC 5 phiên gần nhất với mô hình rất nhẹ (Logistic Regression).
Lưu ý: với 5 mẫu thì model sẽ rất nhạt—chỉ phục vụ minh hoạ. Để thật sự dùng ML phải có ≥ vài trăm mẫu 📈
🧾 Dữ liệu mẫu OHLC 5 phiên
Giả sử chúng ta có dữ liệu như sau:
| Ngày | Open | High | Low | Close |
|---|---|---|---|---|
| D1 | 78.5 | 80.0 | 77.8 | 79.3 |
| D2 | 79.3 | 81.2 | 78.6 | 80.1 |
| D3 | 80.1 | 81.0 | 79.2 | 79.9 |
| D4 | 79.9 | 81.5 | 79.8 | 81.3 |
| D5 | 81.3 | 82.0 | 80.7 | 81.8 |
Anh muốn dự đoán tăng (1) hay giảm (0) cho phiên tiếp theo D6.
📌 Cách làm
❗ Tạo các features từ OHLC:
🎯 Ta có thể tạo:
Return = (Close − Open) / Open
High-Low range
%B (close khác so với high/low)
Với 5 dòng dữ liệu ta sẽ có 5 feature, và label là tăng/giảm của phiên đó (+1 nếu close > trước đó, else 0).
🧠 Model: Logistic Regression
Đơn giản, nhẹ, phù hợp bài binary classification.
🧪 Code Python (demo)
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
# --- 1) Dữ liệu OHLC 5 phiên ---
data = [
{"open": 78.5, "high": 80.0, "low": 77.8, "close": 79.3},
{"open": 79.3, "high": 81.2, "low": 78.6, "close": 80.1},
{"open": 80.1, "high": 81.0, "low": 79.2, "close": 79.9},
{"open": 79.9, "high": 81.5, "low": 79.8, "close": 81.3},
{"open": 81.3, "high": 82.0, "low": 80.7, "close": 81.8},
]
df = pd.DataFrame(data)
# --- 2) Tạo feature ---
df["return"] = (df["close"] - df["open"]) / df["open"]
df["range"] = (df["high"] - df["low"]) / df["open"]
# --- 3) Tạo label tăng/giảm (phiên tiếp theo) ---
df["label"] = 0
for i in range(len(df)-1):
df.at[i, "label"] = 1 if df.at[i+1, "close"] > df.at[i, "close"] else 0
# Bỏ dòng cuối vì không có phiên tiếp
df = df[:-1]
# --- 4) Chuẩn bị dữ liệu ---
X = df[["return", "range"]].values
y = df["label"].values
# --- 5) Train model ---
model = LogisticRegression()
model.fit(X, y)
# --- 6) Tạo feature cho phiên D6 giả định ---
# Giả sử D6 OHLC:
ohcl_D6 = {"open": 81.8, "high": 82.3, "low": 81.2, "close": 0}
return_D6 = (ohcl_D6["high"] - ohcl_D6["open"]) / ohcl_D6["open"]
range_D6 = (ohcl_D6["high"] - ohcl_D6["low"]) / ohcl_D6["open"]
X_D6 = np.array([[return_D6, range_D6]])
# Dự đoán ↑/↓
pred = model.predict(X_D6)[0]
print("DỰ ĐOÁN phiên tiếp theo:", "TĂNG 📈" if pred == 1 else "GIẢM 📉")
📊 Giải thích nhanh
| Step | Ý nghĩa |
|---|---|
| Tạo features | Chuyển giá thành số để máy học |
| label | Nếu close phiên sau > close hiện tại → 1 (tăng) |
| LogisticRegression | Dự đoán rời rạc 0/1 |
| D6 feature | Coi phiên mới có pattern như thế nào |
⚠️ Giới hạn
✅ Demo minh hoạ nhanh
❌ Với 5 phiên không đủ dữ liệu thật
❌ Model sẽ quá khớp / quá yếu
✔ Muốn thật: cần ≥ vài trăm mẫu, thêm chỉ báo MA, RSI…
📈 Muốn nâng cấp?
Mình có thể làm tiếp:
🔹 Dùng MA/RSI thay vì chỉ OHLC
🔹 LSTM (DL) dự đoán chuỗi time-series
🔹 Backtest hiệu quả dự đoán với dữ liệu VNM 1 năm
✨🤖 Made by AI – Coded with Clarity & Curiosity ⚙️📊✨
Nhận xét
Đăng nhận xét