Vnstock Logo

Dữ liệu quỹ mở

Cộng đồng

Mục lục

Ai dùng đượ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

Python
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()

Python
ref.fund.list(fund_type=None, symbol=None, *, source=None)
Tham sốKiểuMặc địnhÝ nghĩa
fund_typestrNoneequity_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
symbolstrNoneChỉ giữ quỹ có mã chứa chuỗi này, ví dụ "DC"
sourcestr"cafef""cafef" hoặc "digiinvest"
Python
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):

tickerorgan_nameorgan_short_namefund_typemanagement_feeinception_datenavnav_update_at
DCIPQuỹ đầu tư trái phiếu gia tăng thu nhập cố định DCDragon Capitalbond_fund1.202021-05-2412420.02026-10-06
DCDSQuỹ đầu tư Chứng khoán Năng động DCDragon Capitalequity_fund1.952004-05-2093322.02026-10-06
DCDEQuỹ đầu tư Cổ phiếu Tập trung Cổ tức DCDragon Capitalequity_fund1.932008-02-2824538.02026-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ằng33
organ_name, management_fee, inception_dateđể trốngcó
organ_short_nametên đầy đủ công ty quản lý quỹtên ngắn, ví dụ Dragon Capital
NAVlẻ tới 0,01 đồnglàm tròn tới đồng
Thứ tự dòngtheo lợi nhuận bình quân 3 năm, cao trướctheo 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:

Python
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ỹ.

Python
p = ref.fund("DCDS").profile()
p[["ticker", "total_assets", "min_investment", "trading_frequency", "benchmark", "nav"]]
tickertotal_assetsmin_investmenttrading_frequencybenchmarknav
DCDS6.0707e+12100000.0Từ thứ 2 đến thứ 6VN Index93322.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.

Python
ref.fund("DCDS").fee_structure()
fee_typebasisrangefeeunit
redemptionholding_period< 12 Tháng1.5%
redemptionholding_period12-24 Tháng0.5%
redemptionholding_period>= 24 Tháng0.0%
purchasetransaction_valueKhông giới hạn0.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.

Python
ref.fund("DCDS").reports()
report_typetitleperiodurl
prospectusBản cáo bạch quỹT1/2025https://cafefnew.mediacdn.vn/FUND/DCDS_DCDS-whitepaper.pdf
regulationĐiều lệ quỹ13/05/2024https://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

Python
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.

Python
nav = mkt.fund("DCDS").history()
nav[nav["time"] >= "2026-01-01"]
CafeFDigiInvest
DCDS, chạy 06/10/20262.802 dòng, từ 11/03/20053.339 dòng, từ 01/06/2004
Độ chi tiết của NAV0,01 đồnglà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.

Python
mkt.fund("DCDS").performance()
periodperiod_labelnav_startnav_endreturn_percentannualized
ytdTừ đầu 2026108177.3793322.27-13.73False
3yLN kép TB 3 năm63953.1193322.2713.42True
5yLN kép TB 5 năm74262.8093322.274.67True

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.

Python
mkt.fund("DCDE").dividends()
dateamount
2026-07-141900.0
2025-05-201400.0
2024-06-071300.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

Python
mkt.fund("DCDS").holdings()
update_attickerindustrynet_asset_percentasset_type
2025-12-31VICPhát triển bất động sản11.46equity
2025-12-31VHMPhát triển bất động sản6.13equity
2025-12-31MWGThiết bị điện tử, viễn thông5.79equity
  • update_at là 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_type là equity (cổ phiếu) hoặc bond (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

Python
mkt.fund("DCDS").industry_allocation()
industrynet_asset_percent
Bất động sản33.10
Ngân hàng23.64
Bán lẻ5.79

asset_allocation() — tỷ trọng theo loại tài sản

Python
mkt.fund("DCDS").asset_allocation()
asset_typeasset_percent
equity85.93
cash_and_equivalents10.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àmCafeFDigiInvest
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ảngCột cũCột mới
Lịch sử NAVdate (chuỗi), nav_per_unit, short_nametime (datetime có múi giờ), nav
Nắm giữstock_code, type_asset (STOCK/BOND), update_at (chuỗi), fundIdticker, asset_type (equity/bond), update_at (datetime)
Theo loại tài sảnasset_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:

Python
# 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ũ

  • fundId dạ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ỗi InputError mã VNSTOCK_INPUT_SYMBOL. Fund().filter() nay trả cột id chính là mã quỹ, nên mã cũ lấy id từ filter() rồi truyền vào fundId= 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ỗi UnsupportedError mã VNSTOCK_FEATURE_REMOVED, kèm gợi ý dùng source="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ột nav_change_*, fund_id_fmarket, fund_code, vsd_fee_id không có giá trị. Lợi nhuận theo kỳ nay ở Market().fund(sym).performance(), hoặc tự tính từ history(). Cột fundId củ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().details và thuộc tính Fund().fund_list củ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ã:

Python
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ệcodeKhi nàoCách xử lý
EntitlementErrorVNSTOCK_TIER_SOURCE, VNSTOCK_TIER_ROUTEChạy không khoá, hoặc khoá cấp Cộng đồngDùng khoá API từ cấp Bronze trở lên
InputErrorVNSTOCK_INPUT_SYMBOLThiếu mã quỹ, hoặc truyền fundId dạng sốTruyền mã quỹ, ví dụ symbol="DCDS"
InputErrorVNSTOCK_PROVIDER_NOT_FOUNDNguồn không có quỹ mang mã nàyKiểm tra mã trong Reference().fund.list()
InputErrorVNSTOCK_INPUT_FUND_TYPEfund_type không thuộc ba loạiDùng equity_fund, bond_fund hoặc balanced_fund
UnsupportedErrorVNSTOCK_CAPABILITY_UNAVAILABLENguồn đã chọn không có hàm nàyXem bảng ở mục 6
UnsupportedErrorVNSTOCK_FEATURE_REMOVEDsource="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

Python
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à datetime64 mú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.attrs cho 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.