Machine Learning Overview EP2
- หลักการทำงานของ Support Vector Machines (SVM) และการนำไปใช้งานจริง
หลักการของ SVM: SVM เป็นหนึ่งในอัลกอริธึม Machine Learning ที่ใช้สำหรับงาน Classification และ Regression โดยมีหลักการสำคัญคือการหาขอบเขต (Decision Boundary) ที่ดีที่สุดในการแยกข้อมูลออกจากกัน หรือหาความสัมพันธ์ของข้อมูลในรูปแบบที่เหมาะสมที่สุดสำหรับการทำนายข้อมูลเชิงต่อเนื่อง
การทำงานของ SVM:
- Hyperplane: SVM สร้างเส้น (สำหรับ 2 มิติ) หรือระนาบ (สำหรับหลายมิติ) ที่แยกข้อมูลออกเป็นกลุ่มอย่างเหมาะสม
- Support Vectors: ข้อมูลที่อยู่ใกล้กับ Hyperplane มากที่สุด ซึ่งใช้เป็นตัวกำหนดตำแหน่งของ Hyperplane
- Kernel Trick: สำหรับข้อมูลที่ไม่สามารถแยกกันได้ในมิติเดิม SVM ใช้ Kernel Function (เช่น Linear, Polynomial, Gaussian RBF) เพื่อเปลี่ยนข้อมูลไปในมิติที่สูงขึ้นและแยกได้ง่ายกว่า
- Optimization Problem: SVM จะพยายามเพิ่ม Margin หรือระยะห่างระหว่างข้อมูลสองกลุ่มให้มากที่สุด
การนำไปใช้งานจริง:
- สำหรับงานด้านการเงิน: SVM ถูกใช้ในงานวิเคราะห์แนวโน้มราคาหุ้น อัตราแลกเปลี่ยน หรือการพยากรณ์ข้อมูลราคาในอนาคต
- กระบวนการทั่วไป:
- เก็บข้อมูลราคาในอดีต (Historical Data)
- แปลงข้อมูลให้อยู่ในรูปที่เหมาะสม เช่น การสร้าง Features เช่น EMA, RSI, MACD
- แบ่งข้อมูลเป็น Training และ Testing Set
- ใช้ SVM ในการเรียนรู้ข้อมูล Training และตรวจสอบผลลัพธ์ด้วย Testing
- นำโมเดลไปใช้พยากรณ์ในอนาคต (Forecasting)
- Code MQL4 สำหรับ EA ด้วยอัลกอริธึม SVM
การเขียน SVM ใน MQL4 ค่อนข้างท้าทาย เนื่องจาก MQL4 ไม่มีไลบรารี Machine Learning โดยตรง เราจะต้อง:
- นำโมเดล SVM ที่ผ่านการเทรน (Training) มาใช้ใน MQL4
- แปลงโมเดลที่เทรนไว้ให้อยู่ในรูปคณิตศาสตร์ เช่น Hyperplane และ Weight Coefficients
ตัวอย่างด้านล่างนี้จะแสดงโค้ดพื้นฐานที่ใช้การคำนวณ SVM ในการทำนายแนวโน้มราคา:
Code MQL4: SVM EA
//+------------------------------------------------------------------+
//| @ML SVM.mq4 |
//| Thana Supamanop |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Thana Supamanop"
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
Print("SVM Expert Advisor Initialized");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double closePrice = iClose(NULL, 0, 1); // ราคาปิดล่าสุด
double features[]; // Feature ที่ต้องใช้
double prediction; // ผลลัพธ์ที่คาดการณ์
// สร้าง Features (ตัวอย่างเช่น RSI และ EMA)
ArrayResize(features, 2);
features[0] = iRSI(NULL, 0, 14, PRICE_CLOSE, 1);
features[1] = iMA(NULL, 0, 50, 0, MODE_SMA, PRICE_CLOSE, 1);
// เรียกฟังก์ชัน SVM เพื่อตัดสินใจ
prediction = SVM_Predict(features);
// ตัดสินใจซื้อหรือขาย
if (prediction > 0)
{
// สัญญาณซื้อ
if (OrdersTotal()==0) // ไม่มีออเดอร์เปิดอยู่
{
int ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, 0, 0, "SVM Buy", 0, 0, Blue);
if (ticket < 0) // ตรวจสอบว่า OrderSend ส่งคำสั่งสำเร็จหรือไม่
{
Print("Error opening buy order: ", GetLastError());
}
else
{
Print("Buy order opened successfully. Ticket: ", ticket);
}
}
}
else if (prediction < 0)
{
// สัญญาณขาย
if (OrdersTotal()==0) // ไม่มีออเดอร์เปิดอยู่
{
int ticket = OrderSend(Symbol(), OP_SELL, 0.1, Bid, 3, 0, 0, "SVM Sell", 0, 0, Red);
if (ticket < 0) // ตรวจสอบว่า OrderSend ส่งคำสั่งสำเร็จหรือไม่
{
Print("Error opening sell order: ", GetLastError());
}
else
{
Print("Sell order opened successfully. Ticket: ", ticket);
}
}
}
}
//+------------------------------------------------------------------+
//| SVM Prediction Function |
//+------------------------------------------------------------------+
double SVM_Predict(double &features[])
{
// ค่า Weights และ Bias ที่ได้จากการเทรนโมเดล SVM
double weights[] = {0.3, -0.5}; // ตัวอย่างน้ำหนักจากโมเดล
double bias = 0.2; // Bias ที่ได้จากโมเดล
double result = 0.0;
// คำนวณผลลัพธ์จากสมการ SVM
for (int i = 0; i < ArraySize(features); i++)
result += features[i] * weights[i];
result += bias;
// แปลงเป็น -1 หรือ 1 (Threshold = 0)
if (result >= 0)
return(1); // แนวโน้มขึ้น
else
return(-1); // แนวโน้มลง
}
//+------------------------------------------------------------------+
คำอธิบายโค้ด:
- OnInit: ฟังก์ชันนี้เริ่มต้นการทำงานของ EA
- OnTick: ฟังก์ชันนี้ทำงานทุกครั้งที่มีการเปลี่ยนแปลงราคา
- ดึงข้อมูล Feature (เช่น RSI และ EMA)
- เรียกฟังก์ชัน SVM_Predict เพื่อคำนวณแนวโน้มราคา
- เปิดคำสั่งซื้อ (BUY) หรือขาย (SELL) ตามผลลัพธ์
- SVM_Predict: ฟังก์ชันนี้คำนวณผลลัพธ์ SVM จากน้ำหนัก (Weights) และ Bias ที่ได้จากการเทรนโมเดล
- OrderSend: ใช้ส่งคำสั่งซื้อขายเมื่อได้รับสัญญาณจาก SVM
วิธีการใช้งาน:
- นำโค้ดไปวางใน MetaEditor (MQL4 IDE) และบันทึกเป็นไฟล์ .mq4
- คอมไพล์ไฟล์และติดตั้ง EA ใน MetaTrader 4
- เปิดใช้งาน EA บนกราฟ โดยตั้งค่าช่วงเวลา (Timeframe) และเงินทุนตามความเหมาะสม
- ตรวจสอบผลการเทรดใน Strategy Tester เพื่อปรับแต่งโมเดล SVM หรือค่าพารามิเตอร์
ข้อสังเกต:
- การเทรน SVM: ควรเทรนโมเดลใน Python หรือ R และนำค่า Weights/Bias มาปรับใน MQL4
- การสร้าง Features: เพิ่ม Feature อื่น ๆ เพื่อเพิ่มความแม่นยำ เช่น MACD, Volume
- การปรับแต่ง: ปรับแต่งค่าพารามิเตอร์ เช่น Period ของ RSI หรือ EMA ให้เหมาะสมกับตลาด
ทิ้งคำตอบไว้
- 41 ฟอรัม
- 1,319 หัวข้อ
- 3,709 กระทู้
- 52 ออนไลน์
- 1,446 สมาชิก