ການສ້າງ Deep Neural Network ສຳລັບການພະຍາກອນຕະຫຼາດຫຼັກຊັບ
ການສ້າງ Deep Neural Network ສຳລັບການພະຍາກອນຕະຫຼາດຫຼັກຊັບ: ກໍລະນີສຶກສາຂໍ້ມູນການເງິນພາກພື້ນ ແລະ LSX
ຕະຫຼາດການເງິນແມ່ນລະບົບທີ່ມີຄວາມຊັບຊ້ອນ (Complex System) ເຊິ່ງມີການປ່ຽນແປງແບບ Non-stationary. ສຳລັບນັກພັດທະນາ ແລະ ນັກວິໄຈ AI ໃນລາວ, ການພະຍາກອນແນວໂນ້ມການເງິນບໍ່ວ່າຈະເປັນຕະຫຼາດຫຼັກຊັບລາວ (Lao Securities Exchange - LSX) ເຊັ່ນ: ຮຸ້ນ BCEL ຫຼື EDL-Gen, ລ້ວນແຕ່ປ່ຽນແປງໄປຕາມປັດໄຈມະຫາພາກ, ອັດຕາແລກປ່ຽນເງິນກີບ ແລະ ຕະຫຼາດເພື່ອນບ້ານໃນພາກພື້ນ.
ໃນບົດຄວາມນີ້, ເຮົາຈະມາລົງເລິກເຖິງວິທີການອອກແບບ ແລະ ສ້າງໂຄງສ້າງ Deep Neural Network ຂັ້ນສູງ ໂດຍສະເພາະການນຳໃຊ້ Long Short-Term Memory (LSTM) ເພື່ອແກ້ໄຂບັນຫາ Time Series Forecasting ດ້ວຍ PyTorch.
1. ເປັນຫຍັງຕ້ອງແມ່ນ LSTM ສຳລັບຂໍ້ມູນອະນຸກົມເວລາ (Time Series)?
ການພະຍາກອນລາຄາຮຸ້ນບໍ່ສາມາດໃຊ້ Linear Regression ຫຼື Feed-Forward Neural Networks (FFNNs) ແບບທຳມະດາໄດ້ເນື່ອງຈາກໂມເດວເຫຼົ່ານີ້ບໍ່ມີຄວາມສາມາດໃນການຈົດຈຳລຳດັບເວລາ (Temporal Dependencies). ເຖິງແມ່ນວ່າ Recurrent Neural Networks (RNNs) ຈະຖືກອອກແບບມາເພື່ອແກ້ໄຂບັນຫານີ້, ແຕ່ກໍຍັງພົບບັນຫາ Vanishing Gradient ເມື່ອຕ້ອງປະມວນຜົນລຳດັບເວລາທີ່ຍາວນານ (Long sequences).
LSTM ຈຶ່ງຖືກນຳມາໃຊ້ ເພາະມັນມີໂຄງສ້າງ Cell State () ທີ່ເຮັດໜ້າທີ່ຄືກັບສາຍພານລຳລຽງຂໍ້ມູນ ພ້ອມກັບ Gates ຄວບຄຸມ 3 ຕົວຄື:
- Forget Gate (): ຕັດສິນໃຈວ່າຂໍ້ມູນໃດຈາກອະດີດທີ່ຄວນລຶບຖິ້ມ.
- Input Gate (): ຕັດສິນໃຈວ່າຂໍ້ມູນໃໝ່ໃດທີ່ຄວນບັນທຶກເຂົ້າໄປໃນ Cell state.
- Output Gate (): ຕັດສິນໃຈວ່າຈະສົ່ງຄ່າຫຍັງອອກໄປເປັນ Hidden state () ສຳລັບຂັ້ນຕອນຕໍ່ໄປ.
2. ການປະມວນຜົນຂໍ້ມູນ (Data Preprocessing) ໃນບໍລິບົດຂອງ LSX
ກ່ອນຈະປ້ອນຂໍ້ມູນເຂົ້າໂມເດວ, ຂໍ້ມູນລາຄາຮຸ້ນປະຫວັດສາດ (Open, High, Low, Close, Volume) ຕ້ອງຜ່ານການຈັດການກ່ອນ. ສົມມຸດເຮົາກຳລັງວິເຄາະຂໍ້ມູນປະຫວັດສາດຂອງຮຸ້ນ BCEL ຍ້ອນຫຼັງ 5 ປີ:
- Normalization: ລາຄາຮຸ້ນມີການເໜັງຕີງໃນ Scale ທີ່ແຕກຕ່າງກັນ. ການໃຊ້
MinMaxScalerເພື່ອປັບຄ່າໃຫ້ຢູ່ໃນຫວ່າງ[-1, 1]ຈະຊ່ວຍໃຫ້ການ Converge ຂອງ Gradient Descent ໄວຂຶ້ນ. - Sliding Window (Lookback Period): ເຮົາຕ້ອງປ່ຽນຂໍ້ມູນ Time series ໃຫ້ກາຍເປັນ Supervised Learning ໂດຍການກຳນົດ Time steps (). ຕົວຢ່າງ: ໃຊ້ຂໍ້ມູນ 60 ມື້ຫຼັງ () ເພື່ອທຳນາຍມື້ທີ 61 ().
import numpy as np
import torch
from torch.utils.data import Dataset, DataLoader
class LaoStockDataset(Dataset):
def __init__(self, data, seq_length):
self.data = data
self.seq_length = seq_length
def __len__(self):
return len(self.data) - self.seq_length
def __getitem__(self, index):
# ດຶງຂໍ້ມູນ X (ລຳດັບ 60 ມື້) ແລະ y (ລາຄາມື້ຕໍ່ໄປ)
x = self.data[index : index + self.seq_length]
y = self.data[index + self.seq_length]
return torch.tensor(x, dtype=torch.float32), torch.tensor(y, dtype=torch.float32)
3. ການສ້າງສະຖາປັດຕະຍະກຳໂມເດວ (Advanced LSTM Architecture)
ການໃຊ້ LSTM layer ດຽວອາດລຽບງ່າຍເກີນໄປສຳລັບຄວາມຊັບຊ້ອນຂອງຕະຫຼາດການເງິນ. ໂຄງສ້າງທີ່ດີຄວນມີການຊ້ອນກັນຂອງ LSTM (Stacked LSTMs), ນຳໃຊ້ Dropout ເພື່ອປ້ອງກັນ Overfitting ແລະ ມີ Linear layers ໃນການສະກັດ Features ຂັ້ນສຸດທ້າຍ.
import torch.nn as nn
class StockPredictorLSTM(nn.Module):
def __init__(self, input_dim, hidden_dim, num_layers, output_dim, dropout=0.2):
super(StockPredictorLSTM, self).__init__()
self.hidden_dim = hidden_dim
self.num_layers = num_layers
# Stacked LSTM
self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers,
batch_first=True, dropout=dropout if num_layers > 1 else 0)
# Fully Connected Layers
self.fc1 = nn.Linear(hidden_dim, 32)
self.relu = nn.ReLU()
self.dropout = nn.Dropout(dropout)
self.fc2 = nn.Linear(32, output_dim)
def forward(self, x):
# ກຳນົດ Initial Hidden ແລະ Cell states
h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).requires_grad_().to(x.device)
c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).requires_grad_().to(x.device)
# Forward pass ຜ່ານ LSTM layer
out, (hn, cn) = self.lstm(x, (h0, c0))
# ເອົາ output ສະເພາະ Time step ສຸດທ້າຍ
out = out[:, -1, :]
# ຜ່ານ Dense layers
out = self.fc1(out)
out = self.relu(out)
out = self.dropout(out)
out = self.fc2(out)
return out
4. ການສອນໂມເດວ (Training & Optimization)
ສຳລັບການທຳນາຍລາຄາ (Regression), MSELoss (Mean Squared Error) ຫຼື HuberLoss ແມ່ນເໝາະສົມທີ່ສຸດ. ໃນທີ່ນີ້ເຮົາເລືອກໃຊ້ AdamW optimizer ເພື່ອຈັດການ Weight decay ໃຫ້ໂມເດວມີຄວາມທົນທານຕໍ່ Noise ຂອງຂໍ້ມູນລາຄາຮຸ້ນ.
# Setup ໂມເດວ, ຟັງຊັນການວັດແທກ ແລະ Optimizer
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = StockPredictorLSTM(input_dim=1, hidden_dim=64, num_layers=2, output_dim=1).to(device)
criterion = nn.MSELoss()
optimizer = torch.optim.AdamW(model.parameters(), lr=0.001, weight_decay=1e-4)
# Training Loop ຂັ້ນພື້ນຖານ
epochs = 100
for epoch in range(epochs):
model.train()
epoch_loss = 0
for X_batch, y_batch in train_loader:
X_batch, y_batch = X_batch.to(device), y_batch.to(device)
# Reset gradients
optimizer.zero_grad()
# Forward pass
predictions = model(X_batch)
loss = criterion(predictions.squeeze(), y_batch)
# Backward pass ແລະ ປັບແຕ່ງ (Optimize)
loss.backward()
# Gradient Clipping ປ້ອງກັນ Exploding Gradients
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
optimizer.step()
epoch_loss += loss.item()
if (epoch+1) % 10 == 0:
print(f'Epoch {epoch+1}/{epochs}, Loss: {epoch_loss/len(train_loader):.6f}')
5. ຂໍ້ຄວນລະວັງ (Advanced Pitfalls) ເມື່ອນຳໃຊ້ກັບຕະຫຼາດຕົວຈິງ
- Data Leakage & Look-ahead Bias: ຕ້ອງລະວັງບໍ່ໃຫ້ຂໍ້ມູນໃນອະນາຄົດຫຼຸດເຂົ້າໄປໃນຕອນກຽມຂໍ້ມູນ (Train/Test Split). ໃນການແບ່ງຂໍ້ມູນ Time Series, ຫ້າມໃຊ້ການສຸ່ມແບບ
Random Splitເດັດຂາດ, ຕ້ອງຕັດຂໍ້ມູນຕາມລຳດັບເວລາ (Sequential Split). - Market Volatility ຂອງລາວ: ຕະຫຼາດ LSX ມີສະພາບຄ່ອງ (Liquidity) ທີ່ຕໍ່າກວ່າຕະຫຼາດໃຫຍ່ໆ, ເຮັດໃຫ້ລາຄາອາດຈະຢຸດນິ້ງຫຼາຍມື້ ຫຼື ເໜັງຕີງກະທັນຫັນເມື່ອມີຂ່າວນອກລະບົບ. ໂມເດວທີ່ອ່ານພຽງແຕ່ປະຫວັດລາຄາ (Historical price) ຈະບໍ່ພຽງພໍ.
- ການນຳໃຊ້ຂໍ້ມູນລວມ (Multivariate Analysis): ເພື່ອໃຫ້ໂມເດວແຂງແກ່ນຂຶ້ນ, ນອກຈາກລາຄາແລ້ວ ຄວນຈັດການກັບ Features ເພີ່ມເຕີມເຊັ່ນ: ອັດຕາແລກປ່ຽນເງິນກີບ, ເງິນເຟີ້, ຫຼື ຂໍ້ມູນດັດຊະນີຈາກປະເທດເພື່ອນບ້ານ (ເຊັ່ນ SET index) ມາເປັນ Multivariate Time Series Input (
input_dim > 1).
ສິ່ງສຳຄັນທີ່ຄວນຈື່ (Key Takeaways)
- LSTM ແມ່ນເຄື່ອງມືທີ່ຊົງພະລັງສຳລັບຂໍ້ມູນປະເພດລຳດັບເວລາ ເພາະມັນສາມາດຮັກສາຄວາມຈຳໄລຍະຍາວ (Long-term dependencies) ໄດ້ດີກວ່າ RNN ທົ່ວໄປ.
- ການເຮັດ Data Scaling ແລະ ການຈັດການອະນຸກົມເວລາດ້ວຍເຕັກນິກ Sliding Window ແມ່ນຂັ້ນຕອນທີ່ຂາດບໍ່ໄດ້ໃນການປະມວນຜົນ.
- ໃນໂລກການເງິນຕົວຈິງ ໂດຍສະເພາະໃນຕະຫຼາດລາວ, Deep Learning ຄວນຖືກນຳໃຊ້ເປັນພຽງ “ເຄື່ອງມືຊ່ວຍຕັດສິນໃຈ” ບໍ່ແມ່ນເທບພະເຈົ້າທີ່ຮູ້ອະນາຄົດ 100%, ຄວນໃຊ້ຮ່ວມກັບ Fundamental Analysis ສະເໝີ.