python-047Đọc toàn bộ đề miễn phí

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ệ…

PythonNâng cao35 phút

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ủ đề

pandasmerge asofhigh frequency tradingtimestamp alignmentslippage

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ế.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

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.