Khớp Lệnh Thị trường Bất đồng bộ với merge_asof & Tính Độ lệch Trượt Giá
Trong tài chính định lượng cao tần (High-Frequency Trading), các thay đổi trên sổ lệnh (Quotes: giá chào mua bid_price, giá chào bán ask_price) và các giao dịch thực tế (Trades: lệ
Tiến độ của tôi ở bài này
Điểm và code bạn nộp được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: merge asof mechanics, direction tolerance, market microstructure.
Nội dung đề bài
Mục tiêu kiến thức
- Sử dụng phương thức gộp chuỗi thời gian bất đối xứng pd.merge_asof để ghép các bản ghi không trùng mốc thời gian tuyệt đối.
- Làm chủ tham số định hướng direction='backward' và cửa sổ dung sai thời gian tolerance.
- Ghép nối đa chiều kết hợp khóa định danh (by='symbol') và khóa thời gian (on='timestamp').
- Tính toán chỉ số trượt giá thị trường (Execution Slippage) cho cả hai chiều Mua (BUY) và Bán (SELL).
Mô tả bài toán
Trong tài chính định lượng cao tần (High-Frequency Trading), các thay đổi trên sổ lệnh (Quotes: giá chào mua bid_price, giá chào bán ask_price) và các giao dịch thực tế (Trades: lệnh khớp trade_price) diễn ra liên tục trên các luồng kết nối mạng riêng biệt. Mốc thời gian (Timestamp) giữa hai bảng hiếm khi trùng khớp từng mili-giây.
Hãy viết hàm: match_trades_with_quotes(trades: pd.DataFrame, quotes: pd.DataFrame, tolerance_ms: int = 500) -> pd.DataFrame
Yêu cầu thực hiện:
- Kiểm tra đầu vào:
- trades phải chứa các cột: ['trade_time', 'symbol', 'side', 'trade_price', 'trade_qty'].
- quotes phải chứa các cột: ['quote_time', 'symbol', 'bid_price', 'ask_price'].
- Nếu thiếu bất kỳ cột nào, ném ValueError("Missing required columns in trades or quotes").
- tolerance_ms phải là số nguyên > 0. Nếu không, ném ValueError("tolerance_ms must be > 0").
- Chuẩn hóa thời gian & Sắp xếp:
- Chuyển trade_time và quote_time sang kiểu pd.to_datetime.
- Sắp xếp cả hai bảng theo thứ tự thời gian tăng dần (pd.merge_asof yêu cầu bắt buộc khóa thời gian phải được sắp xếp).
- Ghép nối bằng pd.merge_asof:
- Ghép trades (bảng bên trái) với quotes (bảng bên phải):
- left_on='trade_time'
- right_on='quote_time'
- by='symbol' (khớp chính xác theo mã cổ phiếu)
- direction='backward' (khớp với báo giá xuất hiện gần nhất trong quá khứ ngay trước hoặc tại thời điểm khớp lệnh)
- tolerance=pd.Timedelta(milliseconds=tolerance_ms) (chỉ chấp nhận báo giá cách thời điểm giao dịch tối đa tolerance_ms).
- Tính toán Độ trượt giá (Slippage):
- Với lệnh Mua (side == 'BUY'):
slippage = trade_price - ask_price (Mua với giá cao hơn giá chào bán tốt nhất là trượt giá dương - chịu thiệt hại).
- Với lệnh Bán (side == 'SELL'):
slippage = bid_price - trade_price (Bán với giá thấp hơn giá chào mua tốt nhất là trượt giá dương).
- Nếu không tìm thấy báo giá hợp lệ trong cửa sổ tolerance (khiến ask_price hoặc bid_price là NaN), gán slippage = np.nan.
- Gán vào cột mới 'slippage'.
- Đầu ra:
- Trả về DataFrame kết quả, giữ nguyên các cột ghép nối và cột 'slippage'.
Input
- Các tham số truyền vào hàm/lớp match_trades_with_quotes hoặc dữ liệu đầu vào theo định dạng mô tả.
Output
- Kết quả trả về của hàm/lớp match_trades_with_quotes hoặc dữ liệu in ra màn hình theo đúng đặc tả.
Ràng buộc
- Số lượng bản ghi: 1 ≤ Ntrades ≤ 50,000, 1 ≤ Nquotes ≤ 100,000.
- side chỉ nhận 2 giá trị chuỗi: "BUY" hoặc "SELL".
Ví dụ 1
Input
match_trades_with_quotes(trades=[{'trade_time': '2026-04-01 10:00:00.100', 'symbol': 'AAPL', 'side': 'BUY', 'trade_price': 150.25, 'trade_qty': 100}, {'trade_time': '2026-04-01 10:00:00.250', 'symbol': 'AAPL', 'side': 'SELL', 'trade_price': 150.1, 'trade_qty': 50}], quotes=[{'quote_time': '2026-04-01 10:00:00.050', 'symbol': 'AAPL', 'bid_price': 150.15, 'ask_price': 150.2}, {'quote_time': '2026-04-01 10:00:00.200', 'symbol': 'AAPL', 'bid_price': 150.12, 'ask_price': 150.18}], tolerance_ms=500)
Output
[0.05, 0.02]
Giải thích
Hàm được gọi với các tham số mẫu trên và trả về kết quả chính xác theo yêu cầu.
Ví dụ 2
Input
match_trades_with_quotes(trades=[{'trade_time': '2026-04-01 10:00:01.000', 'symbol': 'NVDA', 'side': 'BUY', 'trade_price': 500.0, 'trade_qty': 10}], quotes=[{'quote_time': '2026-04-01 10:00:00.200', 'symbol': 'NVDA', 'bid_price': 499.0, 'ask_price': 499.5}], tolerance_ms=500)
Output
[None]
Giải thích
Hàm được gọi với bộ tham số thứ hai và trả về kết quả tương ứng theo thiết kế.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
