Vnstock Logo

Đo lường rủi ro và hiệu suất

Mở rộng

Mục lục

Agent Guide Notebook minh hoạ

Khuyên dùng: Nên ưu tiên sử dụng Agent Guide để nạp môi trường cho AI Agent trên máy tính cục bộ. Tránh viết code thủ công hoặc dùng AI phiên bản web/Google Colab vì AI không có thông tin mới nhất về thư viện nên dễ viết sai cú pháp.



Tổng quan

Mô-đun vnstock_quant.risk cung cấp 33 thước đo rủi ro và hiệu suất đầu tư tài chính được xây dựng theo giáo trình CFA, kiểm định đối chiếu với các thư viện quốc tế như empyrical và quantstats với sai số dấu phẩy động cực nhỏ (≤ 2e-14). Bên cạnh các chỉ số kinh điển như Sharpe, Sortino, Beta, VaR, thư viện bổ sung các thước đo thiết kế riêng cho đặc thù thị trường chứng khoán Việt Nam như hệ số thanh khoản Amihud, tỷ lệ phiên chạm biên độ trần/sàn và Beta hiệu chỉnh Dimson cho cổ phiếu giao dịch thưa.

Yêu cầu cấp tài trợ

Toàn bộ mô-đun risk mở khoá cho các tài khoản từ cấp Bronze trở lên, không đếm lượt dùng thử; phép tính vẫn tính vào hạn mức chung của tài khoản như mọi thư viện Vnstock.


Chuẩn bị dữ liệu đầu vào

Đầu vào của các hàm đo lường rủi ro là một pandas.Series chứa chuỗi lợi suất giản đơn có chỉ mục ngày (DatetimeIndex), được tính toán từ chuỗi giá đóng cửa đã điều chỉnh. Khi đo lường các chỉ số tương quan so với thị trường (Benchmark), hai chuỗi được tự động căn chỉnh theo các ngày giao dịch chung.

Python
import pandas as pd
from vnstock_quant import risk

# Cách 1: Tính chuỗi lợi suất từ chuỗi giá đóng cửa đã điều chỉnh
prices = pd.Series([50000, 50800, 49900, 51200, 52000], index=pd.to_datetime([...]))
stock_returns = risk.returns(prices)

# Cách 2: Tải trực tiếp dữ liệu cổ phiếu và chỉ số VNINDEX qua vnstock
data = risk.from_vnstock("FPT", benchmark="VNINDEX", start="2022-01-01")
r = data["returns"]       # Chuỗi lợi suất FPT
m = data["benchmark"]     # Chuỗi lợi suất VNINDEX

Các nhóm thước đo rủi ro và hiệu suất

Thư viện hỗ trợ cả việc gọi riêng lẻ từng hàm hoặc xuất toàn bộ bảng báo cáo tổng hợp.

1. Lợi suất và biến động tổng thể

  • annual_return(r): Tỷ suất sinh lời kép quy đổi theo năm (CAGR).
  • annual_volatility(r): Độ biến động chuẩn hoá theo năm (Độ lệch chuẩn lợi suất nhân căn bậc hai số phiên giao dịch trong năm).
  • sharpe_ratio(r, rf=0.03): Tỷ số Sharpe đo lường tỷ suất sinh lời vượt trội trên một đơn vị tổng rủi ro.
  • skew(r): Độ lệch phân phối lợi suất.
  • kurtosis(r): Độ nhọn phân phối (đo lường hiện tượng đuôi dày).

2. Rủi ro sụt giảm (Downside Risk)

  • downside_deviation(r, mar=0.05): Độ lệch chuẩn sụt giảm, chỉ tính các phiên có lợi suất thấp hơn ngưỡng tối thiểu chấp nhận (mar).
  • sortino_ratio(r, mar=0.05): Tỷ số Sortino đo lợi nhuận vượt trội trên rủi ro chiều giảm (không phạt biến động tăng).
  • max_drawdown(r): Mức sụt giảm tối đa từ đỉnh xuống đáy sâu nhất (trả về số âm).
  • calmar_ratio(r): Tỷ suất sinh lời quy đổi theo năm chia cho mức sụt giảm tối đa tuyệt đối.
  • ulcer_index(r): Chỉ số Ulcer đo lường cả độ sâu và thời gian chịu đựng sụt giảm giá.
  • omega_ratio(r, mar=0.05): Tỷ lệ diện tích phân phối giữa phần lãi và phần lỗ so với ngưỡng mục tiêu.

3. Rủi ro đuôi và tổn thất cực đoan (Tail Risk)

  • var(r, level=0.99, method="historical"): Giá trị chịu rủi ro (Value at Risk) trả về mức lỗ tiềm tàng lớn nhất tại ngưỡng tin cậy 99%. Hỗ trợ 3 phương pháp: "historical" (lịch sử), "normal" (phân phối chuẩn) và "cornish_fisher" (hiệu chỉnh độ lệch và độ nhọn).
  • cvar(r, level=0.99): Tổn thất kỳ vọng có điều kiện (Conditional VaR / Expected Shortfall) đo lường mức lỗ bình quân khi vượt qua ngưỡng VaR.

4. So sánh với thị trường (Benchmark-relative)

  • beta(r, m): Hệ số Beta đo lường độ nhạy của cổ phiếu so với biến động của chỉ số thị trường.
  • dimson_beta(r, m): Beta hiệu chỉnh độ trễ Dimson, khắc phục hiện tượng méo mó Beta đối với các mã cổ phiếu thanh khoản thấp hoặc giao dịch thưa.
  • down_beta(r, m) / up_beta(r, m): Hệ số Beta bất đối xứng, đo độ nhạy riêng biệt trong những phiên thị trường giảm giá và tăng giá.
  • alpha(r, m, rf=0.03): Lợi nhuận vượt trội Alpha Jensen theo mô hình CAPM.
  • information_ratio(r, m): Tỷ số thông tin đo lường năng lực tạo lợi nhuận chủ động trên độ rủi ro theo dõi (Tracking Error).
  • treynor_ratio(r, m, rf=0.03): Tỷ số Treynor đo lợi suất vượt trội trên một đơn vị rủi ro hệ thống Beta.
  • m2(r, m, rf=0.03): Thước đo Modigliani-Modigliani (M²), quy đổi tỷ số Sharpe về cùng mức biến động của thị trường.

5. Thước đo đặc thù thị trường chứng khoán Việt Nam

  • amihud(r, volume_value): Hệ số đo độ kém thanh khoản Amihud (tỷ lệ phần trăm biến động giá trên 1 tỷ đồng giá trị khớp lệnh).
  • zero_return_ratio(r): Tỷ lệ phần trăm số phiên giao dịch không có biến động giá (đứng giá hoặc mất thanh khoản).
  • limit_hit_ratio(r): Tỷ lệ phiên chạm trần hoặc sàn (biên độ ±7% HOSE).

Báo cáo rủi ro tổng hợp một lệnh

Để xem bức tranh toàn cảnh về hiệu suất và rủi ro của một cổ phiếu, bạn chỉ cần gọi hàm risk.summary():

Python
# Tạo bảng tóm tắt toàn bộ 33 chỉ số rủi ro
summary_table = risk.summary(r, m, rf=0.03)

# Hiển thị các chỉ số cốt lõi
core_metrics = ["annual_return", "annual_volatility", "sharpe_ratio", "sortino_ratio", "max_drawdown", "beta", "var"]
print(summary_table[core_metrics])

Thước đo độ kém thanh khoản Amihud

Thanh khoản là yếu tố sống còn khi giao dịch quy mô vốn lớn trên thị trường Việt Nam. Hệ số Amihud đo lường mức độ tác động của giá khi khớp một lượng tiền nhất định:

Python
# Chuỗi giá trị giao dịch tính bằng Đồng (VNĐ)
volume_value = pd.Series([25e9, 40e9, 15e9, ...], index=r.index)

# Tính hệ số Amihud toàn giai đoạn
illiquidity = risk.amihud(r, volume_value)
print(f"Amihud Ratio: {illiquidity:.6f} (% biến động trên 1 tỷ VNĐ)")

# Tính hệ số Amihud dạng trượt 60 phiên (Rolling window)
rolling_amihud = risk.amihud(r, volume_value, window=60)

Lưu ý phương pháp luận trên dữ liệu Việt Nam

Khi phân tích dữ liệu thị trường chứng khoán Việt Nam, người dùng cần lưu ý các hiện tượng cấu trúc sau:

  1. Biên độ giá trần/sàn bóp méo VaR một ngày: Do biên độ HOSE bị chặn ở ±7%, giá trị VaR 99% theo ngày của các cổ phiếu biến động mạnh thường bị chặn cứng ở mức sát 7%, che giấu rủi ro thực. Vì vậy, bạn nên chuyển sang tần suất tuần (frequency="W") và kết hợp với max_drawdown.
  2. Hiện tượng đuôi dày (Fat Tails): Phân phối lợi suất thực tế tại Việt Nam có độ nhọn (kurtosis) rất cao. VaR theo phân phối chuẩn sẽ đánh giá thấp các cú sụt giảm mạnh. Khuyến nghị bạn luôn ưu tiên sử dụng method="historical".
  3. Cổ phiếu giao dịch thưa làm giảm Beta: Những mã thanh khoản yếu có tỷ lệ zero_return_ratio cao (trên 15%) sẽ làm hệ số Beta OLS thông thường bị lệch giảm giả tạo. Hãy so sánh Beta OLS với dimson_beta hoặc tính toán theo tần suất tuần.

Đọc tiếp