Kiến trúc thư viện
Mục lục
Trang này giúp bạn hiểu cách thư viện sắp xếp các hàm, trước khi đọc tài liệu của từng nhóm dữ liệu. Đọc xong, bạn biết nên gọi hàm theo lối nào, chọn nguồn ra sao, và đọc gì trong kết quả trả về.
Tóm tắt
| Lối vào | Import | Dành cho | Tài liệu |
|---|---|---|---|
| Giao diện hợp nhất | from vnstock import Market, Reference, ... | Mã mới. Đây là lối gọi chính. | Các trang Reference, Market, Fundamental… |
| Lớp kiểu cũ | from vnstock import Quote, Listing, ... hoặc from vnstock.api import ... | Mã viết cho vnstock 4.x hoặc vnstock_data 3.x | Lớp kiểu cũ và mô-đun theo nguồn |
| Mô-đun theo nguồn | from vnstock.explorer.vci import Quote | Mã viết cho vnstock_data.explorer | Lớp kiểu cũ và mô-đun theo nguồn |
Cả ba lối cùng đi qua một lõi xử lý. Lớp kiểu cũ và mô-đun theo nguồn chỉ đổi cách gọi và tên cột về như bản cũ, rồi chuyển lời gọi sang giao diện hợp nhất. Cấp tài khoản, nguồn và lỗi vì thế giống nhau ở cả ba lối.
Thư viện chạy ở đâu
vnstock là thư viện Python chạy trên máy của bạn: máy tính cá nhân, máy chủ hay notebook do bạn
quản lý. Khi bạn gọi một hàm, truy vấn đi thẳng từ máy bạn tới nguồn bên thứ ba, không qua máy chủ
trung chuyển nào của Vnstock. Lõi xử lý nhận phản hồi, kiểm tra và chuẩn hoá về một bộ cột cố định, rồi lớp Python
đổi thành pandas.DataFrame.
Máy chủ vnstocks.com dùng để xác nhận khoá API, cấp tài khoản, hạn mức sử dụng của bạn và phát chính sách cấp quyền. Dữ liệu bạn truy xuất không đi qua đó.
Giao diện hợp nhất
Bảy lớp nằm ở gốc gói. Mỗi lớp là một nhóm dữ liệu:
| Lớp | Nhóm dữ liệu | Ví dụ | Tài liệu |
|---|---|---|---|
Reference | Danh sách mã, thông tin công ty, ngành, chỉ số, lịch sự kiện | Reference().equity.list() | Tham chiếu |
Market | Giá, khớp lệnh, bảng giá, sổ lệnh của cổ phiếu, chỉ số, ETF, phái sinh, quỹ, tài sản quốc tế | Market().equity("FPT").ohlcv() | Thị trường |
Fundamental | Báo cáo tài chính, chỉ số tài chính | Fundamental().equity("FPT").income_statement() | Cơ bản |
Macro | Kinh tế vĩ mô, tiền tệ | Macro().economy().gdp() | Vĩ mô |
Insights | Xếp hạng, dòng tiền, tâm lý thị trường | Insights().ranking.gainer() | Insights |
Analytics | Định giá P/E, P/B của chỉ số | Analytics().valuation("VNINDEX").pe() | Analytics |
Retail | Tỷ giá ngân hàng | Retail().exchange_rate() | Retail |
from vnstock import Market, Reference, FundamentalCác lớp này được nạp lười: import vnstock chưa nạp Market hay Reference, chỉ nạp khi bạn dùng
tới tên đó lần đầu. Lệnh import vì thế nhanh, và trình soạn thảo vẫn gợi ý tên, chữ ký và docstring
như bình thường.
Cấu trúc một lời gọi
Lời gọi đọc từ trái sang phải theo ba bậc: lớp, nhóm tài sản (kèm mã nếu có), rồi hàm lấy dữ liệu.
Market().equity("FPT").ohlcv(start="2026-10-01", end="2026-10-09")
# lớp nhóm(mã) hàm(tham số)Có ba dạng:
| Dạng | Ví dụ | Khi nào |
|---|---|---|
Lớp().nhóm(mã).hàm() | Market().equity("FPT").trades() | Dữ liệu của một mã |
Lớp().nhóm.hàm() | Reference().equity.list() | Dữ liệu của cả nhóm, không cần mã |
Lớp().hàm() | Market().quote(["FPT", "VCB"]) | Dữ liệu nhiều mã một lần |
Tên hàm dùng chung một bộ từ cho mọi nhóm tài sản: ohlcv là nến giá, trades là khớp lệnh, quote
là bảng giá, order_book là sổ lệnh. Tên cũ như history, intraday, price_board, price_depth
vẫn gọi được và chạy đúng hàm tương ứng.
Chọn nguồn
Mỗi hàm có một nguồn mặc định. Hàm có tham số source thì bạn chọn được nguồn khác:
from vnstock import Market
df = Market().equity("FPT").ohlcv(start="2026-10-01", end="2026-10-09") # nguồn mặc định
df = Market().equity("FPT").ohlcv(start="2026-10-01", end="2026-10-09", source="kbs") # chọn nguồnsource=viết hoa hay thường đều được.- Thư viện không tự chuyển nguồn. Nguồn bạn chọn (hoặc nguồn mặc định) lỗi thì bạn nhận ngoại lệ, không nhận dữ liệu của nguồn khác.
- Nguồn hàm không có thì nhận
UnsupportedErrormãVNSTOCK_CAPABILITY_UNAVAILABLE, kèm các nguồn dùng được:
Nguồn 'tcbs' không phục vụ market.equity.ohlcv. Nguồn dùng được: 'vci', 'asean', 'mas', 'kbs', 'vnd'.- Nguồn đã ngừng (
fmarket,mbk,btmc…) thì nhậnUnsupportedErrormãVNSTOCK_FEATURE_REMOVED, kèm nguồn dùng thay nếu có. - Nguồn thực tế của một kết quả nằm ở
df.attrs["source"].
Bảng nguồn mặc định và các giá trị source= của từng hàm ở trang
Nguồn dữ liệu.
Cấp tài khoản đổi lượng dữ liệu, không đổi cách gọi
Khách (không khoá), Cộng đồng và các cấp tài trợ dùng cùng một thư viện, cùng tên hàm, cùng tham số. Cấp tài khoản chỉ quyết định ba điều:
- Hàm nào chạy được. Gọi hàm ngoài cấp thì nhận
EntitlementErrormãVNSTOCK_TIER_ROUTE. - Nguồn nào dùng được. Khách và Cộng đồng dùng
kbs,vci,builtin,dukascopy,binance,vcb. Gọi nguồn khác thì nhậnEntitlementErrormãVNSTOCK_TIER_SOURCE. - Lấy được bao nhiêu. Khách và Cộng đồng có trần số dòng, số kỳ báo cáo và độ dài lịch sử.
Ở hai trường hợp đầu, thư viện báo lỗi trước khi gửi truy vấn nào đi. Ở trường hợp thứ ba, bạn vẫn
nhận bảng, chỉ ngắn hơn. Thư viện cảnh báo bằng UserWarning, mỗi loại cắt một lần trong một phiên chạy, nói cấp nào đã cắt
và cắt bao nhiêu, và ghi con số vào df.attrs (xem bảng bên dưới). Mức cụ thể của từng cấp ở trang
Cấp quyền và giới hạn.
Kết quả luôn là pandas.DataFrame
Hàm lấy dữ liệu của giao diện hợp nhất luôn trả pandas.DataFrame. Thư viện không in rồi trả None:
khi không lấy được dữ liệu, bạn nhận ngoại lệ có mã lỗi (xem Xử lý lỗi).
Ví dụ, chạy ngày 10/10/2026:
from vnstock import Market
df = Market().equity("FPT").ohlcv(start="2026-10-01", end="2026-10-09")
print(df.head(3)) time open high low close volume
0 2026-10-01 07:00:00+07:00 63.0 63.1 62.6 62.7 3434926
1 2026-10-02 07:00:00+07:00 62.7 63.2 62.1 62.1 3199600
2 2026-10-05 07:00:00+07:00 62.2 62.8 61.9 61.9 2513400Kiểu cột được đặt sẵn, bạn không cần đổi:
| Loại cột | Kiểu pandas | Ghi chú |
|---|---|---|
| Thời điểm | datetime64[ns, Asia/Ho_Chi_Minh] | Tài sản trong nước theo giờ Việt Nam. Tiền mã hoá, ngoại hối, hàng hoá, chỉ số thế giới theo UTC. |
| Ngày | datetime64[ns, Asia/Ho_Chi_Minh] | 0 giờ của ngày đó, cùng múi giờ với các cột thời điểm để so sánh được với nhau |
| Số thực | float64 | |
| Số nguyên | int64, hoặc Int64 khi cột có ô trống | |
| Nhóm lặp lại (sàn, loại…) | category | |
| Chữ | string | |
| Đúng/sai | boolean |
Lớp kiểu cũ có vài ngoại lệ để giữ hành vi bản cũ: Listing().symbols_by_group() trả pandas.Series,
vnstock.api.Market đặt ngày làm chỉ mục, và mô-đun theo nguồn nhận to_df=False để trả chuỗi JSON.
Chi tiết ở Lớp kiểu cũ và mô-đun theo nguồn.
df.attrs: kết quả này đến từ đâu
Mỗi bảng mang theo một từ điển df.attrs ghi lại cách nó được tạo ra. Lõi xử lý ghi phần này sau khi
nhận xong phản hồi, nên mọi hàm ghi theo cùng một cách.
print(df.attrs["source"], df.attrs["route"], df.attrs["length"])
# vci market.equity.ohlcv 7| Khoá | Ý nghĩa |
|---|---|
source | Nguồn đã dùng, ví dụ vci |
route | Tên thao tác, ví dụ market.equity.ohlcv. Đây cũng là tên bạn thấy trong thông báo lỗi và bảng cấp quyền. |
symbol, start, end, interval | Tham số của lời gọi, khi hàm có |
length | Số dòng trả về, sau khi đã áp trần của cấp |
requested_at | Thời điểm truy vấn đầu tiên rời máy bạn, giờ UTC |
latency_ms | Thời gian từ lúc gửi tới lúc nhận xong, mili giây |
request_count | Số truy vấn đã gửi, tính cả lần thử lại |
access_domain, access_protocol, access_method | Tên miền đã liên hệ (chỉ tên miền gốc), giao thức, phương thức |
source_name, organisation | Tên nguồn và tổ chức vận hành nguồn |
terms_url, robots_txt | Đường dẫn điều khoản và tóm tắt tệp robots.txt của nguồn, để bạn tự đối chiếu |
tool, is_tool_only, disclaimer | Tên công cụ và tuyên bố miễn trừ ngắn |
algorithm_role, algorithm_participation | Thư viện chỉ chuyển và chuẩn hoá dữ liệu (technical_connector), hay tính thêm từ dữ liệu gốc (derived_calculation, ở Analytics và Insights) |
cap_tier, tier_cap_rows, tier_cap_history_days, tier_cap_periods, tier_cap_level, cap_rows_dropped | Chỉ có khi cấp tài khoản đã cắt kết quả: cấp nào, trần bao nhiêu, bỏ bao nhiêu dòng |
request_cap_rows, request_cap_window | Chỉ có khi một lần truy vấn tới nguồn chạm trần số nến, áp dụng cho mọi cấp |
Khoá nào có còn tuỳ hàm. Bảng không đi qua mạng (dữ liệu có sẵn trong thư viện, hoặc bảng rỗng) không
có requested_at.
df.attrs là tính năng của pandas: phép lọc, cắt dòng thường giữ nó, nhưng một số phép như merge
hay concat có thể làm mất. Muốn giữ lại, đọc nó ngay sau lời gọi.
Trích dẫn nguồn gốc
Khi bài nghiên cứu cần ghi số liệu lấy từ đâu, dùng vnstock.cite() để có một dòng trích dẫn:
import vnstock
print(vnstock.cite(df))market.equity.ohlcv via <tên miền của nguồn>, retrieved 2026-10-10T09:08:22.498000Z (vnstock, source=vci)Dòng này gồm tên thao tác, tên miền gốc đã liên hệ, thời điểm truy xuất theo UTC và nguồn. Bảng
không đi qua mạng thì nhận "No data origin was recorded for this result.", thư viện không đoán.
Muốn xem đủ, dùng vnstock.provenance.summary(df). Hàm trả một đoạn nhiều dòng tiếng Việt: công cụ,
thời gian truy xuất, nguồn và tổ chức, thao tác, tên miền, vai trò của thư viện, tóm tắt robots.txt,
đường dẫn điều khoản tham khảo, tuyên bố miễn trừ.
from vnstock import provenance
print(provenance.summary(df))
record = provenance.read(df) # cùng thông tin, dạng đối tượng
record.to_dict() # dạng dict, tiện ghi vào phụ lục[Thông tin nguồn gốc dữ liệu - vnstock]
• Công cụ: vnstock (phần mềm chạy trên máy người dùng, chỉ đóng vai trò công cụ hỗ trợ)
• Thời gian truy xuất: 2026-10-10T09:08:22.498Z
• Nguồn kết nối: Vietcap (vci) — Công ty CP Chứng khoán Vietcap
• Thao tác: market.equity.ohlcv
...Đường dẫn điều khoản và tóm tắt robots.txt chỉ để tham khảo; điều khoản của nguồn có thể đổi bất cứ lúc nào. Bạn tự đối chiếu và tuân thủ điều khoản của nguồn mình dùng.
Tự tra cứu hàm: show_api() và show_doc()
Bạn không cần mở trang web để xem một lớp có hàm gì.
from vnstock import show_api, show_doc, Market, Reference, Analytics
show_api() # các lớp gốc
show_api(Market()) # cây hàm của Market, đi xuống cả các nhóm con
show_doc(Reference().equity) # hàm của một nhóm, kèm chữ ký và dòng mô tả đầuEquityReference — 6 method(s)
by_exchange () -> 'pd.DataFrame'
Tên khác của :meth:`list_by_exchange`, vẫn dùng được.
by_group (group: 'str') -> 'pd.DataFrame'
Tên khác của :meth:`list_by_group`, vẫn dùng được.
list () -> 'pd.DataFrame'
Lấy danh sách toàn bộ mã cổ phiếu.
...show_api() không kèm đối số liệt kê sáu lớp Market, Fundamental, Reference, Analytics,
Insights, Macro. Lớp Retail có một hàm, xem bằng show_doc(Retail()). Mọi hàm công khai đều có
docstring hai thứ tiếng, nên help(Market().equity("FPT").ohlcv) cũng đọc được trong notebook.
Ngôn ngữ thông báo
Cảnh báo, thông báo lỗi và đầu ra dòng lệnh hiện cả tiếng Việt lẫn tiếng Anh (tiếng Việt trước) khi bạn chưa chọn. Đổi lâu dài bằng dòng lệnh:
vnstock settings language # xem đang dùng gì
vnstock settings language vi # chỉ tiếng Việt
vnstock settings language en # chỉ tiếng Anh
vnstock settings language default # trở lại song ngữChỉ đổi cho một lần chạy thì đặt biến môi trường VNSTOCK_LANG=vi (hoặc en, both). Ngôn ngữ chỉ đổi
chữ hiển thị. Tên cột, mã lỗi và dữ liệu giữ nguyên. Xem thêm ở
Đăng nhập và dòng lệnh.
Khi nguồn từ chối truy cập
Lõi xử lý tự lo việc thử lại khi cần. Khi nguồn từ chối hẳn (giới hạn tốc độ, chặn truy cập, đòi xác minh), lời gọi dừng ngay và báo lỗi có mã, không âm thầm đổi nguồn. Các lỗi hay gặp bắt được thẳng từ gốc gói:
from vnstock import Market, RateLimitedError, DataSourceBlockedError, ChallengeRequiredError
try:
df = Market().equity("FPT").trades()
except RateLimitedError:
... # chờ một lúc rồi gọi lại, hoặc giảm tần suấtBản vnstock_data từng có bộ ngắt mạch: sau nhiều lần bị từ chối, thư viện tạm ngừng gọi một máy chủ
trong một khoảng thời gian. Thế hệ 5 không giữ trạng thái đó, vì mỗi lời gọi bị từ chối đã dừng ngay.
Hai hàm cũ vẫn gọi được để mã cũ không lỗi:
import vnstock
vnstock.circuit_status() # {} luôn rỗng: không có máy chủ nào đang bị tạm ngừng
vnstock.reset_circuit() # 0 luôn bằng 0: không có gì để xoáCircuitOpenError vẫn có ở gốc gói để câu except cũ không lỗi khi import. Danh sách đủ các lỗi và
cách xử lý ở Xử lý lỗi.
Lớp kiểu cũ và mô-đun theo nguồn
Mã viết cho bản cũ chạy tiếp mà không phải viết lại:
# vnstock 4.x, vnstock_data 3.x
from vnstock import Quote
df = Quote(symbol="FPT", source="vci").history(start="2026-10-01", end="2026-10-09")
# vnstock_data.explorer
from vnstock.explorer.vci import Quote
df = Quote("FPT").history(start="2026-10-01", end="2026-10-09")Hai lời gọi trên trả đúng bảng của Market().equity("FPT").ohlcv(..., source="vci"). Lớp kiểu cũ ở gốc
gói gồm Quote, Listing, Company, Finance, Trading, TopStock, Fund; vnstock.api có thêm
Market và Macro kiểu cũ. Mô-đun theo nguồn còn vci, kbs, mas, asean, cafef, misc, msn.
Import vnstock.explorer báo DeprecationWarning; một số tên có ngày ngừng. Tra cứu đủ từng lớp, từng
hàm ở Lớp kiểu cũ và mô-đun theo nguồn.
Mã mới nên gọi thẳng giao diện hợp nhất: tên hàm thống nhất, cột chuẩn hoá, và không có ngày ngừng.