สวัสดีครับ ผมเป็นนักพัฒนา AI ที่ทำงานด้าน Machine Learning มาหลายปี วันนี้จะมาแบ่งปันประสบการณ์การใช้โมเดล LSTM และ Transformer ในการทำนายราคาหุ้น และวิธีนำโมเดลไปใช้งานจริงผ่าน API
ทำไมต้องใช้ AI ทำนายราคาหุ้น?
การลงทุนในตลาดหุ้นต้องการการวิเคราะห์ข้อมูลจำนวนมาก ทั้งราคาเปิด ปิด ปริมาณการซื้อขาย และตัวชี้วัดทางเศรษฐกิจ AI สามารถช่วยวิเคราะห์รูปแบบ (Pattern) ที่ซ่อนอยู่ในข้อมูลเหล่านี้ได้เร็วกว่ามนุษย์หลายพันเท่า
LSTM vs Transformer: โมเดลไหนเหมาะกับงานทำนายหุ้น?
- LSTM (Long Short-Term Memory) — เก่งเรื่องจำ Pattern ของข้อมูลตามลำดับเวลา ข้อดีคือใช้ทรัพยากรน้อย เหมาะกับข้อมูลราคาหุ้นรายวัน
- Transformer — สามารถจับความสัมพันธ์ระหว่างข้อมูลที่ห่างกันได้ดี ใช้เวลาเทรนนานกว่าแต่แม่นยำกว่า
- คำแนะนำ — ถ้าเพิ่งเริ่มต้น แนะนำ LSTM ก่อน เพราะเรียนรู้ง่ายและต้องการ GPU ต่ำ
เตรียมข้อมูลราคาหุ้นสำหรับ Training
ก่อนจะนำข้อมูลไปเทรนโมเดล เราต้องเตรียมข้อมูลให้ถูกรูปแบบก่อน ตัวอย่างนี้ใช้ Python ดึงข้อมูลจาก Yahoo Finance
# ติดตั้งไลบรารีที่จำเป็น
!pip install yfinance pandas numpy scikit-learn tensorflow holy-sheep-api
นำเข้าไลบรารี
import yfinance as yf
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
ดาวน์โหลดข้อมูลหุ้น Apple ย้อนหลัง 2 ปี
ticker = yf.Ticker("AAPL")
df = ticker.history(period="2y")
print(f"ข้อมูลที่ได้: {len(df)} วัน")
print(df.tail())
ผลลัพธ์ที่คาดหวัง: จะได้ DataFrame ที่มีคอลัมน์ Open, High, Low, Close, Volume ย้อนหลัง 2 ปี พร้อมสถิติ 504 วันทำการ
# เตรียมข้อมูลสำหรับ LSTM
def prepare_data(data, look_back=60):
"""
look_back = จำนวนวันที่ใช้ทำนายวันถัดไป
ค่า 60 หมายถึงใช้ข้อมูล 60 วันก่อนหน้า
"""
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data.reshape(-1, 1))
X, y = [], []
for i in range(look_back, len(scaled_data)):
X.append(scaled_data[i-look_back:i, 0])
y.append(scaled_data[i, 0])
X = np.array(X)
y = np.array(y)
# แบ่งข้อมูล 80% train, 20% test
train_size = int(len(X) * 0.8)
X_train, X_test = X[:train_size], X[train_size:]
y_train, y_test = y[:train_size], y[train_size:]
# Reshape สำหรับ LSTM [samples, time_steps, features]
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1)
return X_train, y_train, X_test, y_test, scaler
ใช้ราคาปิดเป็นข้อมูลหลัก
close_prices = df['Close'].values
X_train, y_train, X_test, y_test, scaler = prepare_data(close_prices, look_back=60)
print(f"ข้อมูล Train: {X_train.shape}")
print(f"ข้อมูล Test: {X_test.shape}")
สร้างและเทรนโมเดล LSTM
ต่อไปจะเป็นการสร้างโมเดล LSTM ที่เรียบง่ายแต่ได้ผลดี ผมใช้ TensorFlow/Keras ในการสร้าง
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
def build_lstm_model(input_shape):
"""
สร้างโมเดล LSTM ที่มี 3 ชั้น
- LSTM Layer 1: 50 units, return sequences สำหรับ Layer ต่อไป
- LSTM Layer 2: 50 units
- Dense Layer: 1 unit สำหรับ Output (ราคาทำนาย)
"""
model = Sequential([
LSTM(50, return_sequences=True, input_shape=input_shape),
Dropout(0.2), # ป้องกัน Overfitting
LSTM(50, return_sequences=False),
Dropout(0.2),
Dense(25),
Dense(1)
])
model.compile(optimizer='adam', loss='mean_squared_error')
return model
สร้างโมเดล
model = build_lstm_model((X_train.shape[1], 1))
model.summary()
เทรนโมเดล
print("กำลังเทรนโมเดล...")
history = model.fit(
X_train, y_train,
batch_size=32,
epochs=50,
validation_data=(X_test, y_test),
verbose=1
)
Deploy โมเดลเป็น API ด้วย FastAPI
หลังจากเทรนโมเดลเสร็จแล้ว ขั้นตอนสำคัญคือการนำโมเดลไปใช้งานจริง ผมจะใช้ FastAPI เพื่อสร้าง API ที่รับข้อมูลราคาหุ้นแล้วส่งค่าทำนายกลับมา
# server.py — ไฟล์หลักสำหรับ API Server
from fastapi import FastAPI
from pydantic import BaseModel
import numpy as np
import pickle
app = FastAPI(title="Stock Prediction API", version="1.0")
โหลดโมเดลและ scaler ที่บันทึกไว้
model = tf.keras.models.load_model("stock_lstm_model.h5")
with open("scaler.pkl", "rb") as f:
scaler = pickle.load(f)
class StockInput(BaseModel):
prices: list[float] # ราคาปิดย้อนหลัง 60 วัน
@app.post("/predict")
def predict_stock(input_data: StockInput):
"""ทำนายราคาหุ้นวันถัดไป"""
if len(input_data.prices) != 60:
return {"error": "ต้องส่งข้อมูล 60 วัน"}
# ปรับขนาดข้อมูลด้วย scaler
scaled_data = scaler.transform(np.array(input_data.prices).reshape(-1, 1))
X = scaled_data.reshape(1, 60, 1)
# ทำนาย
prediction = model.predict(X)
predicted_price = scaler.inverse_transform(prediction)[0][0]
return {
"predicted_price": round(float(predicted_price), 2),
"current_price": input_data.prices[-1],
"change_percent": round(((predicted_price - input_data.prices[-1]) / input_data.prices[-1]) * 100, 2)
}
@app.get("/health")
def health_check():
return {"status": "OK", "model": "LSTM"}
รันเซิร์ฟเวอร์: uvicorn server:app --host 0.0.0.0 --port 8000
เรียกใช้ API ด้วย Python ผ่าน HolySheep AI
ตอนนี้เราจะมาดูวิธีใช้ HolySheep AI ในการเรียก API สำหรับงานนี้ เพื่อให้ AI ช่วยวิเคราะห์ผลลัพธ์และแนะนำการลงทุน
# ใช้ HolySheep AI วิเคราะห์ผลการทำนาย
import requests
ตั้งค่า HolySheep API
BASE_URL = "https://api.holysheep.ai/v1"
API_KEY = "YOUR_HOLYSHEEP_API_KEY" # ใส่ API Key ของคุณ
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
ข้อมูลราคาหุ้นย้อนหลัง 60 วัน
stock_data = {
"prices": [150.25, 151.30, 152.10, 151.85, 153.20, 154.00,
# ... ข้อมูล 60 วัน
]
}
เรียก Stock Prediction API
stock_api_url = "http://localhost:8000/predict"
response = requests.post(stock_api_url, json=stock_data)
prediction_result = response.json()
ส่งผลลัพธ์ไปให้ AI วิเคราะห์
analysis_prompt = f"""
ผลการทำนายราคาหุ้น AAPL:
- ราคาปัจจุบัน: ${prediction_result['current_price']}
- ราคาทำนาย: ${prediction_result['predicted_price']}
- เปลี่ยนแปลง: {prediction_result['change_percent']}%
กรุณาวิเคราะห์ว่าควรซื้อ ขาย หรือถือ เพราะเหตุใด
"""
payload = {
"model": "deepseek-v3.2",
"messages": [
{"role": "user", "content": analysis_prompt}
],
"temperature": 0.7
}
เรียก HolySheep AI
response = requests.post(
f"{BASE_URL}/chat/completions",
headers=headers,
json=payload
)
result = response.json()
print("ผลการวิเคราะห์จาก AI:")
print(result['choices'][0]['message']['content'])
ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข
- ข้อผิดพลาด 401 Unauthorized — เกิดจาก API Key ไม่ถูกต้องหรือหมดอายุ ตรวจสอบว่าใส่ API Key ถูกต้องและยังไม่หมดอายุ ถ้ายังไม่มี Key สามารถสมัครที่นี่เพื่อรับเครดิตฟรี
# วิธีแก้ไข 401 Error
import os
ตรวจสอบว่ามี API Key ใน Environment Variable หรือไม่
API_KEY = os.environ.get("HOLYSHEEP_API_KEY")
if not API_KEY:
API_KEY = "YOUR_HOLYSHEEP_API_KEY" # ใส่ Key ที่ได้จากการสมัคร
ตรวจสอบ Format ของ Header
headers = {
"Authorization": f"Bearer {API_KEY.strip()}", # ลบช่องว่าง
"Content-Type": "application/json"
}
ทดสอบเชื่อมต่อ
test_response = requests.get(
f"{BASE_URL}/models",
headers=headers
)
print(f"สถานะการเชื่อมต่อ: {test_response.status_code}")
- ข้อผิดพลาด 422 Validation Error — เกิดจากข้อมูลที่ส่งไปไม่ตรงตาม Format ที่กำหนด เช่น จำนวนวันไม่ครบ 60 วัน หรือประเภทข้อมูลผิด
# วิธีแก้ไข 422 Validation Error
def validate_stock_input(prices):
"""ตรวจสอบความถูกต้องของข้อมูลก่อนส่ง"""
if not prices:
return False, "ไม่มีข้อมูลราคา"
if len(prices) != 60:
return False, f"ต้องส่งข้อมูล 60 วัน แต่ได้รับ {len(prices)} วัน"
# ตรวจสอบว่าเป็นตัวเลขทั้งหมด
if not all(isinstance(p, (int, float)) for p in prices):
return False, "ข้อมูลต้องเป็นตัวเลขเท่านั้น"
# ตรวจสอบว่าไม่มีค่าว่าง
if any(p is None or np.isnan(p) for p in prices):
return False, "มีค่าว่างในข้อมูล"
return True, "ข้อมูลถูกต้อง"
ทดสอบ
valid, message = validate_stock_input([150.0] * 60)
print(f"ผลตรวจสอบ: {message}")
- ข้อผิดพลาด 429 Rate Limit — เกิดจากการเรียก API บ่อยเกินไป HolySheep มี Rate Limit ต่ำสุด 1000 Requests/นาที ควรใช้ Cache หรือรอก่อนเรียกซ้ำ
# วิธีแก้ไข 429 Rate Limit Error
import time
from functools import wraps
def rate_limit_handler(max_retries=3, delay=1):
"""จัดการเมื่อเกิด Rate Limit"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
for attempt in range(max_retries):
try:
return func(*args, **kwargs)
except Exception as e:
if "429" in str(e) and attempt < max_retries - 1:
wait_time = delay * (2 ** attempt) # Exponential backoff
print(f"รอ {wait_time} วินาที ก่อนลองใหม่...")
time.sleep(wait_time)
else:
raise e
return None
return wrapper
return decorator
ใช้ Decorator กับฟังก์ชันเรียก API
@rate_limit_handler(max_retries=3, delay=2)
def call_holysheep_api(messages):
response = requests.post(
f"{BASE_URL}/