5.1.2. Max Drawdown
Mục đích: Hàm này tính mức sụt giảm lớn nhất từ đỉnh đến đáy trong một cửa sổ trượt (rolling window).
Nếu trong 1 khoảng thời gian (window), giá cổ phiếu rơi từ đỉnh 100 xuống đáy 80, thì drawdown là
(80 - 100)/100 = -0.2. Hàm trả về0.2(giá trị dương).
Cấu trúc hàm: max_drawdown(x, w=<gs_quant.timeseries.helper.Window object>)
Tham số:
x
Series
Chuỗi thời gian giá (có thể là giá đóng cửa cổ phiếu, NAV quỹ đầu tư, v.v.).
w
Window, int hoặc str
Cửa sổ trượt dùng để tính drawdown: Window(22, 10) - 22 phiên, bỏ qua 10 phiên đầu để “làm nóng” (ramp-up), int - số lượng quan sát (ví dụ 20 là 20 phiên), str - kiểu chuỗi ngày như '1m', '1w', '22d',... Nếu không truyền w, hàm sẽ tính drawdown cho toàn bộ chuỗi.
Cách hoạt động:
Với mỗi cửa sổ
w, hàm:Tìm đỉnh cao nhất trong cửa sổ đó.
Tìm đáy thấp nhất sau đỉnh.
Tính drawdown =
(đáy - đỉnh)/đỉnhvà lấy trị tuyệt đối.
Kết quả trả về:
Kiểu:
SeriesChuỗi thời gian các giá trị drawdown lớn nhất (theo rolling window).
Giá trị nằm trong
[0, 1], biểu diễn mức sụt giảm lớn nhất trong mỗi khoảng thời gian.
Ví dụ mẫu tính rolling max drawdown với cửa sổ 22 phiên cho mã cổ phiếu HPG trên tập dữ liệu 1 năm (25/06/2024 - 25/06/2025).
from FiinQuantX import FiinSession
from FiinQuantX.timeseries.econometrics import max_drawdown
from FiinQuantX.timeseries.helper import Window
from datetime import datetime
from dateutil.relativedelta import relativedelta
username = "REPLACE_WITH_YOUR_USERNAME"
password = "REPLACE_WITH_YOUR_PASSWORD"
client = FiinSession(
username=username,
password=password
).login()
# Lấy dữ liệu giá đóng cửa 1 năm EOD của HPG
data = client.Fetch_Trading_Data(
realtime=False,
tickers=["HPG"],
fields=["close"],
adjusted=True,
by="1d",
from_date=(datetime.now() - relativedelta(years=1)).strftime("%Y-%m-%d")
).get_data()
data.set_index("timestamp", inplace=True)
# Tính rolling max drawdown 22 phiên, bỏ qua 10 phiên đầu (ramp-up)
drawdown_series = max_drawdown(data['close'], w=Window(22, 10))
# Gộp kết quả vào DataFrame ban đầu
data['max_drawdown_22'] = drawdown_series
print(data)Kết quả trả về
timestamp ticker close max_drawdown_22
2024-06-25 00:00 HPG 28700.0 NaN
2024-06-26 00:00 HPG 28900.0 NaN
2024-06-27 00:00 HPG 28850.0 NaN
2024-06-28 00:00 HPG 28300.0 NaN
2024-07-01 00:00 HPG 28350.0 NaN
... ... ... ...
2025-06-19 00:00 HPG 26900.0 -0.022945
2025-06-20 00:00 HPG 27000.0 -0.022945
2025-06-23 00:00 HPG 26850.0 -0.022945
2025-06-24 00:00 HPG 27000.0 -0.022945
2025-06-25 00:00 HPG 27200.0 -0.022945Biểu đồ minh họa (tuỳ chọn)
import matplotlib.pyplot as plt
data[['close', 'max_drawdown_22']].plot(subplots=True, figsize=(12, 6), title=['Close Price', 'Max Drawdown (22 days)'])
plt.tight_layout()
plt.show()
Last updated