Vì sao matplotlib quan trọng trong quant trading (không phải để “đẹp”)

23/02/2026

675 lượt đọc

Trong quant trading, đọc dữ liệu bằng bảng số thường làm người ta… tự lừa mình. Một backtest nhìn “đẹp” có thể chỉ là do bạn chưa nhìn thấy những thứ quan trọng: vùng sideway kéo dài, cú gap, giai đoạn thanh khoản yếu, hoặc drawdown âm ỉ nhưng rất dai. Chart là cách nhanh nhất để bóc lớp “ảo giác” đó.

Chương về matplotlib trong sách có một ý rất thực tế: trước khi nghĩ đến chiến lược, hãy vẽ chart. Vì chiến lược nào cũng cần “đúng môi trường”. Trend-following không hợp tài sản đi ngang; mean-reversion dễ chết trong giai đoạn breakout; intraday thì cực nhạy với biến động/khối lượng. Và chart là cách bạn nhìn thấy “regime” của thị trường trong vài giây.

Tư duy “figure + subplots” để đánh giá chiến lược như một hệ thống

Nhiều người mới làm quant hay mắc lỗi: chỉ vẽ price hoặc chỉ vẽ equity curve. Nhưng một hệ thống giao dịch phải được nhìn tối thiểu qua 3–4 góc: giá, tín hiệu, equity, drawdown, thậm chí thêm rolling volatility. Điểm hay của matplotlib là bạn tạo một “canvas” (figure) rồi chia nó thành nhiều cửa sổ (subplot) để nhìn được toàn cảnh cùng lúc.

Ví dụ workflow thực tế:

  1. Subplot 1: giá + tín hiệu (entry/exit)
  2. Subplot 2: equity curve (giá trị tài khoản theo thời gian)
  3. Subplot 3: drawdown (đo mức đau thật sự)
  4. Subplot 4: rolling volatility hoặc rolling Sharpe (để biết regime đổi chưa)

Nếu chỉ nhìn equity curve, bạn có thể bị “đánh lừa” bởi vài trade thắng lớn. Nhưng khi thêm drawdown, bạn sẽ thấy ngay chiến lược có đoạn “hấp hối” dài hay không. Đây là chỗ mà chương sách nói rất đúng: không có gì thay thế được một chart được thiết kế tử tế.

Dưới đây là khung code tối giản nhưng đúng tinh thần “xây hệ thống” (không chỉ vẽ cho vui). Bạn có thể thay dữ liệu giả bằng dữ liệu thật của VN30/VNINDEX/1 cổ phiếu bất kỳ.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# giả lập price (thay bằng dữ liệu thật của bạn)
np.random.seed(42)
n = 500
price = 100 + np.cumsum(np.random.randn(n)) # random walk
df = pd.DataFrame({"price": price})
df["ret"] = df["price"].pct_change().fillna(0)

# tín hiệu ví dụ: moving average crossover
fast = 10
slow = 30
df["ma_fast"] = df["price"].rolling(fast).mean()
df["ma_slow"] = df["price"].rolling(slow).mean()
df["signal"] = (df["ma_fast"] > df["ma_slow"]).astype(int) # 1 khi fast > slow
df["pos"] = df["signal"].shift(1).fillna(0)

# equity curve (giả sử không tính phí/slippage ở đây để minh họa)
df["strategy_ret"] = df["pos"] * df["ret"]
df["equity"] = (1 + df["strategy_ret"]).cumprod()

# drawdown
df["peak"] = df["equity"].cummax()
df["dd"] = df["equity"]/df["peak"] - 1

# vẽ 3 subplot chia sẻ trục x
fig, axes = plt.subplots(3, 1, figsize=(12, 10), sharex=True)

# 1) price + MA
axes[0].plot(df["price"], label="price")
axes[0].plot(df["ma_fast"], label=f"MA{fast}")
axes[0].plot(df["ma_slow"], label=f"MA{slow}")
axes[0].legend(loc="best")
axes[0].set_title("price và tín hiệu (moving average)")

# 2) equity curve
axes[1].plot(df["equity"], label="equity")
axes[1].legend(loc="best")
axes[1].set_title("equity curve")

# 3) drawdown
axes[2].plot(df["dd"], label="drawdown")
axes[2].legend(loc="best")
axes[2].set_title("drawdown")

plt.tight_layout()
plt.show()

Điểm quan trọng không phải “MA crossover” (cái này chỉ là ví dụ), mà là cách bạn đóng gói chiến lược thành một hệ thống có thể nhìn và kiểm tra. Khi bạn nhìn 3 biểu đồ cùng lúc, bạn trả lời được ngay những câu cực thực tế:

  1. equity tăng nhờ đều hay nhờ vài cú ăn may?
  2. drawdown sâu nhất là bao nhiêu? kéo dài bao lâu?
  3. giai đoạn sideway thì hệ thống bị bào mòn không?
  4. khi regime đổi (volatility tăng/giảm) thì performance có đổi không?

Đó mới là “giá trị” của matplotlib trong quant.

Trong thực tế, equity curve nên vẽ log nếu bạn nhìn dài hạn hoặc muốn so tăng trưởng theo % thay vì theo điểm. Vì tăng từ 1 lên 2 là +100%, tăng từ 100 lên 101 chỉ +1%. Nếu bạn không dùng log trong một số trường hợp, mắt bạn sẽ bị đánh lừa.

fig, ax = plt.subplots(figsize=(12, 4))
ax.plot(df["equity"])
ax.set_yscale("log")
ax.set_title("equity curve (log scale)")
plt.show()

Còn annotate thì cực hợp để “đóng đinh” các điểm quan trọng: cú rơi mạnh nhất, ngày equity lập đỉnh, hoặc điểm tín hiệu đảo chiều. Ví dụ bạn đánh dấu đáy drawdown:

dd_min_idx = df["dd"].idxmin()
fig, ax = plt.subplots(figsize=(12, 4))
ax.plot(df["dd"])
ax.annotate("max drawdown",
xy=(dd_min_idx, df.loc[dd_min_idx, "dd"]),
xytext=(dd_min_idx + 20, df["dd"].min()/2),
arrowprops=dict(facecolor="black", shrink=0.05))
ax.set_title("đánh dấu max drawdown")
plt.show()

fig.savefig("strategy_report.png", dpi=200)

Kết luận

Một chiến lược có thể có Sharpe đẹp, winrate cao, nhưng equity đi kiểu “leo dốc rồi rơi thẳng đứng” thì đó là chiến lược có tail risk. Ngược lại, một chiến lược return không quá ấn tượng nhưng drawdown kiểm soát tốt lại là thứ sống lâu. Matplotlib không tạo ra edge, nhưng nó giúp bạn nhìn thấy sự thật của hệ thống: nó kiếm tiền như thế nào, đau ở đâu, và có chịu nổi thị trường xấu không.

Nếu muốn làm bài post này “đúng vibe facebook” hơn nữa (ngắn hơn nhưng vẫn chất), nói mình sẽ rút lại thành 8–10 câu, giữ nguyên insight và ví dụ code quan trọng nhất.

Chia sẻ bài viết

Đánh giá

Hãy là người đầu tiên nhận xét bài viết này!

Đăng ký nhận tin

Nhập Email để nhận được bản tin mới nhất từ QM Capital.

Bài viết liên quan

Khả năng giải thích trong trading: Tại sao lại quan trọng?
11/04/2026
21 lượt đọc

Khả năng giải thích trong trading: Tại sao lại quan trọng? C

Khi thực hiện bất kỳ chiến lược giao dịch nào trên thị trường tài chính, một yếu tố không thể thiếu chính là khả năng giải thích (interpretability) của mô hình giao dịch. Điều này đặc biệt quan trọng trong bối cảnh môi trường biến động và khi quản lý rủi ro là yếu tố sống còn đối với các quỹ đầu tư và các trader chuyên nghiệp. Mỗi chiến lược giao dịch không chỉ cần phải hiệu quả mà còn phải dễ hiểu, có thể giải thích một cách rõ ràng tại sao tín hiệu mua/bán lại được đưa ra trong một tình huống cụ thể.

Vectorized backtesting có ích gì trong thực tế?
06/04/2026
96 lượt đọc

Vectorized backtesting có ích gì trong thực tế? C

Trong thực tế, rất nhiều ý tưởng giao dịch nghe qua đều có vẻ hợp lý. Ví dụ như mua khi giá vượt MA dài hạn, mua khi cổ phiếu breakout kèm thanh khoản tăng, hoặc đứng ngoài khi thị trường chung nằm dưới đường trung bình dài hạn. Nếu chỉ nhìn chart bằng mắt, rất dễ cảm thấy những ý tưởng như vậy “có vẻ đúng”. Vấn đề là cảm giác đó không đủ để dùng tiền thật. Với QM Capital, giá trị đầu tiên và lớn nhất của vectorized backtesting không phải là để khoe một equity curve đẹp, mà là để biến một ý tưởng mơ hồ thành một bộ quy tắc kiểm tra được.

Vì sao thực thi quan trọng hơn dự báo trong quant trading
05/04/2026
90 lượt đọc

Vì sao thực thi quan trọng hơn dự báo trong quant trading C

Khi mới học quant trading, nhiều người thường tập trung gần như toàn bộ vào phần mô hình. Họ nghĩ rằng nếu dự báo đúng hơn một chút, hoặc nếu tìm được một tín hiệu chính xác hơn phần còn lại của thị trường, thì kết quả giao dịch chắc chắn sẽ tốt. Cách nghĩ này không sai hoàn toàn, nhưng mới đúng một nửa. Trong giao dịch thực tế, dự báo chỉ là điểm bắt đầu. Sau đó còn một bước quan trọng hơn nhiều: biến tín hiệu đó thành vị thế thật, giao dịch thật, lợi nhuận thật.

Overfitting là “kẻ thù số 1” trong quant trading
02/04/2026
147 lượt đọc

Overfitting là “kẻ thù số 1” trong quant trading C

Nếu phải chọn một rủi ro làm hỏng nhiều chiến lược định lượng nhất, thì đó thường không phải là thiếu mô hình hiện đại, mà là overfitting. Nói đơn giản, overfitting xảy ra khi mô hình học quá kỹ dữ liệu quá khứ đến mức nó không chỉ học tín hiệu thật, mà còn học luôn cả nhiễu. Khi nhìn lại lịch sử, mọi thứ trông rất đẹp: độ chính xác cao, equity curve mượt, drawdown dễ chịu, Sharpe ratio hấp dẫn. Nhưng đến khi đem sang giai đoạn mới, hoặc live trading, mô hình bắt đầu hỏng rất nhanh.

Vì sao các quỹ quant lớn vẫn kiếm tiền bằng những mô hình rất đơn giản?
31/03/2026
264 lượt đọc

Vì sao các quỹ quant lớn vẫn kiếm tiền bằng những mô hình rất đơn giản? C

Có một hiểu lầm rất phổ biến khi mới bước vào quant trading: cứ nghe đến “quant” là nghĩ ngay đến deep learning, transformers, reinforcement learning, foundation models, hay ít nhất cũng phải có một thứ gì đó đủ phức tạp để nghe giống phòng lab hơn là bàn giao dịch. Nhưng nếu nhìn vào cách nhiều tổ chức thật đang vận hành, bức tranh lại bớt hào nhoáng hơn nhiều.

Ngày đáo hạn phái sinh có tạo ra một “anomaly” đủ rõ để đưa vào hệ thống giao dịch hay không?
31/03/2026
129 lượt đọc

Ngày đáo hạn phái sinh có tạo ra một “anomaly” đủ rõ để đưa vào hệ thống giao dịch hay không? C

Nếu nhìn theo kiểu tin tức, ngày đáo hạn phái sinh thường bị gắn với những cụm như rung lắc, kéo trụ, ép ATC. Nhưng với quant trading, cách hỏi như vậy vẫn còn cảm tính. Câu hỏi đúng hơn là: ngày đáo hạn có tạo ra một mẫu biến động lặp lại, đủ ổn định, đủ rõ, để mình đưa vào bộ lọc của hệ thống hay không. Đây là một câu hỏi rất hợp với thị trường Việt Nam, vì hợp đồng tương lai VN30 có lịch đáo hạn cố định vào thứ Năm lần thứ ba của tháng đáo hạn, nên bản thân nó đã là một event định kỳ, rất phù hợp để làm event study. Ngoài ra, hợp đồng VN30 hiện có hệ số nhân 100.000 đồng mỗi điểm chỉ số, nên đây không phải một sản phẩm quá nhỏ để bỏ qua khi nhìn hành vi của nhóm cổ phiếu trụ.

video-image

Truy Cập Miễn Phí Thư Viện Bot Tín Hiệu Giao Dịch Tự Động

Được nghiên cứu và phát triển bởi các chuyên gia từ QMTrade và cộng đồng nhà đầu tư chuyên nghiệp.

Truy cập ngay!