Vnstock Logo

Truy xuất thông tin quỹ mở

Mở rộ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 ở mục Cấu trúc dữ liệu chi tiết từng bảng.

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.

11. Cấu trúc dữ liệu chi tiết từng bảng

Quy ước chung

Kiểu ghi ở đâyKiểu trong pandasGhi chú
stringstringTrống là <NA>
numberfloat64Trống là NaN
booleanboolean
datetimedatetime64[ns, Asia/Ho_Chi_Minh]Trống là NaT
datedatetime64[ns, Asia/Ho_Chi_Minh], giờ 00:00Ngày lịch, gắn múi giờ Việt Nam để so sánh được với cột datetime
  • Thứ tự cột cố định như bảng dưới. Index là RangeIndex bắt đầu từ 0.
  • Bảng rỗng vẫn có đủ cột và đúng kiểu. Mã của bạn không cần kiểm tra cột có tồn tại không.
  • Cột phần trăm ghi theo thang 0–100: 11.46 nghĩa là 11,46%.
  • Mọi số tiền tính bằng đồng.
  • Cột "Bắt buộc" luôn có giá trị ở mọi dòng.
  • Mỗi bảng mang df.attrs gồm ít nhất source (nguồn trả lời) và length (số dòng); bảng của một quỹ có thêm symbol.

Reference().fund.list()

Một dòng cho mỗi quỹ. Tuyến: reference.fund.list.

CộtKiểuBắt buộcÝ nghĩa
tickerstring✅Mã chứng chỉ quỹ, chữ hoa
organ_namestringTên đầy đủ của quỹ. CafeF để trống; DigiInvest có
organ_short_namestringCông ty quản lý quỹ. CafeF ghi tên đầy đủ công ty, DigiInvest ghi tên ngắn
fund_typestring✅equity_fund, bond_fund, balanced_fund
management_feenumberPhí quản lý, % mỗi năm. CafeF để trống
inception_datedateNgày thành lập quỹ. CafeF để trống
navnumberNAV mới nhất trên một chứng chỉ quỹ, đồng
nav_update_atdatetimeNgày của NAV mới nhất

Reference().fund.profile()

Đúng một dòng. Nguồn CafeF.

CộtKiểuBắt buộcÝ nghĩa
tickerstring✅Mã chứng chỉ quỹ
organ_short_namestringCông ty quản lý quỹ
descriptionstringMô tả chiến lược, do quỹ viết
inception_datedateNgày thành lập, theo CafeF
total_assetsnumberTổng tài sản, đồng
min_investmentnumberSố tiền đầu tư tối thiểu, đồng
trading_frequencystringNgày giao dịch chứng chỉ quỹ, nguyên văn
transfer_agentstringCác đại lý phân phối, chuyển nhượng, nguyên văn
benchmarkstringChỉ số tham chiếu, ví dụ "VN Index"
navnumberNAV mới nhất, đồng
nav_update_atdatetimeNgày của NAV mới nhất
websitestringTrang của quỹ

Reference().fund.fee_structure()

Mỗi bậc phí một dòng. Nguồn CafeF.

CộtKiểuBắt buộcÝ nghĩa
fee_typestring✅purchase (mua), redemption (bán lại), switching (chuyển đổi), other
basisstringCăn cứ chia bậc, ví dụ holding_period, transaction_value
rangestring✅Nhãn bậc đúng như quỹ công bố, ví dụ "< 12 Tháng", "12-24 Tháng"
feenumberMức phí của bậc
unitstringĐơn vị của fee, thường là %

Reference().fund.reports()

Mỗi tài liệu một dòng. Nguồn CafeF.

CộtKiểuBắt buộcÝ nghĩa
report_typestringLoại tài liệu, ví dụ prospectus (bản cáo bạch), regulation (điều lệ)
titlestring✅Tên tài liệu
periodstringKỳ hoặc ngày ghi trên tài liệu, nguyên văn
urlstring✅Đường dẫn tới tệp

Market().fund(symbol).history(), .ohlcv()

Mỗi kỳ công bố NAV một dòng, cũ nhất trước.

CộtKiểuBắt buộcÝ nghĩa
timedatetime✅Ngày định giá NAV
navnumber✅NAV trên một chứng chỉ quỹ, đồng

Market().fund(symbol).performance()

Ba dòng: ytd, 3y, 5y. Nguồn CafeF.

CộtKiểuBắt buộcÝ nghĩa
periodstring✅ytd (từ đầu năm), 3y, 5y
period_labelstringNhãn kỳ như nguồn ghi, ví dụ "Từ đầu 2026"
nav_startnumberNAV đầu kỳ, đồng
nav_endnumberNAV cuối kỳ, đồng
return_percentnumberLợi nhuận của kỳ, %
annualizedbooleanTrue khi return_percent là lợi nhuận kép bình quân mỗi năm

Market().fund(symbol).dividends()

Mỗi lần chia một dòng, mới nhất trước. Nguồn DigiInvest.

CộtKiểuBắt buộcÝ nghĩa
datedate✅Ngày chia
amountnumber✅Tiền mặt trên một chứng chỉ quỹ, đồng

Market().fund(symbol).holdings()

Tối đa mười dòng theo báo cáo danh mục tháng gần nhất. Nguồn CafeF.

CộtKiểuBắt buộcÝ nghĩa
update_atdatetime✅Ngày cuối của tháng báo cáo
tickerstring✅Mã cổ phiếu hoặc trái phiếu, chữ hoa
industrystringNgành của mã, có thể trống
net_asset_percentnumber✅Tỷ trọng trên tài sản ròng của quỹ, %
asset_typestringequity hoặc bond, suy từ mã: mã có chữ số là trái phiếu

Market().fund(symbol).industry_allocation()

Mỗi ngành một dòng. Nguồn CafeF.

CộtKiểuBắt buộcÝ nghĩa
industrystring✅Tên ngành theo phân loại nguồn
net_asset_percentnumber✅Tỷ trọng trên tài sản ròng, %

Market().fund(symbol).asset_allocation()

Mỗi loại tài sản một dòng. Nguồn CafeF.

CộtKiểuBắt buộcÝ nghĩa
asset_typestring✅equity, bond, cash_and_equivalents, others
asset_percentnumber✅Tỷ trọng, %