Skip to content

🇻🇳 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ường

Bướ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 data

Bướ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 đây

Chuẩn Bị Dữ Liệu

Dữ liệu VN30F cần format parquet hoặc CSV với các cột:

CộtKiểuMô tả
timestampdatetimeUTC+7 (Asia/Ho_Chi_Minh)
openfloatGiá mở cửa
highfloatGiá cao nhất
lowfloatGiá thấp nhất
closefloatGiá đóng cửa
volumeintKhố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.

Powered by dautu.tech