diff --git a/.DS_Store b/.DS_Store index 4a8a4a12..c26ce77e 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/docs/1_vietnam_stock_vnstock3.ipynb b/docs/1_vietnam_stock_vnstock3.ipynb index 72a09824..4a9b4992 100644 --- a/docs/1_vietnam_stock_vnstock3.ipynb +++ b/docs/1_vietnam_stock_vnstock3.ipynb @@ -5871,7 +5871,7 @@ } ], "source": [ - "stock.finance.cash_flow(period='year', lang='vi').head()" + "stock.finance.cash_flow(period='year').head()" ] }, { diff --git a/docs/4_funds_vnstock3.ipynb b/docs/4_funds_vnstock3.ipynb index 317ff4e3..b0eb1033 100644 --- a/docs/4_funds_vnstock3.ipynb +++ b/docs/4_funds_vnstock3.ipynb @@ -27,20 +27,25 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Total number of funds currently listed on Fmarket: 49\n" + "Total number of funds currently listed on Fmarket: 50\n" ] } ], "source": [ + "# Gọi từ core module\n", "from vnstock3.explorer.fmarket.fund import Fund\n", - "fund = Fund()" + "fund = Fund()\n", + "\n", + "# # Gọi từ Vnstock wrapper module - version 3.0.7\n", + "# from vnstock3 import Vnstock\n", + "# fund = Vnstock().fund()" ] }, { @@ -52,14 +57,14 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Total number of funds currently listed on Fmarket: 49\n" + "Total number of funds currently listed on Fmarket: 50\n" ] }, { @@ -109,101 +114,101 @@ " \n", " \n", " 0\n", + " VESAF\n", + " QUỸ ĐẦU TƯ CỔ PHIẾU TIẾP CẬN THỊ TRƯỜNG VINACA...\n", + " Quỹ cổ phiếu\n", + " CÔNG TY CỔ PHẦN QUẢN LÝ QUỸ VINACAPITAL\n", + " 1.75\n", + " 2017-04-17\n", + " 31452.77\n", + " -0.29\n", + " 22.11\n", + " 214.53\n", + " ...\n", + " 9.08\n", + " 20.85\n", + " 29.02\n", + " 32.15\n", + " 48.01\n", + " 13.96\n", + " 2024-07-14\n", + " 23\n", + " VESAF\n", + " VESAFN002\n", + " \n", + " \n", + " 1\n", " SSISCA\n", " QUỸ ĐẦU TƯ LỢI THẾ CẠNH TRANH BỀN VỮNG SSI\n", " Quỹ cổ phiếu\n", " CÔNG TY TNHH QUẢN LÝ QUỸ SSI\n", " 1.75\n", " 2014-09-25\n", - " 40055.88\n", - " 0.46\n", - " 31.01\n", - " 177.93\n", + " 39689.96\n", + " -0.18\n", + " 29.82\n", + " 175.39\n", " ...\n", - " 13.61\n", - " 27.83\n", - " 41.96\n", - " 44.61\n", - " 39.34\n", - " 11.69\n", - " 2024-07-09\n", + " 11.66\n", + " 27.52\n", + " 38.24\n", + " 41.97\n", + " 41.97\n", + " 12.39\n", + " 2024-07-14\n", " 11\n", " SSISCA\n", " SSISCAN001\n", " \n", " \n", - " 1\n", - " VESAF\n", - " QUỸ ĐẦU TƯ CỔ PHIẾU TIẾP CẬN THỊ TRƯỜNG VINACA...\n", + " 2\n", + " VEOF\n", + " QUỸ ĐẦU TƯ CỔ PHIẾU HƯNG THỊNH VINACAPITAL\n", " Quỹ cổ phiếu\n", " CÔNG TY CỔ PHẦN QUẢN LÝ QUỸ VINACAPITAL\n", " 1.75\n", - " 2017-04-17\n", - " 31659.50\n", - " 0.64\n", - " 22.91\n", - " 216.60\n", + " 2014-06-30\n", + " 30354.53\n", + " -0.37\n", + " 21.37\n", + " 152.03\n", " ...\n", - " 11.05\n", - " 20.76\n", - " 31.68\n", - " 35.44\n", - " 37.71\n", - " 11.26\n", - " 2024-07-09\n", - " 23\n", - " VESAF\n", - " VESAFN002\n", + " 6.59\n", + " 18.47\n", + " 26.89\n", + " 25.97\n", + " 34.89\n", + " 10.49\n", + " 2024-07-14\n", + " 20\n", + " VEOF\n", + " VEOFN003\n", " \n", " \n", - " 2\n", + " 3\n", " BVPF\n", " QUỸ ĐẦU TƯ CỔ PHIẾU TRIỂN VỌNG BẢO VIỆT\n", " Quỹ cổ phiếu\n", " CÔNG TY TNHH QUẢN LÝ QUỸ BẢO VIỆT\n", " 1.50\n", " 2016-12-28\n", - " 20924.00\n", - " 1.62\n", - " 23.09\n", - " 109.20\n", + " 21202.00\n", + " 1.33\n", + " 24.73\n", + " 111.98\n", " ...\n", - " 8.50\n", - " 20.05\n", - " 31.92\n", - " 32.26\n", - " 30.27\n", - " 9.21\n", - " 2024-07-09\n", + " 11.34\n", + " 20.86\n", + " 32.99\n", + " 36.01\n", + " 33.30\n", + " 10.05\n", + " 2024-07-14\n", " 14\n", " BVPF\n", " BVPFN001\n", " \n", " \n", - " 3\n", - " VEOF\n", - " QUỸ ĐẦU TƯ CỔ PHIẾU HƯNG THỊNH VINACAPITAL\n", - " Quỹ cổ phiếu\n", - " CÔNG TY CỔ PHẦN QUẢN LÝ QUỸ VINACAPITAL\n", - " 1.75\n", - " 2014-06-30\n", - " 30569.71\n", - " 0.30\n", - " 22.23\n", - " 153.82\n", - " ...\n", - " 7.96\n", - " 18.80\n", - " 29.87\n", - " 28.10\n", - " 29.68\n", - " 9.05\n", - " 2024-07-09\n", - " 20\n", - " VEOF\n", - " VEOFN003\n", - " \n", - " \n", " 4\n", " VCBF-TBF\n", " QUỸ ĐẦU TƯ CÂN BẰNG CHIẾN LƯỢC VCBF\n", @@ -211,18 +216,18 @@ " CÔNG TY LIÊN DOANH QUẢN LÝ QUỸ ĐẦU TƯ CHỨNG KH...\n", " 1.50\n", " 2013-12-23\n", - " 32058.82\n", - " 0.87\n", - " 16.68\n", - " 60.73\n", + " 31962.13\n", + " -0.30\n", + " 16.33\n", + " 60.24\n", " ...\n", - " 6.12\n", - " 13.92\n", - " 21.60\n", - " 28.11\n", - " 28.62\n", - " 8.75\n", - " 2024-07-09\n", + " 5.05\n", + " 13.91\n", + " 19.83\n", + " 27.69\n", + " 28.23\n", + " 8.64\n", + " 2024-07-14\n", " 31\n", " VCBFTBF\n", " VCBFTBFN001\n", @@ -234,51 +239,51 @@ ], "text/plain": [ " short_name name fund_type \\\n", - "0 SSISCA QUỸ ĐẦU TƯ LỢI THẾ CẠNH TRANH BỀN VỮNG SSI Quỹ cổ phiếu \n", - "1 VESAF QUỸ ĐẦU TƯ CỔ PHIẾU TIẾP CẬN THỊ TRƯỜNG VINACA... Quỹ cổ phiếu \n", - "2 BVPF QUỸ ĐẦU TƯ CỔ PHIẾU TRIỂN VỌNG BẢO VIỆT Quỹ cổ phiếu \n", - "3 VEOF QUỸ ĐẦU TƯ CỔ PHIẾU HƯNG THỊNH VINACAPITAL Quỹ cổ phiếu \n", + "0 VESAF QUỸ ĐẦU TƯ CỔ PHIẾU TIẾP CẬN THỊ TRƯỜNG VINACA... Quỹ cổ phiếu \n", + "1 SSISCA QUỸ ĐẦU TƯ LỢI THẾ CẠNH TRANH BỀN VỮNG SSI Quỹ cổ phiếu \n", + "2 VEOF QUỸ ĐẦU TƯ CỔ PHIẾU HƯNG THỊNH VINACAPITAL Quỹ cổ phiếu \n", + "3 BVPF QUỸ ĐẦU TƯ CỔ PHIẾU TRIỂN VỌNG BẢO VIỆT Quỹ cổ phiếu \n", "4 VCBF-TBF QUỸ ĐẦU TƯ CÂN BẰNG CHIẾN LƯỢC VCBF Quỹ cân bằng \n", "\n", " fund_owner_name management_fee \\\n", - "0 CÔNG TY TNHH QUẢN LÝ QUỸ SSI 1.75 \n", - "1 CÔNG TY CỔ PHẦN QUẢN LÝ QUỸ VINACAPITAL 1.75 \n", - "2 CÔNG TY TNHH QUẢN LÝ QUỸ BẢO VIỆT 1.50 \n", - "3 CÔNG TY CỔ PHẦN QUẢN LÝ QUỸ VINACAPITAL 1.75 \n", + "0 CÔNG TY CỔ PHẦN QUẢN LÝ QUỸ VINACAPITAL 1.75 \n", + "1 CÔNG TY TNHH QUẢN LÝ QUỸ SSI 1.75 \n", + "2 CÔNG TY CỔ PHẦN QUẢN LÝ QUỸ VINACAPITAL 1.75 \n", + "3 CÔNG TY TNHH QUẢN LÝ QUỸ BẢO VIỆT 1.50 \n", "4 CÔNG TY LIÊN DOANH QUẢN LÝ QUỸ ĐẦU TƯ CHỨNG KH... 1.50 \n", "\n", " inception_date nav nav_change_previous nav_change_last_year \\\n", - "0 2014-09-25 40055.88 0.46 31.01 \n", - "1 2017-04-17 31659.50 0.64 22.91 \n", - "2 2016-12-28 20924.00 1.62 23.09 \n", - "3 2014-06-30 30569.71 0.30 22.23 \n", - "4 2013-12-23 32058.82 0.87 16.68 \n", + "0 2017-04-17 31452.77 -0.29 22.11 \n", + "1 2014-09-25 39689.96 -0.18 29.82 \n", + "2 2014-06-30 30354.53 -0.37 21.37 \n", + "3 2016-12-28 21202.00 1.33 24.73 \n", + "4 2013-12-23 31962.13 -0.30 16.33 \n", "\n", " nav_change_inception ... nav_change_3m nav_change_6m nav_change_12m \\\n", - "0 177.93 ... 13.61 27.83 41.96 \n", - "1 216.60 ... 11.05 20.76 31.68 \n", - "2 109.20 ... 8.50 20.05 31.92 \n", - "3 153.82 ... 7.96 18.80 29.87 \n", - "4 60.73 ... 6.12 13.92 21.60 \n", + "0 214.53 ... 9.08 20.85 29.02 \n", + "1 175.39 ... 11.66 27.52 38.24 \n", + "2 152.03 ... 6.59 18.47 26.89 \n", + "3 111.98 ... 11.34 20.86 32.99 \n", + "4 60.24 ... 5.05 13.91 19.83 \n", "\n", " nav_change_24m nav_change_36m nav_change_36m_annualized nav_update_at \\\n", - "0 44.61 39.34 11.69 2024-07-09 \n", - "1 35.44 37.71 11.26 2024-07-09 \n", - "2 32.26 30.27 9.21 2024-07-09 \n", - "3 28.10 29.68 9.05 2024-07-09 \n", - "4 28.11 28.62 8.75 2024-07-09 \n", + "0 32.15 48.01 13.96 2024-07-14 \n", + "1 41.97 41.97 12.39 2024-07-14 \n", + "2 25.97 34.89 10.49 2024-07-14 \n", + "3 36.01 33.30 10.05 2024-07-14 \n", + "4 27.69 28.23 8.64 2024-07-14 \n", "\n", " fund_id_fmarket fund_code vsd_fee_id \n", - "0 11 SSISCA SSISCAN001 \n", - "1 23 VESAF VESAFN002 \n", - "2 14 BVPF BVPFN001 \n", - "3 20 VEOF VEOFN003 \n", + "0 23 VESAF VESAFN002 \n", + "1 11 SSISCA SSISCAN001 \n", + "2 20 VEOF VEOFN003 \n", + "3 14 BVPF BVPFN001 \n", "4 31 VCBFTBF VCBFTBFN001 \n", "\n", "[5 rows x 21 columns]" ] }, - "execution_count": 4, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -296,7 +301,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -375,7 +380,7 @@ "6 29 DCAF" ] }, - "execution_count": 5, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -401,7 +406,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -475,38 +480,38 @@ " ...\n", " \n", " \n", - " 1535\n", - " 2024-07-03\n", - " 39212.58\n", + " 1538\n", + " 2024-07-08\n", + " 39871.40\n", " SSISCA\n", " \n", " \n", - " 1536\n", - " 2024-07-04\n", - " 39510.62\n", + " 1539\n", + " 2024-07-09\n", + " 40055.88\n", " SSISCA\n", " \n", " \n", - " 1537\n", - " 2024-07-05\n", - " 39690.75\n", + " 1540\n", + " 2024-07-10\n", + " 40153.97\n", " SSISCA\n", " \n", " \n", - " 1538\n", - " 2024-07-08\n", - " 39871.40\n", + " 1541\n", + " 2024-07-11\n", + " 39761.74\n", " SSISCA\n", " \n", " \n", - " 1539\n", - " 2024-07-09\n", - " 40055.88\n", + " 1542\n", + " 2024-07-12\n", + " 39689.96\n", " SSISCA\n", " \n", " \n", "\n", - "

1540 rows × 3 columns

\n", + "

1543 rows × 3 columns

\n", "" ], "text/plain": [ @@ -517,17 +522,18 @@ "3 2017-01-25 14547.21 SSISCA\n", "4 2017-01-31 14541.96 SSISCA\n", "... ... ... ...\n", - "1535 2024-07-03 39212.58 SSISCA\n", - "1536 2024-07-04 39510.62 SSISCA\n", - "1537 2024-07-05 39690.75 SSISCA\n", "1538 2024-07-08 39871.40 SSISCA\n", "1539 2024-07-09 40055.88 SSISCA\n", + "1540 2024-07-10 40153.97 SSISCA\n", + "1541 2024-07-11 39761.74 SSISCA\n", + "1542 2024-07-12 39689.96 SSISCA\n", "\n", - "[1540 rows x 3 columns]" + "[1543 rows x 3 columns]" ] }, + "execution_count": 5, "metadata": {}, - "output_type": "display_data" + "output_type": "execute_result" } ], "source": [ @@ -900,7 +906,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -959,7 +965,7 @@ "1 16.92 Tiền và tương đương tiền SSISCA" ] }, - "execution_count": 11, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } diff --git a/vnstock3/.DS_Store b/vnstock3/.DS_Store index 7bd26523..55dac961 100644 Binary files a/vnstock3/.DS_Store and b/vnstock3/.DS_Store differ diff --git a/vnstock3/common/.DS_Store b/vnstock3/common/.DS_Store index dd9d5540..b21127b9 100644 Binary files a/vnstock3/common/.DS_Store and b/vnstock3/common/.DS_Store differ diff --git a/vnstock3/common/__init__.py b/vnstock3/common/__init__.py index 79acd2a6..e9f7ccce 100644 --- a/vnstock3/common/__init__.py +++ b/vnstock3/common/__init__.py @@ -1,3 +1,3 @@ from vnstock3.core.utils.env import id_valid -from vnstock3.common.data.data_explorer import StockComponents, MSNComponents, Quote, Listing, Trading, Company, Finance +from vnstock3.common.data.data_explorer import StockComponents, MSNComponents, Quote, Listing, Trading, Company, Finance, Fund id_valid() \ No newline at end of file diff --git a/vnstock3/common/data/data_explorer.py b/vnstock3/common/data/data_explorer.py index 6a1e39f3..6f583c2e 100644 --- a/vnstock3/common/data/data_explorer.py +++ b/vnstock3/common/data/data_explorer.py @@ -1,3 +1,4 @@ +import pandas as pd import importlib from typing import Optional from vnstock3.core.utils.logger import get_logger @@ -388,6 +389,56 @@ def ratio(self, symbol: Optional[str] = None, **kwargs): """ return self.data_source.ratio(**kwargs) + +class Fund: + def __init__(self, source: str = "FMARKET", random_agent:bool=False): + """ + Class (lớp) quản lý các nguồn dữ liệu được tiêu chuẩn hoá cho dữ liệu đồ thị nến, dữ liệu trả về tuỳ thuộc vào nguồn dữ liệu sẵn có được chọn. + """ + self.source = source.upper() + self.supported_sources = ["FMARKET"] + if self.source not in self.supported_sources: + raise ValueError(f"Hiện tại chỉ có nguồn dữ liệu từ {', '.join(self.supported_sources)} được hỗ trợ.") + self.random_agent = random_agent + self.source_module = f"vnstock3.explorer.{source.lower()}" + self.data_source = self._load_data_source(random_agent) + self.details = self.data_source.details + + def _load_data_source(self, random_agent:bool): + """ + Điều hướng lớp (class) nguồn dữ liệu được lựa chọn. + """ + module = importlib.import_module(self.source_module) + return module.Fund(random_agent) + + def listing(self, fund_type:str="") -> pd.DataFrame: + """ + Truy xuất danh sách tất cả các quỹ mở hiện có trên Fmarket thông qua API. Xem trực tiếp tại https://fmarket.vn + + Tham số: + ---------- + fund_type (str): Loại quỹ cần lọc. Mặc định là rỗng để lấy tất cả các quỹ. Các loại quỹ hợp lệ bao gồm: 'BALANCED', 'BOND', 'STOCK' + + Trả về: + ------- + pd.DataFrame: DataFrame chứa thông tin của tất cả các quỹ mở hiện có trên Fmarket. + """ + return self.data_source.listing(fund_type) + + def filter(self, symbol:str="") -> pd.DataFrame: + """ + Truy xuất danh sách quỹ theo tên viết tắt (short_name) và mã id của quỹ. Mặc định là rỗng để liệt kê tất cả các quỹ. + + Tham số: + ---------- + symbol (str): Tên viết tắt của quỹ cần tìm kiếm. Mặc định là rỗng để lấy tất cả các quỹ. + + Trả về: + ------- + pd.DataFrame: DataFrame chứa thông tin của quỹ cần tìm kiếm. + """ + return self.data_source.filter(symbol) + class MSNComponents: """ Class (lớp) quản lý các chức năng của thư viện Vnstock liên quan đến thị trường ngoại hối. diff --git a/vnstock3/common/vnstock.py b/vnstock3/common/vnstock.py index 22a8bd0d..4c6ca62b 100644 --- a/vnstock3/common/vnstock.py +++ b/vnstock3/common/vnstock.py @@ -1,7 +1,7 @@ import importlib from typing import Optional from vnstock3.core.utils.logger import get_logger -from vnstock3.common.data.data_explorer import StockComponents, MSNComponents +from vnstock3.common.data.data_explorer import StockComponents, MSNComponents, Fund from vnstock3.explorer.msn.const import _CURRENCY_ID_MAP, _GLOBAL_INDICES, _CRYPTO_ID_MAP logger = get_logger(__name__) @@ -29,10 +29,13 @@ def __init__(self, source:str="VCI", show_log:bool=True): self.source = source.upper() # self.utils = Utils(self) - def stock(self, symbol: Optional[str]=None, source: Optional[str] = "VCI"): + def stock(self, symbol: Optional[str]=None, source: Optional[str] = None): if symbol is None: self.symbol = 'VN30F1M' logger.info("Mã chứng khoán không được chỉ định, chương trình mặc định sử dụng VN30F1M") + + if source is None: + source = self.source else: self.symbol = symbol return StockComponents(self.symbol, source, show_log=self.show_log) @@ -51,3 +54,6 @@ def world_index(self, symbol: Optional[str]='DJI', source: Optional[str] = "MSN" if symbol: self.symbol = self.msn_symbol_map[symbol] return MSNComponents(self.symbol, source) + + def fund(self, source: Optional[str] = "FMARKET"): + return Fund(source) diff --git a/vnstock3/core/.DS_Store b/vnstock3/core/.DS_Store index 11fcffa1..fbbcfbf1 100644 Binary files a/vnstock3/core/.DS_Store and b/vnstock3/core/.DS_Store differ diff --git a/vnstock3/explorer/.DS_Store b/vnstock3/explorer/.DS_Store index 953d654c..e7e1fd6a 100644 Binary files a/vnstock3/explorer/.DS_Store and b/vnstock3/explorer/.DS_Store differ diff --git a/vnstock3/explorer/fmarket/__init__.py b/vnstock3/explorer/fmarket/__init__.py index e69de29b..27ee62c4 100644 --- a/vnstock3/explorer/fmarket/__init__.py +++ b/vnstock3/explorer/fmarket/__init__.py @@ -0,0 +1 @@ +from .fund import Fund \ No newline at end of file