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 đượ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 giantolerance. - 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:
tradesphải chứa các cột:['trade_time', 'symbol', 'side', 'trade_price', 'trade_qty'].quotesphả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_msphải là số nguyên > 0. Nếu không, némValueError("tolerance_ms must be > 0").- Chuẩn hóa thời gian & Sắp xếp:
- Chuyển
trade_timevàquote_timesang kiểupd.to_datetime. - Sắp xếp cả hai bảng theo thứ tự thời gian tăng dần (
pd.merge_asofyê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ớiquotes(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 đatolerance_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ếnask_pricehoặcbid_pricelàNaN), gánslippage = 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.
sidechỉ 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.
