Vnstock Logo

Quy ước dữ liệu và lỗi

Cộng đồng

Mục lục

Trang dùng chung với v0.5.0

Nội dung trang này giữ nguyên từ bản v0.5.0, chưa viết riêng cho free: ví dụ chạy được nếu tên hàm không đổi. Bản gốc: /docs/vnstock_quant/bat-dau/quy-uoc-du-lieu-va-loi.

Trang này gom những điều đúng với mọi nhóm hàm của vnstock_quant: dữ liệu đầu vào trông như thế nào, lỗi được báo ra sao và các quy ước tính toán mà kết quả tuân theo. Từng trang nhóm hàm chỉ nói phần riêng của nhóm đó.


Dữ liệu đầu vào

Thư viện nhận dữ liệu dạng pandas và trả kết quả căn theo chỉ mục bạn đưa vào. Lớp Python chỉ đổi cột sang mảng số rồi dựng lại bảng có nhãn; mọi phép tính và kiểm tra đầu vào nằm trong lõi Rust, nên thiếu cột hay lệch độ dài được báo bằng InputDataError kèm tên cột thiếu.

Nhóm hàmDạng dữ liệuGhi chú
ta, backtest, micro.cvd, micro.realizedBảng nến: cột open, high, low, close, volume viết thường, chỉ mục thời gian DatetimeIndex hoặc cột timeta chỉ cần các cột mà chỉ báo dùng; backtest nhận thêm price_unit để nhận ra bảng tính bằng nghìn đồng hay đồng
risk, portfoliopandas.Series hoặc DataFrame lợi suất giản đơn từng kỳ, chỉ mục DatetimeIndexTính từ giá đóng cửa đã điều chỉnh bằng risk.returns(prices); hai chuỗi được căn theo ngày giao dịch chung
faBáo cáo tài chính dạng long: cột period, id, value với mã chỉ tiêu của vnstock, gói trong fa.DatasetChỉ số dùng mẫu số bình quân cần ít nhất hai kỳ
pricesBảng phiên của trade_history() (giá tham chiếu, trần, sàn, OHLC, khối lượng) và bảng sự kiện của events()Đơn vị đồng; unit="auto" nhận ra bảng nghìn đồng của ohlcv()
micro.bars, micro.classifyBảng khớp lệnh: time, price, volume, cột bên chủ động nếu nguồn có (match_type)Nguồn không có bên chủ động thì suy bằng tick rule

Kết quả là DataFrame hoặc Series cùng chỉ mục với đầu vào. Siêu dữ liệu đi kèm nằm trong attrs (ví dụ bảng hệ số của prices.adjust ở attrs["factors"]). Thư viện không tự đổi đơn vị giá trừ khi hàm có tham số unit hoặc price_unit; hãy dùng một đơn vị nhất quán trong cả phiên làm việc.


Hệ thống phân cấp ngoại lệ

Các lỗi của thư viện kế thừa từ VnstockQuantError. Mã lỗi giúp bạn phân biệt sai tham số, dữ liệu đầu vào, quyền sử dụng và những trường hợp khác:

Text
VnstockQuantError (Lớp cơ sở)
├── InvalidParameterError      # Tham số sai tên, sai kiểu hoặc ngoài khoảng (mã: QUANT_INVALID_PARAMETER)
├── UnknownIndicatorError      # Không có chỉ báo, tính năng hay hàm mang tên đó (mã: QUANT_UNKNOWN_INDICATOR,
│                              #   QUANT_UNKNOWN_FEATURE, QUANT_UNKNOWN_FUNCTION)
├── UnknownRatioError          # Mã chỉ số tài chính không tồn tại (mã: QUANT_UNKNOWN_RATIO)
├── InputDataError             # Dữ liệu đầu vào thiếu cột hoặc các cột lệch độ dài (mã: QUANT_INPUT_DATA)
│   └── CausalityViolationError  # Tín hiệu hoặc chỉ báo trong backtest đọc dữ liệu tương lai (mã: QUANT_CAUSALITY_VIOLATION)
├── DependencyError            # Thiếu thư viện phụ trợ, ví dụ chưa cài vnstock (mã: QUANT_DEPENDENCY_MISSING)
├── EntitlementError           # Cấp quyền hiện tại không mở tính năng này
│   ├── TierRequiredError      # Cần gói quyền sử dụng cao hơn (mã: QUANT_TIER_REQUIRED, QUANT_SCOPE_LIMIT)
│   └── QuotaExceededError     # Hết lượt dùng thử trong ngày, hoặc một lần chạy thử quá lớn cho cấp (mã: QUANT_TRIAL_EXHAUSTED, QUANT_QUOTA_LIMIT)
├── AuthError                  # Lỗi API key, thiết bị hoặc kết nối máy chủ cấp quyền
├── UnsupportedError           # Bản phát hành đã bị tắt, cần nâng cấp (mã: VNSTOCK_RELEASE_DISABLED)
│   └── ReleaseExpiredError    # Bản phát hành đã hết hạn hiệu lực (mã: VNSTOCK_RELEASE_EXPIRED)
└── InternalError              # Lỗi ngoài dự kiến bên trong thư viện

Mọi lỗi đều có các thuộc tính code (mã lỗi), kind (nhóm lỗi), message (nội dung tiếng Việt), retryable (có nên thử lại không) và action (việc nên làm tiếp, có thể là None). str(e) có dạng [code] message (action).

Ví dụ bắt lỗi theo nghiệp vụ

Python
import vnstock_quant as vq

try:
    # Ví dụ gọi hàm tính toán cần quyền hạn
    result = vq.portfolio.twr(values, flows)
except vq.TierRequiredError as e:
    print(f"Lỗi quyền hạn: {e.message}")
    print(f"Việc nên làm: {e.action}")
except vq.QuotaExceededError as e:
    print(f"Đã hết lượt dùng thử hôm nay [{e.code}]. Lượt sẽ được làm mới lúc 00:00 giờ Việt Nam.")
except vq.AuthError as e:
    print(f"Không kiểm tra được quyền sử dụng: {e}")
except vq.InvalidParameterError as e:
    print(f"Tham số không hợp lệ: {e}")
except vq.VnstockQuantError as e:
    print(f"Lỗi chung của vnstock_quant: {e}")

Tắt cảnh báo hệ thống

Các lưu ý không làm dừng chương trình được phát qua lớp cảnh báo VnstockQuantWarning (ví dụ: cảnh báo tự động bỏ qua các chỉ số nâng cao khi chạy tính toán hàng loạt toàn bộ chỉ số ở cấp Cộng đồng). Bạn có thể tắt cảnh báo này nếu muốn:

Python
import warnings
from vnstock_quant import VnstockQuantWarning

# Bỏ qua các cảnh báo không trọng yếu của vnstock_quant
warnings.filterwarnings("ignore", category=VnstockQuantWarning)

Các quy ước phương pháp luận chung

Trước khi so sánh kết quả giữa các hàm, hãy chú ý các quy ước sau:

Quy ướcChi tiết áp dụng
Tỷ lệ và phân sốMọi tỷ lệ phần trăm được biểu diễn dưới dạng phân số thập phân (ví dụ 0.18 đại diện cho 18%). Kết quả tính toán trả về cũng tuân thủ định dạng phân số.
Giá và chuỗi lợi suấtChuỗi lợi suất giản đơn được tính toán dựa trên giá đóng cửa đã điều chỉnh (adjusted close). Việc dùng giá chưa điều chỉnh sẽ tạo ra các phiên thua lỗ giả tạo vào ngày giao dịch không hưởng quyền.
Số phiên giao dịch một nămMặc định sử dụng 252 phiên/năm theo chuẩn quốc tế đối với dữ liệu ngày (52 tuần, 12 tháng). Dữ liệu thực tế tại sàn HOSE giai đoạn 2017–2025 ghi nhận trung bình 249,8 phiên/năm. Bạn có thể truyền periods=250 vào các hàm rủi ro nếu muốn quy đổi chuẩn xác theo năm dựa trên lịch giao dịch Việt Nam.
Lãi suất phi rủi ro (rf)Là lãi suất năm, mặc định là 0. Bạn có thể chỉ định lãi suất trái phiếu Chính phủ kỳ hạn 1 năm hoặc lãi suất tiết kiệm 12 tháng của nhóm ngân hàng Big 4.
Chỉ mục thời gian (time)Căn cứ vào DatetimeIndex của pandas. Khi tính toán tương quan hoặc đo lường so với thị trường (Benchmark), hai chuỗi dữ liệu được căn chỉnh theo ngày giao dịch chung, không căn chỉnh theo số thứ tự hàng.
Xử lý dữ liệu khuyết thiếuKhông bao giờ âm thầm điền số 0 vào ô trống. Báo cáo tài chính thiếu chỉ tiêu sẽ được đánh dấu rõ ràng qua cột reason. Các hàm danh mục sẽ từ chối tính toán nếu chuỗi lợi suất chứa giá trị NaN.
Độ đo rủi ro sụt giảm (VaR/CVaR)Trả về giá trị dương đại diện cho mức lỗ tiềm tàng tại ngưỡng tin cậy xác định.
Ràng buộc bán khống (Short-selling)Không cho phép vị thế bán khống trong các bài toán tối ưu danh mục, phù hợp với quy định của thị trường chứng khoán cơ sở Việt Nam.

Đọc tiếp