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

Tái mẫu Chuỗi Thời gian Tài chính & Độ biến động Lũy kế Rolling Drawdown

Trong hệ thống giao dịch thuật toán (Algorithmic Trading), các lệnh khớp thị trường diễn ra ở các mốc thời gian ngẫu nhiên. Để đưa vào mô hình dự báo giá hoặc quản trị rủi ro, dữ l…

PythonTrung bình30 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ủ đề

pandastime seriesresamplerolling windowvolatilitydrawdown

Kiến thức tiên quyết: to datetime, datetime index, resample ohlc, rolling aggregations.

Nội dung đề bài

Mục tiêu kiến thức

  • Sử dụng pd.to_datetime và thiết lập DatetimeIndex để xử lý chuỗi thời gian bất quy tắc.
  • Tái lấy mẫu tần suất (resample) để xây dựng nến giao dịch chuẩn (open, high, low, close, volume).
  • Tính toán lợi suất liên tục (Log Returns) và độ biến động trượt (Rolling Volatility) bằng phương sai mẫu (ddof=1).
  • Tính toán mức sụt giảm giá trị trượt (Rolling Maximum Drawdown) trên cửa sổ thời gian xác định.

Mô tả bài toán

Trong hệ thống giao dịch thuật toán (Algorithmic Trading), các lệnh khớp thị trường diễn ra ở các mốc thời gian ngẫu nhiên. Để đưa vào mô hình dự báo giá hoặc quản trị rủi ro, dữ liệu cần được chuẩn hóa thành các khung thời gian đều đặn (như 5 phút, 1 giờ, 1 ngày).

Hãy viết hàm: analyze_trading_resample_rolling(df: pd.DataFrame, timestamp_col: str, price_col: str, volume_col: str, rule: str = "1h", window: int = 5) -> pd.DataFrame

Yêu cầu thực hiện:

  • Kiểm tra đầu vào:
  • df phải chứa đủ 3 cột: timestamp_col, price_col, volume_col. Nếu thiếu, ném ValueError("Missing required columns").
  • window phải là số nguyên ≥ 1. Nếu không, ném ValueError("window must be >= 1").
  • Thiết lập DatetimeIndex:
  • Chuyển timestamp_col sang kiểu datetime: pd.to_datetime(df[timestamp_col]).
  • Đặt làm chỉ mục chính của bảng và sắp xếp theo thời gian tăng dần.
  • Tái lấy mẫu (Resampling):
  • Tái lấy mẫu theo quy tắc rule (ví dụ "1h", "15min"):
  • 'open': giá giao dịch đầu tiên (first())
  • 'high': giá cao nhất (max())
  • 'low': giá thấp nhất (min())
  • 'close': giá cuối cùng (last())
  • 'volume': tổng khối lượng (sum())
  • Loại bỏ toàn bộ các khoảng thời gian không có giao dịch (dropna(subset=['close'])).
  • Tính toán Lợi suất Log & Độ biến động:
  • Tính lợi suất log: rt = ln(closetcloset-1).
  • Dòng đầu tiên (t=0) gán log_return = 0.0. Gán vào cột 'log_return'.
  • Tính độ biến động trượt với kích thước cửa sổ window (dùng độ lệch chuẩn mẫu ddof=1, min_periods=1):

rolling_vol = resampled['log_return'].rolling(window, min_periods=1).std(ddof=1).fillna(0.0) Gán vào cột 'rolling_volatility'.

  • Tính toán Mức sụt giảm trượt (Rolling Drawdown):
  • Tìm đỉnh giá cao nhất trong cửa sổ trượt:

rolling_peak = resampled['close'].rolling(window, min_periods=1).max()

  • Tính mức sụt giảm: DDt = closet - rolling_peakrolling_peak.
  • Gán vào cột 'rolling_drawdown' (lưu ý: giá trị luôn ≤ 0.0).
  • Đầu ra:
  • Reset index và đưa cột thời gian trở lại với tên 'timestamp'.
  • Toàn bộ các cột tính toán có kiểu float64.
  • Trả về DataFrame kết quả.

Input

  • Các tham số truyền vào hàm/lớp analyze_trading_resample_rolling 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 analyze_trading_resample_rolling hoặc dữ liệu in ra màn hình theo đúng đặc tả.

Ràng buộc

  • Số dòng dữ liệu: 1 ≤ N ≤ 105.
  • price_col > 0, volume_col ≥ 0.

Ví dụ 1

Input

analyze_trading_resample_rolling(data=[{'time': '2026-03-01 09:05:00', 'price': 100.0, 'qty': 10}, {'time': '2026-03-01 09:30:00', 'price': 105.0, 'qty': 20}, {'time': '2026-03-01 09:55:00', 'price': 102.0, 'qty': 5}, {'time': '2026-03-01 10:10:00', 'price': 104.0, 'qty': 15}, {'time': '2026-03-01 10:45:00', 'price': 108.0, 'qty': 25}], timestamp_col='time', price_col='price', volume_col='qty', rule='1h', window=2)

Output

2

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

analyze_trading_resample_rolling(data=[{'time': '2026-01-01', 'price': 100.0, 'qty': 1}, {'time': '2026-01-02', 'price': 90.0, 'qty': 1}, {'time': '2026-01-03', 'price': 80.0, 'qty': 1}], timestamp_col='time', price_col='price', volume_col='qty', rule='1D', window=3)

Output

3

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.