Doctor AI

Dr. Savath Saypadith

240 ບົດຄວາມ

ການສ້າງ Deep Neural Network ສຳລັບການພະຍາກອນຕະຫຼາດຫຼັກຊັບ

ໂພສເມື່ອ # Deep Learning # Pattern Recognition # Time Series Forecasting # PyTorch

ການສ້າງ 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 (CtC_t) ທີ່ເຮັດໜ້າທີ່ຄືກັບສາຍພານລຳລຽງຂໍ້ມູນ ພ້ອມກັບ Gates ຄວບຄຸມ 3 ຕົວຄື:

2. ການປະມວນຜົນຂໍ້ມູນ (Data Preprocessing) ໃນບໍລິບົດຂອງ LSX

ກ່ອນຈະປ້ອນຂໍ້ມູນເຂົ້າໂມເດວ, ຂໍ້ມູນລາຄາຮຸ້ນປະຫວັດສາດ (Open, High, Low, Close, Volume) ຕ້ອງຜ່ານການຈັດການກ່ອນ. ສົມມຸດເຮົາກຳລັງວິເຄາະຂໍ້ມູນປະຫວັດສາດຂອງຮຸ້ນ BCEL ຍ້ອນຫຼັງ 5 ປີ:

  1. Normalization: ລາຄາຮຸ້ນມີການເໜັງຕີງໃນ Scale ທີ່ແຕກຕ່າງກັນ. ການໃຊ້ MinMaxScaler ເພື່ອປັບຄ່າໃຫ້ຢູ່ໃນຫວ່າງ [-1, 1] ຈະຊ່ວຍໃຫ້ການ Converge ຂອງ Gradient Descent ໄວຂຶ້ນ.
  2. Sliding Window (Lookback Period): ເຮົາຕ້ອງປ່ຽນຂໍ້ມູນ Time series ໃຫ້ກາຍເປັນ Supervised Learning ໂດຍການກຳນົດ Time steps (TT). ຕົວຢ່າງ: ໃຊ້ຂໍ້ມູນ 60 ມື້ຫຼັງ (XX) ເພື່ອທຳນາຍມື້ທີ 61 (yy).
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) ເມື່ອນຳໃຊ້ກັບຕະຫຼາດຕົວຈິງ

  1. Data Leakage & Look-ahead Bias: ຕ້ອງລະວັງບໍ່ໃຫ້ຂໍ້ມູນໃນອະນາຄົດຫຼຸດເຂົ້າໄປໃນຕອນກຽມຂໍ້ມູນ (Train/Test Split). ໃນການແບ່ງຂໍ້ມູນ Time Series, ຫ້າມໃຊ້ການສຸ່ມແບບ Random Split ເດັດຂາດ, ຕ້ອງຕັດຂໍ້ມູນຕາມລຳດັບເວລາ (Sequential Split).
  2. Market Volatility ຂອງລາວ: ຕະຫຼາດ LSX ມີສະພາບຄ່ອງ (Liquidity) ທີ່ຕໍ່າກວ່າຕະຫຼາດໃຫຍ່ໆ, ເຮັດໃຫ້ລາຄາອາດຈະຢຸດນິ້ງຫຼາຍມື້ ຫຼື ເໜັງຕີງກະທັນຫັນເມື່ອມີຂ່າວນອກລະບົບ. ໂມເດວທີ່ອ່ານພຽງແຕ່ປະຫວັດລາຄາ (Historical price) ຈະບໍ່ພຽງພໍ.
  3. ການນຳໃຊ້ຂໍ້ມູນລວມ (Multivariate Analysis): ເພື່ອໃຫ້ໂມເດວແຂງແກ່ນຂຶ້ນ, ນອກຈາກລາຄາແລ້ວ ຄວນຈັດການກັບ Features ເພີ່ມເຕີມເຊັ່ນ: ອັດຕາແລກປ່ຽນເງິນກີບ, ເງິນເຟີ້, ຫຼື ຂໍ້ມູນດັດຊະນີຈາກປະເທດເພື່ອນບ້ານ (ເຊັ່ນ SET index) ມາເປັນ Multivariate Time Series Input (input_dim > 1).

ສິ່ງສຳຄັນທີ່ຄວນຈື່ (Key Takeaways)

ສະຫຼຸບແລ້ວ, ການສ້າງ Deep Neural Network ເພື່ອພະຍາກອນຕະຫຼາດຫຼັກຊັບຮຽກຮ້ອງໃຫ້ມີຄວາມເຂົ້າໃຈທັງດ້ານສະຖາປັດຕະຍະກຳຂອງໂມເດວ, ມາດຕະຖານການວິເຄາະທາງຄະນິດສາດ ແລະ ບໍລິບົດຄວາມເປັນຈິງຂອງຕະຫຼາດໃນທ້ອງຖິ່ນ. ການທົດລອງໃສ່ກັບຂໍ້ມູນຂອງ LSX ຖືເປັນຈຸດເລີ່ມຕົ້ນທີ່ດີສຳລັບນັກພັດທະນາໃນລາວ ທີ່ຈະຍົກລະດັບທັກສະ AI ໃຫ້ເຂົ້າກັບການນຳໃຊ້ຕົວຈິງໃນອຸດສາຫະກຳການເງິນ. ຮຽນຮູ້ຢ່າງຕໍ່ເນື່ອງ, ປັບປຸງໂມເດວດ້ວຍຂໍ້ມູນໃໝ່ໆ ແລະ ລະວັງຄວາມສ່ຽງສະເໝີ.