Vnstock Logo

Rủi ro và hiệu suất

Mở rộng

Mục lục

Tính năng đang thử nghiệm

Tính năng trên trang này đang trong giai đoạn phát triển thử nghiệm và chưa ổn định. Bạn dùng được để tìm hiểu và chạy thử, nhưng tên hàm hay công cụ, tham số và cấu trúc kết quả có thể còn đổi giữa các bản phát hành, cách tính và cách xử lý cũng có thể còn được hiệu chỉnh.

Hãy đối chiếu kết quả với một cách tính độc lập trước khi đưa vào quy trình nghiên cứu, và ghim phiên bản thư viện trong dự án để mã đang chạy không tự đổi theo bản mới.

Tổng quan

vnstock_quant.risk tính các thước đo như Sharpe, Sortino, Beta, VaR, mức sụt giảm từ đỉnh và độ kém thanh khoản Amihud. Một số hàm giúp bạn xem hiện tượng thường gặp ở dữ liệu Việt Nam, chẳng hạn phiên chạm trần hoặc sàn và cổ phiếu giao dịch thưa. Mỗi thước đo trả lời một câu hỏi khác nhau; hãy chọn theo dữ liệu và mục đích so sánh của bạn.

Yêu cầu cấp quyền sử dụng

Toàn bộ mô-đun risk mở cho tài khoản từ cấp Bronze trở lên. Giới hạn 30 lượt dùng thử của bản Cộng đồng không áp dụng ở các cấp này; mỗi phép tính vẫn được ghi nhận vào quỹ hạn mức chung của tài khoản Vnstock.


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

Phần lớn hàm nhận pandas.Series chứa lợi suất từng kỳ, với ngày giao dịch làm chỉ mục (DatetimeIndex). Bạn có thể tính chuỗi này từ giá đóng cửa đã điều chỉnh. Khi so sánh với chỉ số thị trường, hãy kiểm tra khoảng ngày của hai chuỗi; thư viện căn chúng 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

Bạn có thể gọi từng hàm hoặc xem nhiều thước đo trong một bảng tổng hợp.

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

  • annual_return(r): Lợi suất 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 lợi suất 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 khi giá giảm

  • 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): Lợi suất 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. Các khoản lỗ ít gặp nhưng lớn

  • var(r, level=0.99, method="historical"): VaR ước tính ngưỡng lỗ tại mức tin cậy 99% trong kỳ dữ liệu đang xét; khoản lỗ thực tế vẫn có thể vượt ngưỡng này. Hỗ trợ "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 chỉ số tham chiếu

  • 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ảng tóm tắt rủi ro

Để xem nhiều thước đo trong cùng một bảng, gọi 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ố quan trọng khi phân tích danh mục 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. Bạn nê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