🇻🇳 Custom Data cho VN30F
QuantConnect KHÔNG có sẵn dữ liệu thị trường chứng khoán Việt Nam. Hướng dẫn này giúp bạn tích hợp dữ liệu VN30F futures vào QuantConnect để backtest và live trading.
Kiến Trúc Tích Hợp
Nguồn dữ liệu (SSI iBoard / CSV / API)
↓
PythonData Reader → Chuyển thành Bar LEAN
↓
AddData<VN30F>() → Subscription vào thuật toán
↓
OnData(Slice) → Giao dịch như tài sản bình thườngBước 1: Định Nghĩa VN30F Data Class
python
class VN30Futures(PythonData):
def GetSource(self, config, date, isLive):
if isLive:
# Live: URL API SSI iBoard
return SubscriptionDataSource(
"https://api.ssi.com.vn/...",
SubscriptionTransportMedium.RemoteFile
)
else:
# Backtest: local file
path = f"/home/user/data/vn30f/{date:yyyyMMdd}.csv"
return SubscriptionDataSource(
f"file://{path}",
SubscriptionTransportMedium.LocalFile
)
def Reader(self, config, line, date, isLive):
if not line.strip():
return None
cols = line.split(',')
# Format: timestamp,open,high,low,close,volume
data = VN30Futures()
data.Symbol = config.Symbol
data.Time = datetime.strptime(cols[0], "%Y-%m-%d %H:%M:%S")
data.Open = float(cols[1])
data.High = float(cols[2])
data.Low = float(cols[3])
data.Close = float(cols[4])
data.Volume = float(cols[5])
data.Value = data.Close # Giá trị cho chart
return dataBước 2: Đăng Ký và Sử Dụng
python
def Initialize(self):
self.SetStartDate(2025, 11, 1)
self.SetEndDate(2026, 5, 1)
self.SetCash(100000000) # 100 triệu VND
# Đăng ký VN30F với custom data
vn30f = self.AddData(VN30Futures, "VN30F1M", Resolution.Minute)
vn30f.SetLeverage(5) # Futures margin
# Thêm indicator
self.sma20 = self.SMA("VN30F1M", 20, Resolution.Minute)
self.SetWarmUp(20)
def OnData(self, data):
if self.IsWarmingUp:
return
if data.ContainsKey("VN30F1M"):
price = data["VN30F1M"].Close
self.Debug(f"VN30F: {price}")
# Logic giao dịch tại đâyChuẩn Bị Dữ Liệu
Dữ liệu VN30F cần format parquet hoặc CSV với các cột:
| Cột | Kiểu | Mô tả |
|---|---|---|
| timestamp | datetime | UTC+7 (Asia/Ho_Chi_Minh) |
| open | float | Giá mở cửa |
| high | float | Giá cao nhất |
| low | float | Giá thấp nhất |
| close | float | Giá đóng cửa |
| volume | int | Khối lượng hợp đồng |
💡 Xử Lý Timezone
LEAN mặc định dùng Eastern Time (ET). Đặt timezone cho VN30F: self.SetTimeZone(TimeZoneInfo.GetUtcOffset(TimeSpan.FromHours(7))) hoặc dùng datetime với UTC+7 trong Reader.
Reality Modeling cho VN30F
Slippage: Spread khoảng 0.1-0.5 tick trên SSI iBoard. Set slippage model với 0.5 tick.
Commission: SSI futures fee ~0.0025% mỗi chiều, tối thiểu 5,000 VND/lệnh.
Trading Hours: 9:00-14:00 UTC+7. Kiểm tra IsMarketOpen() trong OnData.