Đo lường rủi ro và hiệu suất
Mục lục
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.
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.
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 VNINDEXCá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():
# 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:
# 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:
- 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ớimax_drawdown. - 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ụngmethod="historical". - 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_ratiocao (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ớidimson_betahoặc tính toán theo tần suất tuần.
Đọc tiếp
- Quản lý danh mục đầu tư — Đo lường TWR/MWR, phân bổ rủi ro và tối ưu hoá danh mục.
- Mô hình định giá — Định giá chiết khấu cổ tức và xác định P/E hợp lý.
- Chỉ báo kỹ thuật — Sử dụng 58 chỉ báo kỹ thuật với tốc độ cao.