Chọn nguồn
Mục lục
Trang này viết cho vnstock v6.0.0rc2, bản thử nghiệm. Tên hàm, tham số và cột dữ liệu có thể còn đổi trước ngày phát hành; khi cài, ghi rõ số phiên bản như ở trang Cài đặt. Bản đang phát hành chính thức là v5.0.1, xem tài liệu bản đó.
Chọn nguồn bạn có khoá, mã trên trang sẽ điền theo. Chưa chọn thì mã giữ chỗ trống <nguồn>. Nguồn xếp theo bảng chữ cái, không phải khuyến nghị.
vnstock thế hệ 6 không tự chọn nguồn. Mỗi nguồn dùng tài khoản và điều kiện truy cập riêng, nên bạn
quyết định nguồn nào phục vụ từng hàm. Có hai cách: nêu nguồn ngay trong lời gọi hoặc đặt sẵn quy tắc bằng
vnstock.sources.
Nêu nguồn trong lời gọi
from vnstock import Market
Market("<nguồn>").equity("FPT").ohlcv(start="2026-10-01") # cả đối tượng dùng nguồn này
Market().equity("FPT").ohlcv(source="<nguồn>", start="2026-10-01") # chỉ lời gọi nàyMỗi hàm có bộ nguồn riêng. Danh sách mã chẳng hạn:
from vnstock import Reference
Reference("<nguồn>").equity.list()Khi nêu nguồn trong lời gọi, vnstock dùng đúng nguồn đó và không chuyển sang nguồn dự phòng.
Không nêu nguồn và chưa đặt quy tắc thì hàm báo VNSTOCK_INPUT_SOURCE, kèm danh sách nguồn đọc được
hàm đó.
Đặt sẵn nguồn bằng vnstock.sources
from vnstock import Market, sources
sources.use("<nguồn A>") # mọi hàm
sources.use("<nguồn B>", "<nguồn C>", route="market.crypto.*") # nhóm tiền mã hoá; nguồn C là dự phòng
sources.use("<nguồn D>", route="market.equity.quote") # riêng bảng giá cổ phiếu
Market().equity("FPT").quote() # nguồn D
Market().crypto("BTCUSDT").ohlcv() # nguồn B
Market().equity("FPT").ohlcv() # nguồn Aroute là tên nhóm dữ liệu theo dạng lớp.nhóm.hàm, đúng như tên in trong thông báo lỗi:
market.equity.ohlcv, reference.equity.list. Dùng * để chọn nhiều tên một lúc
(market.crypto.*, market.*.ohlcv). Bỏ route là đặt cho mọi hàm.
Quy tắc nào được dùng
Khi lời gọi không nêu nguồn, vnstock xét quy tắc theo thứ tự:
- quy tắc đặt đúng tên hàm (
market.equity.quote); - quy tắc dùng mẫu, mẫu càng cụ thể càng được xét trước (
market.crypto.*trướcmarket.*); - quy tắc cho mọi hàm.
Nếu các nguồn trong một quy tắc không hỗ trợ hàm đang gọi, vnstock xét tiếp quy tắc sau. Vì vậy, quy tắc chung cho một nguồn vẫn dùng được cùng quy tắc riêng cho dữ liệu tiền mã hoá qua nguồn khác.
Nguồn dự phòng
Các nguồn sau nguồn đầu tiên là dự phòng, thử theo thứ tự, chỉ khi nguồn trước không phục vụ được:
| Chuyển sang nguồn kế tiếp | Không chuyển, báo lỗi ngay |
|---|---|
| Nguồn không đọc được hàm này | Thiếu khoá (CredentialError) |
Mất kết nối, hết thời gian chờ (NetworkError) | Nguồn từ chối khoá, cần OTP (AuthError) |
Nguồn lỗi (SourceError) | Nguồn đang tạm tắt theo chính sách (PolicyError) |
Nguồn giới hạn tần suất (RateLimitError) | Tham số sai (InputError) |
Các lỗi ở cột phải cần người dùng xử lý, nên vnstock báo ngay thay vì che lỗi bằng một nguồn khác.
Kết quả ghi lại cách nguồn được chọn:
df = Market().crypto("BTCUSDT").ohlcv()
df.attrs["source"] # '<nguồn B>'
df.attrs["source_rule"] # 'market.crypto.*'
df.attrs.get("source_skipped") # các nguồn đã thử trước đó và lý do, nếu cóXem, bỏ, lưu quy tắc
sources.show() # bảng quy tắc, cụ thể nhất trước, kèm số hàm mỗi quy tắc phủ
sources.which("market.equity.quote") # quy tắc nào áp dụng, các nguồn sẽ thử, các nguồn đọc được
sources.get("market.crypto.ohlcv") # ['<nguồn B>', '<nguồn C>']
sources.readers("market.equity.ohlcv") # nguồn đọc được hàm này
sources.clear("market.equity.quote") # bỏ một quy tắc
sources.clear() # bỏ mọi quy tắc
sources.save() # ghi ~/.vnstock/sources.json
sources.load() # nạp lạiĐể tự nạp quy tắc khi mở Python, hãy đặt biến môi trường VNSTOCK_SOURCES trỏ tới tệp đã lưu.
vnstock không tự tìm tệp nếu thiếu biến này.
sources.use kiểm ngay khi bạn đặt: nguồn không tồn tại, mẫu không khớp hàm nào (VNSTOCK_INPUT_ROUTE),
hay không nguồn nào đọc được các hàm khớp mẫu đều báo lỗi. Tệp lưu bị hỏng thì load() báo lỗi và giữ
nguyên quy tắc đang có.
Nguồn nào đọc được hàm nào
Bảng đầy đủ ở Tham chiếu và
Thị trường. Trong mã, dùng sources.readers(route). Trong terminal,
vnstock tools --source <nguồn> liệt kê mọi hàm đọc được từ một nguồn.
