Dữ liệu quỹ mở
Mục lục
Nhóm hàm quỹ mở chạy với khoá API từ cấp tài trợ Bronze trở lên. Khoá cấp Cộng đồng hoặc chạy không khoá nhận lỗi EntitlementError (mã VNSTOCK_TIER_SOURCE hoặc VNSTOCK_TIER_ROUTE), và thư viện không gửi truy vấn nào đi. Bản 4.x từng mở Fund() cho mọi người; từ thế hệ 5 thì không.
Nhóm hàm này giúp bạn tự truy xuất thông tin quỹ mở (chứng chỉ quỹ) tại Việt Nam: danh mục quỹ kèm NAV mới nhất, lịch sử NAV, mười khoản nắm giữ lớn nhất, tỷ trọng theo ngành và loại tài sản, biểu phí, tài liệu quỹ, lợi nhuận theo kỳ và cổ tức tiền mặt.
Hàm nằm ở hai chỗ, theo đúng cách chia của thư viện:
Reference().fund: thông tin ít thay đổi. Danh mục quỹ, hồ sơ, biểu phí, tài liệu.Market().fund(symbol): số liệu biến động của một quỹ. NAV, lợi nhuận, cổ tức, danh mục nắm giữ.
Hai nguồn được hỗ trợ. Không truyền source thì thư viện dùng CafeF. DigiInvest
có thêm tên quỹ, phí quản lý, ngày thành lập trong danh mục, lịch sử NAV dài hơn, và là
nguồn duy nhất có cổ tức quỹ.
1. Khởi tạo
from vnstock import Market, Reference
ref = Reference()
mkt = Market()Mã quỹ là mã chứng chỉ quỹ, ví dụ DCDS, VESAF, SSISCA. Thư viện không phân biệt chữ
hoa, chữ thường.
2. Danh mục quỹ — Reference().fund.list()
ref.fund.list(fund_type=None, symbol=None, *, source=None)| Tham số | Kiểu | Mặc định | Ý nghĩa |
|---|---|---|---|
fund_type | str | None | equity_fund (quỹ cổ phiếu), bond_fund (quỹ trái phiếu), balanced_fund (quỹ cân bằng). Nhận cả cách viết cũ STOCK, BOND, BALANCED. Để trống thì lấy mọi loại |
symbol | str | None | Chỉ giữ quỹ có mã chứa chuỗi này, ví dụ "DC" |
source | str | "cafef" | "cafef" hoặc "digiinvest" |
funds = ref.fund.list() # mọi quỹ
bond_funds = ref.fund.list("bond_fund") # chỉ quỹ trái phiếu
dc_funds = ref.fund.list(symbol="DC", source="digiinvest")Trả về một dòng cho mỗi quỹ: ticker, organ_name, organ_short_name, fund_type,
management_fee, inception_date, nav, nav_update_at.
Dữ liệu mẫu (source="digiinvest", chạy ngày 06/10/2026):
| ticker | organ_name | organ_short_name | fund_type | management_fee | inception_date | nav | nav_update_at |
|---|---|---|---|---|---|---|---|
| DCIP | Quỹ đầu tư trái phiếu gia tăng thu nhập cố định DC | Dragon Capital | bond_fund | 1.20 | 2021-05-24 | 12420.0 | 2026-10-06 |
| DCDS | Quỹ đầu tư Chứng khoán Năng động DC | Dragon Capital | equity_fund | 1.95 | 2004-05-20 | 93322.0 | 2026-10-06 |
| DCDE | Quỹ đầu tư Cổ phiếu Tập trung Cổ tức DC | Dragon Capital | equity_fund | 1.93 | 2008-02-28 | 24538.0 | 2026-10-06 |
Hai nguồn khác nhau ở mấy chỗ đáng biết:
| CafeF (mặc định) | DigiInvest | |
|---|---|---|
| Số quỹ (06/10/2026) | 43: 24 cổ phiếu, 15 trái phiếu, 4 cân bằng | 33 |
organ_name, management_fee, inception_date | để trống | có |
organ_short_name | tên đầy đủ công ty quản lý quỹ | tên ngắn, ví dụ Dragon Capital |
| NAV | lẻ tới 0,01 đồng | làm tròn tới đồng |
| Thứ tự dòng | theo lợi nhuận bình quân 3 năm, cao trước | theo thứ tự của nguồn |
3. Thông tin một quỹ — Reference().fund(symbol)
Gắn mã quỹ một lần rồi gọi các hàm bên dưới, hoặc truyền mã vào từng hàm:
dcds = ref.fund("DCDS")
dcds.profile()
ref.fund.profile("DCDS") # cùng kết quảprofile() — hồ sơ quỹ
Một dòng gồm: công ty quản lý, mô tả chiến lược, ngày thành lập, tổng tài sản (đồng), số tiền đầu tư tối thiểu (đồng), ngày giao dịch, đại lý chuyển nhượng, chỉ số tham chiếu, NAV mới nhất và trang web của quỹ.
p = ref.fund("DCDS").profile()
p[["ticker", "total_assets", "min_investment", "trading_frequency", "benchmark", "nav"]]| ticker | total_assets | min_investment | trading_frequency | benchmark | nav |
|---|---|---|---|---|---|
| DCDS | 6.0707e+12 | 100000.0 | Từ thứ 2 đến thứ 6 | VN Index | 93322.27 |
fee_structure() — biểu phí
Phí mua, bán, chuyển đổi, mỗi bậc một dòng. Cột range giữ nguyên nhãn bậc như quỹ công
bố, vì cùng một loại bậc có quỹ tính theo tháng, có quỹ tính theo năm.
ref.fund("DCDS").fee_structure()| fee_type | basis | range | fee | unit |
|---|---|---|---|---|
| redemption | holding_period | < 12 Tháng | 1.5 | % |
| redemption | holding_period | 12-24 Tháng | 0.5 | % |
| redemption | holding_period | >= 24 Tháng | 0.0 | % |
| purchase | transaction_value | Không giới hạn | 0.0 | % |
reports() — tài liệu quỹ
Bản cáo bạch, điều lệ, báo cáo định kỳ, kèm đường dẫn tới tệp.
ref.fund("DCDS").reports()| report_type | title | period | url |
|---|---|---|---|
| prospectus | Bản cáo bạch quỹ | T1/2025 | https://cafefnew.mediacdn.vn/FUND/DCDS_DCDS-whitepaper.pdf |
| regulation | Điều lệ quỹ | 13/05/2024 | https://cafefnew.mediacdn.vn/FUND/DCDS_REGULATION_FUND.pdf |
Ba hàm profile(), fee_structure(), reports() chỉ có từ CafeF.
4. NAV, lợi nhuận và cổ tức — Market().fund(symbol)
history() — lịch sử NAV
mkt.fund("DCDS").history(source=None)Trả về NAV trên một chứng chỉ quỹ theo từng kỳ quỹ công bố, cũ nhất trước: time, nav.
Không có tham số start, end: hàm trả toàn bộ lịch sử nguồn có, bạn tự cắt theo ngày.
nav = mkt.fund("DCDS").history()
nav[nav["time"] >= "2026-01-01"]| CafeF | DigiInvest | |
|---|---|---|
| DCDS, chạy 06/10/2026 | 2.802 dòng, từ 11/03/2005 | 3.339 dòng, từ 01/06/2004 |
| Độ chi tiết của NAV | 0,01 đồng | làm tròn tới đồng |
ohlcv() là tên khác của history(). Quỹ mở chỉ công bố NAV, không có giá mở, cao, thấp,
đóng.
performance() — lợi nhuận theo kỳ
Lợi nhuận từ đầu năm, 3 năm và 5 năm, đúng ba kỳ mà trang quỹ công bố. Kỳ 3 năm và 5 năm là
lợi nhuận kép bình quân mỗi năm, cột annualized cho biết dòng nào như vậy.
mkt.fund("DCDS").performance()| period | period_label | nav_start | nav_end | return_percent | annualized |
|---|---|---|---|---|---|
| ytd | Từ đầu 2026 | 108177.37 | 93322.27 | -13.73 | False |
| 3y | LN kép TB 3 năm | 63953.11 | 93322.27 | 13.42 | True |
| 5y | LN kép TB 5 năm | 74262.80 | 93322.27 | 4.67 | True |
dividends() — cổ tức tiền mặt
Số tiền chia trên mỗi chứng chỉ quỹ (đồng), mới nhất trước. Chỉ DigiInvest có dữ liệu này, nên thư viện tự dùng DigiInvest. Quỹ chưa từng chia cổ tức trả về bảng rỗng.
mkt.fund("DCDE").dividends()| date | amount |
|---|---|
| 2026-07-14 | 1900.0 |
| 2025-05-20 | 1400.0 |
| 2024-06-07 | 1300.0 |
5. Danh mục nắm giữ — Market().fund(symbol)
Ba hàm đọc từ báo cáo danh mục hằng tháng gần nhất của quỹ, chỉ có từ CafeF.
holdings() — mười khoản nắm giữ lớn nhất
mkt.fund("DCDS").holdings()| update_at | ticker | industry | net_asset_percent | asset_type |
|---|---|---|---|---|
| 2025-12-31 | VIC | Phát triển bất động sản | 11.46 | equity |
| 2025-12-31 | VHM | Phát triển bất động sản | 6.13 | equity |
| 2025-12-31 | MWG | Thiết bị điện tử, viễn thông | 5.79 | equity |
update_atlà ngày cuối của tháng báo cáo. Nguồn chỉ ghi "theo báo cáo tháng 12/2025", không ghi ngày cụ thể.asset_typelàequity(cổ phiếu) hoặcbond(trái phiếu). Quỹ trái phiếu liệt kê trái phiếu trong cùng bảng.- Quỹ không công bố danh mục, hoặc chưa có báo cáo, trả về bảng rỗng có đủ cột, không báo lỗi.
industry_allocation() — tỷ trọng theo ngành
mkt.fund("DCDS").industry_allocation()| industry | net_asset_percent |
|---|---|
| Bất động sản | 33.10 |
| Ngân hàng | 23.64 |
| Bán lẻ | 5.79 |
asset_allocation() — tỷ trọng theo loại tài sản
mkt.fund("DCDS").asset_allocation()| asset_type | asset_percent |
|---|---|
| equity | 85.93 |
| cash_and_equivalents | 10.39 |
Tổng các dòng có thể nhỏ hơn 100 khi quỹ có loại tài sản mà báo cáo không tách riêng.
6. Bảng hàm và nguồn
| Hàm | CafeF | DigiInvest |
|---|---|---|
Reference().fund.list() | ✅ mặc định | ✅ |
Reference().fund(sym).profile() | ✅ | |
Reference().fund(sym).fee_structure() | ✅ | |
Reference().fund(sym).reports() | ✅ | |
Market().fund(sym).history() | ✅ mặc định | ✅ |
Market().fund(sym).performance() | ✅ | |
Market().fund(sym).dividends() | ✅ | |
Market().fund(sym).holdings() | ✅ | |
Market().fund(sym).industry_allocation() | ✅ | |
Market().fund(sym).asset_allocation() | ✅ |
Gọi một hàm với nguồn không có ô ✅ nhận lỗi UnsupportedError mã
VNSTOCK_CAPABILITY_UNAVAILABLE.
7. Chuyển từ Fund() và Fmarket
Bản 4.x và vnstock_data lấy dữ liệu quỹ từ Fmarket. Fmarket đã gỡ khỏi thư viện; các
tên hàm cũ nay trả dữ liệu từ CafeF.
Mã cũ vẫn chạy tới hết ngày 06/04/2027. Mỗi lần gọi tên cũ, thư viện phát một
FutureWarning nêu tên thay thế. Tên cũ trả đúng bộ cột và thứ tự cột như trước, ngày
vẫn là chuỗi YYYY-MM-DD, nên mã đang đọc df["nav_per_unit"] hay df["stock_code"] không
phải sửa ngay. Sau ngày 06/04/2027, tên cũ ngừng hoạt động.
| Tên cũ | Dùng thay |
|---|---|
Fund().listing(fund_type) | Reference().fund.list(fund_type) |
Fund().filter(symbol) | Reference().fund.list(symbol=symbol) |
Fund().nav_report(symbol) | Market().fund(symbol).history() |
Fund().top_holding(symbol) | Market().fund(symbol).holdings() |
Fund().industry_holding(symbol) | Market().fund(symbol).industry_allocation() |
Fund().asset_holding(symbol) | Market().fund(symbol).asset_allocation() |
Reference().fund.nav_report(symbol) | Market().fund(symbol).history() |
Reference().fund.top_holding(symbol) | Market().fund(symbol).holdings() |
Reference().fund.industry_holding(symbol) | Market().fund(symbol).industry_allocation() |
Reference().fund.asset_holding(symbol) | Market().fund(symbol).asset_allocation() |
Market().fund(symbol).top_holding() | Market().fund(symbol).holdings() |
Market().fund(symbol).industry_holding() | Market().fund(symbol).industry_allocation() |
Market().fund(symbol).asset_holding() | Market().fund(symbol).asset_allocation() |
Market().fund(symbol).nav() không bị ngừng, và vẫn trả bộ cột cũ date, nav_per_unit,
short_name như ở vnstock_data. Cần cột chuẩn thì dùng history().
Tên mới khác tên cũ ở đâu
Tên mới trả bộ cột chuẩn của thế hệ 5. Khi chuyển, đổi tên cột theo bảng này; bộ cột đầy đủ của cả hai bên nằm ở Cấu trúc dữ liệu quỹ mở.
| Bảng | Cột cũ | Cột mới |
|---|---|---|
| Lịch sử NAV | date (chuỗi), nav_per_unit, short_name | time (datetime có múi giờ), nav |
| Nắm giữ | stock_code, type_asset (STOCK/BOND), update_at (chuỗi), fundId | ticker, asset_type (equity/bond), update_at (datetime) |
| Theo loại tài sản | asset_type ("Cổ phiếu", "Tiền và tương đương tiền"…) | asset_type (equity, cash_and_equivalents…) |
| Danh mục quỹ | short_name, name, fund_owner_name, fund_type ("Quỹ cổ phiếu"…) | ticker, organ_name, organ_short_name, fund_type (equity_fund…) |
Trước và sau:
# Trước (vnstock 4.x, vnstock_data)
from vnstock import Fund
fund = Fund()
fund_id = fund.filter("SSISCA")["id"].iloc[0]
nav = fund.nav_report(fundId=fund_id)
nav["date"] = pd.to_datetime(nav["date"])
latest = nav["nav_per_unit"].iloc[-1]
# Sau (thế hệ 5)
from vnstock import Market
nav = Market().fund("SSISCA").history() # cột time đã là datetime
latest = nav["nav"].iloc[-1]Những chỗ không giữ được như cũ
fundIddạng số không còn dùng được. Đó là mã nội bộ của Fmarket. Truyền mã quỹ thay vào:Fund().nav_report("SSISCA"). Truyền số thì nhận lỗiInputErrormãVNSTOCK_INPUT_SYMBOL.Fund().filter()nay trả cộtidchính là mã quỹ, nên mã cũ lấyidtừfilter()rồi truyền vàofundId=vẫn chạy.- Gọi tên cũ mà không truyền mã quỹ thì báo lỗi. Bản cũ tự lấy quỹ có mã nội bộ 23.
source="fmarket"báo lỗiUnsupportedErrormãVNSTOCK_FEATURE_REMOVED, kèm gợi ý dùngsource="cafef".- Cột không còn nguồn nào có thì để trống.
Fund().listing()vẫn đủ 21 cột, nhưng mười cộtnav_change_*,fund_id_fmarket,fund_code,vsd_fee_idkhông có giá trị. Lợi nhuận theo kỳ nay ởMarket().fund(sym).performance(), hoặc tự tính từhistory(). CộtfundIdcủa bảng nắm giữ cũng để trống. - Ít quỹ hơn. Fmarket từng liệt kê 68 quỹ. Đếm ngày 06/10/2026, CafeF có 43 quỹ, DigiInvest có 33.
Fund().detailsvà thuộc tínhFund().fund_listcủa bản 4.x không còn. Dùng các hàm ở bảng trên.
Muốn tắt cảnh báo trong lúc chưa kịp sửa mã:
import warnings
# Chỉ tắt cảnh báo của các tên quỹ cũ, các cảnh báo khác vẫn hiện
warnings.filterwarnings("ignore", category=FutureWarning, message=".*06/04/2027")8. Lỗi thường gặp
| Ngoại lệ | code | Khi nào | Cách xử lý |
|---|---|---|---|
EntitlementError | VNSTOCK_TIER_SOURCE, VNSTOCK_TIER_ROUTE | Chạy không khoá, hoặc khoá cấp Cộng đồng | Dùng khoá API từ cấp Bronze trở lên |
InputError | VNSTOCK_INPUT_SYMBOL | Thiếu mã quỹ, hoặc truyền fundId dạng số | Truyền mã quỹ, ví dụ symbol="DCDS" |
InputError | VNSTOCK_PROVIDER_NOT_FOUND | Nguồn không có quỹ mang mã này | Kiểm tra mã trong Reference().fund.list() |
InputError | VNSTOCK_INPUT_FUND_TYPE | fund_type không thuộc ba loại | Dùng equity_fund, bond_fund hoặc balanced_fund |
UnsupportedError | VNSTOCK_CAPABILITY_UNAVAILABLE | Nguồn đã chọn không có hàm này | Xem bảng ở mục 6 |
UnsupportedError | VNSTOCK_FEATURE_REMOVED | source="fmarket" | Bỏ tham số source, hoặc dùng source="cafef" |
Riêng Fund().listing() giữ cách cũ: loại quỹ lạ chỉ phát UserWarning rồi trả về mọi quỹ.
9. Ví dụ: so sánh NAV một năm của các quỹ cổ phiếu
import pandas as pd
from vnstock import Market, Reference
funds = Reference().fund.list("equity_fund")
cutoff = pd.Timestamp.now(tz="Asia/Ho_Chi_Minh") - pd.DateOffset(years=1)
rows = []
for ticker in funds["ticker"].head(10):
nav = Market().fund(ticker).history()
past = nav[nav["time"] <= cutoff]
if past.empty:
continue # quỹ mới thành lập chưa đủ một năm
start, end = past["nav"].iloc[-1], nav["nav"].iloc[-1]
rows.append({"ticker": ticker, "nav_1y_change_percent": round((end / start - 1) * 100, 2)})
pd.DataFrame(rows).sort_values("nav_1y_change_percent", ascending=False)Vòng lặp gọi một lần cho mỗi quỹ. Giữ danh sách ngắn và để khoảng nghỉ giữa các lần chạy, để không dồn lượt truy vấn lên nguồn.
10. Lưu ý về dữ liệu
- Số liệu là những gì CafeF và DigiInvest công bố tại thời điểm bạn chạy. Thư viện không sửa
giá trị. Gặp chỗ lạ thì đối chiếu với nguồn còn lại, hoặc với tài liệu của chính quỹ ở
reports(). Ví dụ ngày 06/10/2026,profile()của DCDS ghi ngày thành lập 20/05/2024 theo CafeF, còn danh mục DigiInvest ghi 20/05/2004. - Mọi cột ngày giờ ở tên mới là
datetime64múi giờAsia/Ho_Chi_Minh. So sánh với chuỗi"2026-01-01"vẫn chạy như ví dụ ở mục 4. - Mỗi bảng mang
df.attrscho biết nguồn (source), mã quỹ (symbol) và số dòng (length). - Thông tin ở đây phục vụ việc tự nghiên cứu, không phải khuyến nghị mua, bán hay nắm giữ chứng chỉ quỹ nào.