├── .env ├── .gitignore ├── .readthedocs.yaml ├── Dockerfile ├── LICENSE ├── README.md ├── changelog.md ├── docker-compose.yaml ├── docs ├── api.md ├── conf.py ├── example.md ├── index.md ├── install.md └── requirements.txt ├── efinance ├── __init__.py ├── api │ └── __init__.py ├── bond │ ├── __init__.py │ ├── config.py │ └── getter.py ├── common │ ├── __init__.py │ ├── config.py │ └── getter.py ├── config │ └── __init__.py ├── fund │ ├── __init__.py │ ├── config.py │ ├── getter.py │ └── utils.py ├── futures │ ├── __init__.py │ ├── config.py │ ├── getter.py │ └── utils.py ├── shared │ └── __init__.py ├── stock │ ├── __init__.py │ ├── config.py │ ├── getter.py │ └── utils.py └── utils │ └── __init__.py ├── examples ├── bond.ipynb ├── fund.ipynb ├── futures.ipynb └── stock.ipynb ├── pyproject.toml ├── requirements.txt ├── tea.yaml └── tox.ini /.env: -------------------------------------------------------------------------------- 1 | # 项目工作目录 2 | APP_WORKING_DIR=/app 3 | # 指定语言编码(可避免中文乱码) 4 | LANG=C.UTF-8 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # pdm 105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 106 | #pdm.lock 107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 108 | # in version control. 109 | # https://pdm.fming.dev/#use-with-ide 110 | .pdm.toml 111 | 112 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 113 | __pypackages__/ 114 | 115 | # Celery stuff 116 | celerybeat-schedule 117 | celerybeat.pid 118 | 119 | # SageMath parsed files 120 | *.sage.py 121 | 122 | # Environments 123 | .env 124 | .venv 125 | env/ 126 | venv/ 127 | ENV/ 128 | env.bak/ 129 | venv.bak/ 130 | 131 | # Spyder project settings 132 | .spyderproject 133 | .spyproject 134 | 135 | # Rope project settings 136 | .ropeproject 137 | 138 | # mkdocs documentation 139 | /site 140 | 141 | # mypy 142 | .mypy_cache/ 143 | .dmypy.json 144 | dmypy.json 145 | 146 | # Pyre type checker 147 | .pyre/ 148 | 149 | # pytype static type analyzer 150 | .pytype/ 151 | 152 | # Cython debug symbols 153 | cython_debug/ 154 | 155 | # PyCharm 156 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 157 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 158 | # and can be added to the global gitignore or merged into this file. For a more nuclear 159 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 160 | .idea/ 161 | 162 | docs/build/ 163 | efinance/data 164 | -------------------------------------------------------------------------------- /.readthedocs.yaml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | build: 4 | os: ubuntu-22.04 5 | tools: 6 | python: "3.12" 7 | 8 | sphinx: 9 | configuration: docs/conf.py 10 | 11 | python: 12 | install: 13 | - requirements: docs/requirements.txt 14 | - requirements: requirements.txt 15 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM continuumio/miniconda3 2 | # 默认工作目录 3 | ARG HOME=/root 4 | WORKDIR $HOME 5 | # 安装依赖 6 | RUN pip install efinance 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 micro sheep 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Introduction 2 | 3 | [![Python Version](https://img.shields.io/badge/python-3.6+-blue.svg?style=flat)](https://pypi.python.org/pypi/efinance) 4 | [![Pypi Package](https://img.shields.io/pypi/v/efinance.svg?maxAge=60)](https://pypi.python.org/pypi/efinance) 5 | [![Pypi-Install](https://img.shields.io/pypi/dm/efinance.svg?maxAge=2592000&label=installs&color=%2327B1FF)](https://pypi.python.org/pypi/efinance) 6 | [![Docs](https://readthedocs.org/projects/efinance/badge/?version=latest)](https://efinance.readthedocs.io) 7 | [![CodeFactor](https://www.codefactor.io/repository/github/micro-sheep/efinance/badge)](https://www.codefactor.io/repository/github/micro-sheep/efinance/overview/main) 8 | [![Github Stars](https://img.shields.io/github/stars/Micro-sheep/efinance.svg?style=social&label=Star&maxAge=60)](https://github.com/Micro-sheep/efinance) 9 | 10 | [`efinance`](https://github.com/Micro-sheep/efinance) 是由个人打造的用于获取股票、基金、期货数据的免费开源 Python 库,你可以使用它很方便地获取数据以便更好地服务于个人的交易系统需求。 11 | 12 | - [`Source Code`](https://github.com/Micro-sheep/efinance) 13 | - [`Docs`](https://efinance.readthedocs.io) 14 | - [`Changelog`](https://github.com/Micro-sheep/efinance/blob/main/changelog.md) 15 | 16 | --- 17 | 18 | ## Installation 19 | 20 | - 通过 `pip` 安装 21 | 22 | ```bash 23 | pip install efinance 24 | ``` 25 | 26 | - 通过 `pip` 更新 27 | 28 | ```bash 29 | pip install efinance --upgrade 30 | ``` 31 | 32 | - 通过 `docker` 安装 33 | 34 | ```bash 35 | # 克隆代码 36 | git clone https://github.com/Micro-sheep/efinance 37 | # 切换工作目录为该项目的根目录 38 | cd efinance 39 | # 构建镜像(-t 指定构建后生成的镜像名称 . 指定 build 的对象是当前工作目录下的 dockerfile) 40 | docker build -t efinance . --no-cache 41 | # 以交互的方式运行镜像(运行之后自动删除容器,如不想删除 则可去掉 --rm) 42 | docker run --rm -it efinance 43 | ``` 44 | 45 | - 源码安装(用于开发) 46 | 47 | ```bash 48 | git clone https://github.com/Micro-sheep/efinance 49 | cd efinance 50 | pip install -e . 51 | ``` 52 | 53 | --- 54 | 55 | ## Examples 56 | 57 | ### Stock 58 | 59 | - 获取股票历史日 K 线数据 60 | 61 | ```python 62 | >>> import efinance as ef 63 | >>> # 股票代码 64 | >>> stock_code = '600519' 65 | >>> ef.stock.get_quote_history(stock_code) 66 | 股票名称 股票代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 67 | 0 贵州茅台 600519 2001-08-27 -89.74 -89.53 -89.08 -90.07 406318.0 1.410347e+09 -1.10 0.92 0.83 56.83 68 | 1 贵州茅台 600519 2001-08-28 -89.64 -89.27 -89.24 -89.72 129647.0 4.634630e+08 -0.54 0.29 0.26 18.13 69 | 2 贵州茅台 600519 2001-08-29 -89.24 -89.36 -89.24 -89.42 53252.0 1.946890e+08 -0.20 -0.10 -0.09 7.45 70 | 3 贵州茅台 600519 2001-08-30 -89.38 -89.22 -89.14 -89.44 48013.0 1.775580e+08 -0.34 0.16 0.14 6.72 71 | 4 贵州茅台 600519 2001-08-31 -89.21 -89.24 -89.12 -89.28 23231.0 8.623100e+07 -0.18 -0.02 -0.02 3.25 72 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... 73 | 4756 贵州茅台 600519 2021-07-23 1937.82 1900.00 1937.82 1895.09 47585.0 9.057762e+09 2.20 -2.06 -40.01 0.38 74 | 4757 贵州茅台 600519 2021-07-26 1879.00 1804.11 1879.00 1780.00 98619.0 1.789436e+10 5.21 -5.05 -95.89 0.79 75 | 4758 贵州茅台 600519 2021-07-27 1803.00 1712.89 1810.00 1703.00 86577.0 1.523081e+10 5.93 -5.06 -91.22 0.69 76 | 4759 贵州茅台 600519 2021-07-28 1703.00 1768.90 1788.20 1682.12 85369.0 1.479247e+10 6.19 3.27 56.01 0.68 77 | 4760 贵州茅台 600519 2021-07-29 1810.01 1740.00 1823.00 1734.34 51035.0 9.067345e+09 5.01 -1.63 -28.90 0.41 78 | 79 | [4761 rows x 13 columns] 80 | ``` 81 | 82 | - 获取非 A 股的股票 K 线数据(支持输入股票名称以及代码) 83 | 84 | ```python 85 | >>> import efinance as ef 86 | >>> # 股票代码 87 | >>> stock_code = 'AAPL' 88 | >>> ef.stock.get_quote_history(stock_code) 89 | 股票名称 股票代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 90 | 0 苹果 AAPL 1984-09-07 -5.37 -5.37 -5.36 -5.37 2981600.0 0.000000e+00 0.00 0.00 0.00 0.02 91 | 1 苹果 AAPL 1984-09-10 -5.37 -5.37 -5.36 -5.37 2346400.0 0.000000e+00 -0.19 0.00 0.00 0.01 92 | 2 苹果 AAPL 1984-09-11 -5.36 -5.36 -5.36 -5.36 5444000.0 0.000000e+00 0.00 0.19 0.01 0.03 93 | 3 苹果 AAPL 1984-09-12 -5.36 -5.37 -5.36 -5.37 4773600.0 0.000000e+00 -0.19 -0.19 -0.01 0.03 94 | 4 苹果 AAPL 1984-09-13 -5.36 -5.36 -5.36 -5.36 7429600.0 0.000000e+00 0.00 0.19 0.01 0.04 95 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... 96 | 8739 苹果 AAPL 2021-07-22 145.94 146.80 148.19 145.81 77338156.0 1.137623e+10 1.64 0.96 1.40 0.47 97 | 8740 苹果 AAPL 2021-07-23 147.55 148.56 148.72 146.92 71447416.0 1.058233e+10 1.23 1.20 1.76 0.43 98 | 8741 苹果 AAPL 2021-07-26 148.27 148.99 149.83 147.70 72434089.0 1.080774e+10 1.43 0.29 0.43 0.44 99 | 8742 苹果 AAPL 2021-07-27 149.12 146.77 149.21 145.55 104818578.0 1.540140e+10 2.46 -1.49 -2.22 0.63 100 | 8743 苹果 AAPL 2021-07-28 144.81 144.98 146.97 142.54 118931191.0 1.723188e+10 3.02 -1.22 -1.79 0.72 101 | 102 | [8744 rows x 13 columns] 103 | 104 | >>> # 股票名称 105 | >>> stock_name = '微软' 106 | >>> ef.stock.get_quote_history(stock_name) 107 | 股票名称 股票代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 108 | 0 微软 MSFT 1986-03-13 -20.74 -20.73 -20.73 -20.74 1.031789e+09 0.000000e+00 0.00 0.00 0.00 13.72 109 | 1 微软 MSFT 1986-03-14 -20.73 -20.73 -20.73 -20.73 3.081600e+08 0.000000e+00 0.00 0.00 0.00 4.10 110 | 2 微软 MSFT 1986-03-17 -20.73 -20.73 -20.73 -20.73 1.331712e+08 0.000000e+00 0.00 0.00 0.00 1.77 111 | 3 微软 MSFT 1986-03-18 -20.73 -20.73 -20.73 -20.73 6.776640e+07 0.000000e+00 0.00 0.00 0.00 0.90 112 | 4 微软 MSFT 1986-03-19 -20.73 -20.73 -20.73 -20.73 4.789440e+07 0.000000e+00 0.00 0.00 0.00 0.64 113 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... 114 | 8357 微软 MSFT 2021-07-22 283.84 286.14 286.42 283.42 2.338406e+07 6.677062e+09 1.07 1.68 4.74 0.31 115 | 8358 微软 MSFT 2021-07-23 287.37 289.67 289.99 286.50 2.276807e+07 6.578686e+09 1.22 1.23 3.53 0.30 116 | 8359 微软 MSFT 2021-07-26 289.00 289.05 289.69 286.64 2.317607e+07 6.685868e+09 1.05 -0.21 -0.62 0.31 117 | 8360 微软 MSFT 2021-07-27 289.43 286.54 289.58 282.95 3.360407e+07 9.599993e+09 2.29 -0.87 -2.51 0.45 118 | 8361 微软 MSFT 2021-07-28 288.99 286.22 290.15 283.83 3.356685e+07 9.638499e+09 2.21 -0.11 -0.32 0.45 119 | 120 | [8362 rows x 13 columns] 121 | ``` 122 | 123 | - 获取 ETF K 线数据 124 | 125 | ```python 126 | >>> import efinance as ef 127 | >>> # ETF 代码(以中概互联网 ETF 为例) 128 | >>> etf_code = '513050' 129 | >>> ef.stock.get_quote_history(etf_code) 130 | 股票名称 股票代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 131 | 0 中概互联网ETF 513050 2017-01-18 0.989 0.977 0.989 0.969 345605.0 3.381795e+07 0.00 0.00 0.000 0.26 132 | 1 中概互联网ETF 513050 2017-01-19 0.978 0.989 0.990 0.978 257716.0 2.542553e+07 1.23 1.23 0.012 0.19 133 | 2 中概互联网ETF 513050 2017-01-20 0.989 0.988 0.990 0.986 50980.0 5.043289e+06 0.40 -0.10 -0.001 0.04 134 | 3 中概互联网ETF 513050 2017-01-23 0.988 0.988 0.989 0.986 13739.0 1.356129e+06 0.30 0.00 0.000 0.01 135 | 4 中概互联网ETF 513050 2017-01-24 0.989 0.989 0.992 0.987 17937.0 1.774398e+06 0.51 0.10 0.001 0.01 136 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... 137 | 1097 中概互联网ETF 513050 2021-07-23 1.789 1.760 1.789 1.758 4427623.0 7.836530e+08 1.73 -1.51 -0.027 3.32 138 | 1098 中概互联网ETF 513050 2021-07-26 1.679 1.645 1.698 1.642 13035366.0 2.182816e+09 3.18 -6.53 -0.115 9.78 139 | 1099 中概互联网ETF 513050 2021-07-27 1.600 1.547 1.620 1.546 14269546.0 2.257610e+09 4.50 -5.96 -0.098 10.70 140 | 1100 中概互联网ETF 513050 2021-07-28 1.545 1.552 1.578 1.506 13141023.0 2.024106e+09 4.65 0.32 0.005 9.85 141 | 1101 中概互联网ETF 513050 2021-07-29 1.615 1.641 1.651 1.606 10658041.0 1.734404e+09 2.90 5.73 0.089 7.99 142 | 143 | [1102 rows x 13 columns] 144 | ``` 145 | 146 | - 获取单只股票 5 分钟 K 线数据 147 | 148 | ```python 149 | >>> import efinance as ef 150 | >>> # 股票代码 151 | >>> stock_code = '600519' 152 | >>> # 5 分钟 153 | >>> frequency = 5 154 | >>> ef.stock.get_quote_history(stock_code, klt=frequency) 155 | 股票名称 股票代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 156 | 0 贵州茅台 600519 2021-06-16 09:35 2172.71 2159.71 2175.71 2150.74 1885.0 411159309.0 1.15 -0.64 -14.00 0.02 157 | 1 贵州茅台 600519 2021-06-16 09:40 2156.69 2148.71 2160.48 2143.37 1238.0 268790684.0 0.79 -0.51 -11.00 0.01 158 | 2 贵州茅台 600519 2021-06-16 09:45 2149.79 2159.71 2160.69 2149.79 706.0 153631002.0 0.51 0.51 11.00 0.01 159 | 3 贵州茅台 600519 2021-06-16 09:50 2159.61 2148.87 2159.71 2148.87 586.0 127346502.0 0.50 -0.50 -10.84 0.00 160 | 4 贵州茅台 600519 2021-06-16 09:55 2148.87 2161.04 2163.71 2148.72 788.0 171491075.0 0.70 0.57 12.17 0.01 161 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... 162 | 1521 贵州茅台 600519 2021-07-29 13:50 1746.51 1746.09 1748.95 1746.01 738.0 128889575.0 0.17 -0.09 -1.49 0.01 163 | 1522 贵州茅台 600519 2021-07-29 13:55 1746.08 1742.01 1746.09 1741.96 831.0 144968679.0 0.24 -0.23 -4.08 0.01 164 | 1523 贵州茅台 600519 2021-07-29 14:00 1742.00 1739.58 1742.00 1739.58 864.0 150446840.0 0.14 -0.14 -2.43 0.01 165 | 1524 贵州茅台 600519 2021-07-29 14:05 1741.87 1740.00 1745.00 1738.88 1083.0 188427970.0 0.35 0.02 0.42 0.01 166 | 1525 贵州茅台 600519 2021-07-29 14:10 1740.00 1740.02 1740.10 1740.00 59.0 10315488.0 0.01 0.00 0.02 0.00 167 | 168 | [1526 rows x 13 columns] 169 | ``` 170 | 171 | - 沪深市场 A 股最新状况 172 | 173 | ```python 174 | >>> import efinance as ef 175 | >>> ef.stock.get_realtime_quotes() 176 | 股票代码 股票名称 涨跌幅 最新价 最高 最低 今开 涨跌额 换手率 量比 动态市盈率 成交量 成交额 昨日收盘 总市值 流通市值 行情ID 市场类型 177 | 0 688787 N海天 277.59 139.48 172.39 139.25 171.66 102.54 85.62 - 78.93 74519 1110318832.0 36.94 5969744000 1213908667 1.688787 沪A 178 | 1 301045 N天禄 149.34 39.42 48.95 39.2 48.95 23.61 66.66 - 37.81 163061 683878656.0 15.81 4066344240 964237089 0.301045 深A 179 | 2 300532 今天国际 20.04 12.16 12.16 10.69 10.69 2.03 8.85 3.02 -22.72 144795 171535181.0 10.13 3322510580 1989333440 0.300532 深A 180 | 3 300600 国瑞科技 20.02 13.19 13.19 11.11 11.41 2.2 18.61 2.82 218.75 423779 541164432.0 10.99 3915421427 3003665117 0.300600 深A 181 | 4 300985 致远新能 20.01 47.08 47.08 36.8 39.4 7.85 66.65 2.17 58.37 210697 897370992.0 39.23 6277336472 1488300116 0.300985 深A 182 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 183 | 4598 603186 华正新材 -10.0 43.27 44.09 43.27 43.99 -4.81 1.98 0.48 25.24 27697 120486294.0 48.08 6146300650 6063519472 1.603186 沪A 184 | 4599 688185 康希诺-U -10.11 476.4 534.94 460.13 530.0 -53.6 6.02 2.74 -2088.07 40239 1960540832.0 530.0 117885131884 31831479215 1.688185 沪A 185 | 4600 688148 芳源股份 -10.57 31.3 34.39 31.3 33.9 -3.7 26.07 0.56 220.01 188415 620632512.0 35.0 15923562000 2261706043 1.688148 沪A 186 | 4601 300034 钢研高纳 -10.96 43.12 46.81 42.88 46.5 -5.31 7.45 1.77 59.49 323226 1441101824.0 48.43 20959281094 18706911861 0.300034 深A 187 | 4602 300712 永福股份 -13.71 96.9 110.94 95.4 109.0 -15.4 6.96 1.26 511.21 126705 1265152928.0 112.3 17645877600 17645877600 0.300712 深A 188 | 189 | [4603 rows x 18 columns] 190 | ``` 191 | 192 | - 股票龙虎榜 193 | 194 | ```python 195 | >>> import efinance as ef 196 | >>> # 获取最新一个公开的龙虎榜数据(后面还有获取指定日期区间的示例代码) 197 | >>> ef.stock.get_daily_billboard() 198 | 股票代码 股票名称 上榜日期 解读 收盘价 涨跌幅 换手率 龙虎榜净买额 龙虎榜买入额 龙虎榜卖出额 龙虎榜成交额 市场总成交额 净买额占总成交比 成交额占总成交比 流通市值 上榜原因 199 | 0 000608 阳光股份 2021-08-27 卖一主卖,成功率48.36% 3.73 -9.9034 3.8430 -8.709942e+06 1.422786e+07 2.293780e+07 3.716565e+07 110838793 -7.858208 33.531268 2.796761e+09 日跌幅偏离值达到7%的前5只证券 200 | 1 000751 锌业股份 2021-08-27 主力做T,成功率18.84% 5.32 -2.9197 19.6505 -1.079219e+08 5.638899e+07 1.643109e+08 2.206999e+08 1462953973 -7.376984 15.085906 7.500502e+09 日振幅值达到15%的前5只证券 201 | 2 000762 西藏矿业 2021-08-27 北京资金买入,成功率39.42% 63.99 1.0741 15.6463 2.938758e+07 4.675541e+08 4.381665e+08 9.057206e+08 4959962598 0.592496 18.260633 3.332571e+10 日振幅值达到15%的前5只证券 202 | 3 000833 粤桂股份 2021-08-27 实力游资买入,成功率44.55% 8.87 10.0496 8.8263 4.993555e+07 1.292967e+08 7.936120e+07 2.086580e+08 895910429 5.573721 23.290046 3.353614e+09 连续三个交易日内,涨幅偏离值累计达到20%的证券 203 | 4 001208 华菱线缆 2021-08-27 1家机构买入,成功率40.43% 19.72 4.3386 46.1985 4.055258e+07 1.537821e+08 1.132295e+08 2.670117e+08 1203913048 3.368398 22.178651 2.634710e+09 日换手率达到20%的前5只证券 204 | .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 205 | 70 688558 国盛智科 2021-08-27 买一主买,成功率38.71% 60.72 1.6064 34.0104 1.835494e+07 1.057779e+08 8.742293e+07 1.932008e+08 802569300 2.287023 24.072789 2.321743e+09 有价格涨跌幅限制的日换手率达到30%的前五只证券 206 | 71 688596 正帆科技 2021-08-27 1家机构买入,成功率57.67% 26.72 3.1660 3.9065 -1.371039e+07 8.409046e+07 9.780085e+07 1.818913e+08 745137400 -1.839982 24.410438 4.630550e+09 有价格涨跌幅限制的连续3个交易日内收盘价格涨幅偏离值累计达到30%的证券 207 | 72 688663 新风光 2021-08-27 卖一主卖,成功率37.18% 28.17 -17.6316 32.2409 1.036460e+07 5.416901e+07 4.380440e+07 9.797341e+07 274732700 3.772613 35.661358 8.492507e+08 有价格涨跌幅限制的日收盘价格跌幅达到15%的前五只证券 208 | 73 688663 新风光 2021-08-27 卖一主卖,成功率37.18% 28.17 -17.6316 32.2409 1.036460e+07 5.416901e+07 4.380440e+07 9.797341e+07 274732700 3.772613 35.661358 8.492507e+08 有价格涨跌幅限制的日换手率达到30%的前五只证券 209 | 74 688667 菱电电控 2021-08-27 1家机构卖出,成功率49.69% 123.37 -18.8996 17.7701 -2.079877e+06 4.611216e+07 4.819204e+07 9.430420e+07 268503400 -0.774618 35.122163 1.461225e+09 有价格涨跌幅限制的日收盘价格跌幅达到15%的前五只证券 210 | 211 | [75 rows x 16 columns] 212 | 213 | >>> # 获取指定日期区间的龙虎榜数据 214 | >>> start_date = '2021-08-20' # 开始日期 215 | >>> end_date = '2021-08-27' # 结束日期 216 | >>> ef.stock.get_daily_billboard(start_date = start_date,end_date = end_date) 217 | 股票代码 股票名称 上榜日期 解读 收盘价 涨跌幅 换手率 龙虎榜净买额 龙虎榜买入额 龙虎榜卖出额 龙虎榜成交额 市场总成交额 净买额占总成交比 成交额占总成交比 流通市值 上榜原因 218 | 0 000608 阳光股份 2021-08-27 卖一主卖,成功率48.36% 3.73 -9.9034 3.8430 -8.709942e+06 1.422786e+07 2.293780e+07 3.716565e+07 110838793 -7.858208 33.531268 2.796761e+09 日跌幅偏离值达到7%的前5只证券 219 | 1 000751 锌业股份 2021-08-27 主力做T,成功率18.84% 5.32 -2.9197 19.6505 -1.079219e+08 5.638899e+07 1.643109e+08 2.206999e+08 1462953973 -7.376984 15.085906 7.500502e+09 日振幅值达到15%的前5只证券 220 | 2 000762 西藏矿业 2021-08-27 北京资金买入,成功率39.42% 63.99 1.0741 15.6463 2.938758e+07 4.675541e+08 4.381665e+08 9.057206e+08 4959962598 0.592496 18.260633 3.332571e+10 日振幅值达到15%的前5只证券 221 | 3 000833 粤桂股份 2021-08-27 实力游资买入,成功率44.55% 8.87 10.0496 8.8263 4.993555e+07 1.292967e+08 7.936120e+07 2.086580e+08 895910429 5.573721 23.290046 3.353614e+09 连续三个交易日内,涨幅偏离值累计达到20%的证券 222 | 4 001208 华菱线缆 2021-08-27 1家机构买入,成功率40.43% 19.72 4.3386 46.1985 4.055258e+07 1.537821e+08 1.132295e+08 2.670117e+08 1203913048 3.368398 22.178651 2.634710e+09 日换手率达到20%的前5只证券 223 | .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 224 | 414 605580 恒盛能源 2021-08-20 买一主买,成功率33.33% 13.28 10.0249 0.4086 2.413149e+06 2.713051e+06 2.999022e+05 3.012953e+06 2713051 88.945937 111.054054 6.640000e+08 有价格涨跌幅限制的日收盘价格涨幅偏离值达到7%的前三只证券 225 | 415 688029 南微医学 2021-08-20 4家机构卖出,成功率55.82% 204.61 -18.5340 8.1809 -1.412053e+08 1.883342e+08 3.295394e+08 5.178736e+08 762045800 -18.529760 67.958326 9.001510e+09 有价格涨跌幅限制的日收盘价格跌幅达到15%的前五只证券 226 | 416 688408 中信博 2021-08-20 4家机构卖出,成功率47.86% 179.98 -0.0666 15.3723 -4.336304e+07 3.750919e+08 4.184550e+08 7.935469e+08 846547400 -5.122340 93.739221 5.695886e+09 有价格涨跌幅限制的日价格振幅达到30%的前五只证券 227 | 417 688556 高测股份 2021-08-20 上海资金买入,成功率60.21% 51.97 17.0495 10.6452 -3.940045e+07 1.642095e+08 2.036099e+08 3.678194e+08 575411600 -6.847351 63.922831 5.739089e+09 有价格涨跌幅限制的日收盘价格涨幅达到15%的前五只证券 228 | 418 688636 智明达 2021-08-20 2家机构买入,成功率47.37% 161.90 15.8332 11.9578 2.922406e+07 6.598126e+07 3.675721e+07 1.027385e+08 188330100 15.517464 54.552336 1.647410e+09 有价格涨跌幅限制的日收盘价格涨幅达到15%的前五只证券 229 | 230 | [418 rows x 16 columns] 231 | ``` 232 | 233 | - 沪深 A 股股票季度表现 234 | 235 | ```python 236 | >>> import efinance as ef 237 | >>> ef.stock.get_all_company_performance() # 默认为最新季度,亦可指定季度 238 | 股票代码 股票简称 公告日期 营业收入 营业收入同比增长 营业收入季度环比 净利润 净利润同比增长 净利润季度环比 每股收益 每股净资产 净资产收益率 销售毛利率 每股经营现金流量 239 | 0 688981 中芯国际 2021-08-28 00:00:00 1.609039e+10 22.253453 20.6593 5.241321e+09 278.100000 307.8042 0.6600 11.949525 5.20 26.665642 1.182556 240 | 1 688819 天能股份 2021-08-28 00:00:00 1.625468e+10 9.343279 23.9092 6.719446e+08 -14.890000 -36.8779 0.7100 11.902912 6.15 17.323263 -1.562187 241 | 2 688789 宏华数科 2021-08-28 00:00:00 4.555604e+08 56.418441 6.5505 1.076986e+08 49.360000 -7.3013 1.8900 14.926761 13.51 43.011243 1.421272 242 | 3 688681 科汇股份 2021-08-28 00:00:00 1.503343e+08 17.706987 121.9407 1.664509e+07 -13.100000 383.3331 0.2100 5.232517 4.84 47.455511 -0.232395 243 | 4 688670 金迪克 2021-08-28 00:00:00 3.209423e+07 -63.282413 -93.1788 -2.330505e+07 -242.275001 -240.1554 -0.3500 3.332254 -10.10 85.308531 1.050348 244 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 245 | 3720 600131 国网信通 2021-07-16 00:00:00 2.880378e+09 6.787087 69.5794 2.171389e+08 29.570000 296.2051 0.1800 4.063260 4.57 19.137437 -0.798689 246 | 3721 600644 乐山电力 2021-07-15 00:00:00 1.257030e+09 18.079648 5.7300 8.379727e+07 -14.300000 25.0007 0.1556 3.112413 5.13 23.645137 0.200906 247 | 3722 002261 拓维信息 2021-07-15 00:00:00 8.901777e+08 47.505282 24.0732 6.071063e+07 68.320000 30.0596 0.0550 2.351598 2.37 37.047968 -0.131873 248 | 3723 601952 苏垦农发 2021-07-13 00:00:00 4.544138e+09 11.754570 47.8758 3.288132e+08 1.460000 83.1486 0.2400 3.888046 6.05 15.491684 -0.173772 249 | 3724 601568 北元集团 2021-07-09 00:00:00 6.031506e+09 32.543303 30.6352 1.167989e+09 61.050000 40.8165 0.3200 3.541533 9.01 27.879243 0.389860 250 | 251 | [3725 rows x 14 columns] 252 | 253 | ``` 254 | 255 | - 股票历史单子流入数据(日级) 256 | 257 | ```python 258 | >>> import efinance as ef 259 | >>> ef.stock.get_history_bill('300750') 260 | 股票名称 股票代码 日期 主力净流入 小单净流入 中单净流入 大单净流入 超大单净流入 主力净流入占比 小单流入净占比 中单流入净占比 大单流入净占比 超大单流入净占比 收盘价 涨跌幅 261 | 0 宁德时代 300750 2021-03-18 4.453786e+07 51241536.0 -9.577939e+07 -26680704.0 71218560.0 1.16 1.33 -2.49 -0.69 1.85 335.56 0.84 262 | 1 宁德时代 300750 2021-03-19 -6.129661e+08 423235296.0 1.897308e+08 -244136864.0 -368829200.0 -10.13 6.99 3.14 -4.03 -6.09 316.26 -5.75 263 | 2 宁德时代 300750 2021-03-22 -5.674665e+08 473253808.0 9.421272e+07 -255868192.0 -311598336.0 -7.95 6.63 1.32 -3.58 -4.37 307.56 -2.75 264 | 3 宁德时代 300750 2021-03-23 -3.168412e+08 131142880.0 1.856984e+08 -349417168.0 32575936.0 -6.88 2.85 4.03 -7.59 0.71 303.67 -1.26 265 | 4 宁德时代 300750 2021-03-24 -5.999049e+08 371268928.0 2.286360e+08 -6849616.0 -593055328.0 -8.18 5.06 3.12 -0.09 -8.09 288.55 -4.98 266 | .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 267 | 97 宁德时代 300750 2021-08-09 -1.152779e+09 -596512.0 1.153376e+09 -370189552.0 -782589456.0 -12.09 -0.01 12.10 -3.88 -8.21 516.00 -5.13 268 | 98 宁德时代 300750 2021-08-10 -1.009431e+09 -358999.0 1.009790e+09 -392670720.0 -616759952.0 -11.03 -0.00 11.03 -4.29 -6.74 510.50 -1.07 269 | 99 宁德时代 300750 2021-08-11 1.305631e+08 -475792.0 -1.300873e+08 -204097776.0 334660864.0 2.25 -0.01 -2.25 -3.52 5.78 517.25 1.32 270 | 100 宁德时代 300750 2021-08-12 -1.425337e+09 -488240.0 1.425825e+09 -454688192.0 -970648896.0 -16.58 -0.01 16.58 -5.29 -11.29 502.00 -2.95 271 | 101 宁德时代 300750 2021-08-13 -3.111439e+08 -895641.0 3.120392e+08 -145200128.0 -165943808.0 -2.21 -0.01 2.22 -1.03 -1.18 502.05 0.01 272 | 273 | [102 rows x 15 columns] 274 | ``` 275 | 276 | - 股票最新一个交易日单子流入数据(分钟级) 277 | 278 | ```python 279 | >>> import efinance as ef 280 | >>> ef.stock.get_today_bill('300750') 281 | 股票名称 股票代码 时间 主力净流入 小单净流入 中单净流入 大单净流入 超大单净流入 282 | 0 宁德时代 300750 2021-08-13 09:31 -58855676.0 -171274.0 59026945.0 22025460.0 -80881136.0 283 | 1 宁德时代 300750 2021-08-13 09:32 -50671227.0 -190312.0 50861534.0 8927176.0 -59598403.0 284 | 2 宁德时代 300750 2021-08-13 09:33 -67833979.0 -190312.0 68024288.0 34170593.0 -102004572.0 285 | 3 宁德时代 300750 2021-08-13 09:34 -28890553.0 -220312.0 29110861.0 16373829.0 -45264382.0 286 | 4 宁德时代 300750 2021-08-13 09:35 -14955904.0 -482660.0 15438561.0 14601153.0 -29557057.0 287 | .. ... ... ... ... ... ... ... ... 288 | 235 宁德时代 300750 2021-08-13 14:56 -311695708.0 -895633.0 312591337.0 -144447542.0 -167248166.0 289 | 236 宁德时代 300750 2021-08-13 14:57 -310641455.0 -895633.0 311537085.0 -144697852.0 -165943603.0 290 | 237 宁德时代 300750 2021-08-13 14:58 -311143584.0 -895633.0 312039214.0 -145199981.0 -165943603.0 291 | 238 宁德时代 300750 2021-08-13 14:59 -311143584.0 -895633.0 312039214.0 -145199981.0 -165943603.0 292 | 239 宁德时代 300750 2021-08-13 15:00 -311143584.0 -895633.0 312039214.0 -145199981.0 -165943603.0 293 | 294 | [240 rows x 8 columns] 295 | ``` 296 | 297 | ### Fund 298 | 299 | - 获取基金历史净值信息 300 | 301 | ```python 302 | >>> import efinance as ef 303 | >>> ef.fund.get_quote_history('161725') 304 | 日期 单位净值 累计净值 涨跌幅 305 | 0 2021-07-29 1.2726 2.9037 -1.52 306 | 1 2021-07-28 1.2922 2.9233 0.85 307 | 2 2021-07-27 1.2813 2.9124 -3.6 308 | 3 2021-07-26 1.3292 2.9603 -7.24 309 | 4 2021-07-23 1.4329 3.0640 -2.29 310 | ... ... ... ... ... 311 | 1502 2015-06-08 1.0380 1.0380 2.5692 312 | 1503 2015-06-05 1.0120 1.0120 1.5045 313 | 1504 2015-06-04 0.9970 0.9970 -- 314 | 1505 2015-05-29 0.9950 0.9950 -- 315 | 1506 2015-05-27 1.0000 1.0000 -- 316 | 317 | [1507 rows x 4 columns] 318 | ``` 319 | 320 | - 获取基金公开持仓信息 321 | 322 | ```python 323 | >>> import efinance as ef 324 | >>> # 获取最新公开的持仓数据 325 | >>> ef.fund.get_invest_position('161725') 326 | 基金代码 股票代码 股票简称 持仓占比 较上期变化 公开日期 327 | 0 161725 600519 贵州茅台 16.78 1.36 2022-03-31 328 | 1 161725 600809 山西汾酒 15.20 0.52 2022-03-31 329 | 2 161725 000568 泸州老窖 14.57 -0.89 2022-03-31 330 | 3 161725 000858 五粮液 12.83 -1.26 2022-03-31 331 | 4 161725 002304 洋河股份 11.58 0.91 2022-03-31 332 | 5 161725 603369 今世缘 3.75 -0.04 2022-03-31 333 | 6 161725 000799 酒鬼酒 3.40 -0.91 2022-03-31 334 | 7 161725 000596 古井贡酒 3.27 -0.24 2022-03-31 335 | 8 161725 600779 水井坊 2.59 -0.26 2022-03-31 336 | 9 161725 603589 口子窖 2.30 -0.38 2022-03-31 337 | ``` 338 | 339 | - 多只基金信息 340 | 341 | ```python 342 | >>> import efinance as ef 343 | >>> # 获取多只基金基本信息 344 | >>> ef.fund.get_base_info(['161725','005827']) 345 | 0 161725 招商中证白酒指数(LOF)A 2015-05-27 -6.03 1.1959 招商基金 2021-07-30 产品特色:布局白酒领域的指数基金,历史业绩优秀,外资偏爱白酒板块。 346 | 1 005827 易方达蓝筹精选混合 2018-09-05 -2.98 2.4967 易方达基金 2021-07-30 明星消费基金经理另一力作,A+H股同步布局,价值投资典范,适合长期持有。 347 | 348 | ``` 349 | 350 | ### Bond 351 | 352 | - 可转债整体行情 353 | 354 | ```python 355 | >>> import efinance as ef 356 | >>> ef.bond.get_realtime_quotes() 357 | 债券代码 债券名称 涨跌幅 最新价 最高 最低 涨跌额 换手率 动态市盈率 成交量 成交额 昨日收盘 总市值 流通市值 行情ID 市场类型 358 | 0 123015 蓝盾转债 13.49 198.613 205.0 175.5 23.613 315.36 - 316062 613480512.0 175.0 199056701 199056701 0.123015 深A 359 | 1 123077 汉得转债 9.59 115.51 122.971 105.401 10.11 32.59 - 305380 358093216.0 105.4 1082332396 1082332396 0.123077 深A 360 | 2 123066 赛意转债 8.08 232.377 245.8 225.0 17.377 470.3 - 454204 1081363632.0 215.0 224423665 224423665 0.123066 深A 361 | 3 128093 百川转债 7.69 360.751 367.9 335.5 25.751 343.84 - 558874 1984944768.0 335.0 586364315 586364315 0.128093 深A 362 | 4 128082 华锋转债 7.41 158.507 163.769 147.089 10.935 103.16 - 226444 355827984.0 147.572 347931900 347931900 0.128082 深A 363 | .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 364 | 383 123087 明电转债 -4.34 151.75 169.0 150.302 -6.879 117.66 - 520370 817884784.0 158.629 671147760 671147760 0.123087 深A 365 | 384 123070 鹏辉转债 -4.63 175.001 179.799 174.471 -8.499 18.46 - 144998 257005833.0 183.5 1374730681 1374730681 0.123070 深A 366 | 385 123027 蓝晓转债 -4.67 338.413 352.825 338.015 -16.586 44.23 - 47356 162870853.0 354.999 362300558 362300558 0.123027 深A 367 | 386 113621 彤程转债 -5.03 215.61 222.5 214.41 -11.41 11.46 - 91710 200327611.0 227.02 1725268098 1725268098 1.113621 沪A 368 | 387 123047 久吾转债 -5.7 305.5 319.52 305.382 -18.47 122.41 - 193587 600277600.0 323.97 483119533 483119533 0.123047 深A 369 | 370 | [388 rows x 16 columns] 371 | ``` 372 | 373 | - 全部可转债信息 374 | 375 | ```python 376 | >>> import efinance as ef 377 | >>> ef.bond.get_all_base_info() 378 | 债券代码 债券名称 正股代码 正股名称 债券评级 申购日期 发行规模(亿) 网上发行中签率(%) 上市日期 到期日期 期限(年) 利率说明 379 | 0 123120 隆华转债 300263 隆华科技 AA- 2021-07-30 00:00:00 7.989283 NaN None 2027-07-30 00:00:00 6 第一年为0.40%、第二年为0.70%、第三年为1.00%、第四年为1.60%、第五年为2.... 380 | 1 110081 闻泰转债 600745 闻泰科技 AA+ 2021-07-28 00:00:00 86.000000 0.044030 None 2027-07-28 00:00:00 6 第一年0.10%、第二年0.20%、第三年0.30%、第四年1.50%、第五年1.80%、第... 381 | 2 118001 金博转债 688598 金博股份 A+ 2021-07-23 00:00:00 5.999010 0.001771 None 2027-07-23 00:00:00 6 第一年0.50%、第二年0.70%、第三年1.20%、第四年1.80%、第五年2.40%、第... 382 | 3 123119 康泰转2 300601 康泰生物 AA 2021-07-15 00:00:00 20.000000 0.014182 None 2027-07-15 00:00:00 6 第一年为0.30%、第二年为0.50%、第三年为1.00%、第四年为1.50%、第五年为1.... 383 | 4 113627 太平转债 603877 太平鸟 AA 2021-07-15 00:00:00 8.000000 0.000542 None 2027-07-15 00:00:00 6 第一年0.30%、第二年0.50%、第三年1.00%、第四年1.50%、第五年1.80%、第... 384 | .. ... ... ... ... ... ... ... ... ... ... ... ... 385 | 80 110227 赤化转债 600227 圣济堂 AAA 2007-10-10 00:00:00 4.500000 0.158854 2007-10-23 00:00:00 2009-05-25 00:00:00 1.6192 票面利率和付息日期:本次发行的可转债票面利率第一年为1.5%、第二年为1.8%、第三年为2.... 386 | 81 126006 07深高债 600548 深高速 AAA 2007-10-09 00:00:00 15.000000 0.290304 2007-10-30 00:00:00 2013-10-09 00:00:00 6 None 387 | 82 110971 恒源转债 600971 恒源煤电 AAA 2007-09-24 00:00:00 4.000000 5.311774 2007-10-12 00:00:00 2009-12-21 00:00:00 2.2484 票面利率为:第一年年利率1.5%,第二年年利率1.8%,第三年年利率2.1%,第四年年利率2... 388 | 83 110567 山鹰转债 600567 山鹰国际 AA 2007-09-05 00:00:00 4.700000 0.496391 2007-09-17 00:00:00 2010-02-01 00:00:00 2.4055 票面利率和付息日期:本次发行的可转债票面利率第一年为1.4%,第二年为1.7%,第三年为2.... 389 | 84 110026 中海转债 600026 中远海能 AAA 2007-07-02 00:00:00 20.000000 1.333453 2007-07-12 00:00:00 2008-03-27 00:00:00 0.737 票面利率:第一年为1.84%,第二年为2.05%,第三年为2.26%,第四年为2.47%,第... 390 | 391 | [585 rows x 12 columns] 392 | ``` 393 | 394 | - 指定可转债 K 线数据 395 | 396 | ```python 397 | >>> import efinance as ef 398 | >>> # 可转债代码(以 东财转3 为例) 399 | >>> bond_code = '123111' 400 | >>> ef.bond.get_quote_history(bond_code) 401 | 债券名称 债券代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 402 | 0 东财转3 123111 2021-04-23 130.000 130.000 130.000 130.000 1836427 2.387355e+09 0.00 30.00 30.000 11.62 403 | 1 东财转3 123111 2021-04-26 130.353 130.010 133.880 125.110 8610944 1.126033e+10 6.75 0.01 0.010 54.50 404 | 2 东财转3 123111 2021-04-27 129.000 129.600 130.846 128.400 1820766 2.357472e+09 1.88 -0.32 -0.410 11.52 405 | 3 东财转3 123111 2021-04-28 129.100 130.770 131.663 128.903 1467727 1.921641e+09 2.13 0.90 1.170 9.29 406 | 4 东财转3 123111 2021-04-29 130.690 131.208 133.150 130.560 1156934 1.525974e+09 1.98 0.33 0.438 7.32 407 | .. ... ... ... ... ... ... ... ... ... ... ... ... ... 408 | 72 东财转3 123111 2021-08-09 159.600 159.300 162.990 158.690 596124 9.585751e+08 2.69 -0.34 -0.550 3.77 409 | 73 东财转3 123111 2021-08-10 159.190 160.950 161.450 157.000 517237 8.234596e+08 2.79 1.04 1.650 3.27 410 | 74 东财转3 123111 2021-08-11 161.110 159.850 162.300 159.400 298906 4.800711e+08 1.80 -0.68 -1.100 1.89 411 | 75 东财转3 123111 2021-08-12 159.110 158.290 160.368 158.010 270641 4.298100e+08 1.48 -0.98 -1.560 1.71 412 | 76 东财转3 123111 2021-08-13 158.000 158.358 160.290 157.850 250059 3.975513e+08 1.54 0.04 0.068 1.58 413 | 414 | [77 rows x 13 columns] 415 | ``` 416 | 417 | ### Futures 418 | 419 | - 获取交易所期货基本信息 420 | 421 | ```python 422 | >>> import efinance as ef 423 | >>> ef.futures.get_futures_base_info() 424 | 期货代码 期货名称 行情ID 市场类型 425 | 0 ZCM 动力煤主力 115.ZCM 郑商所 426 | 1 ZC201 动力煤201 115.ZC201 郑商所 427 | 2 jm 焦炭主力 114.jm 大商所 428 | 3 j2201 焦炭2201 114.j2201 大商所 429 | 4 jmm 焦煤主力 114.jmm 大商所 430 | .. ... ... ... ... 431 | 846 jm2109 焦煤2109 114.jm2109 大商所 432 | 847 071108 IH2108 8.071108 中金所 433 | 848 070131 IH次主力合约 8.070131 中金所 434 | 849 070120 IH当月连续 8.07012 中金所 435 | 850 lu2109 低硫燃油2109 142.lu2109 上海能源期货交易所 436 | 437 | [851 rows x 4 columns] 438 | ``` 439 | 440 | - 获取期货历史行情 441 | 442 | ```python 443 | >>> import efinance as ef 444 | >>> # 获取全部期货行情ID列表 445 | >>> quote_ids = ef.futures.get_realtime_quotes()['行情ID'] 446 | >>> # 指定单个期货的行情ID(以上面获得到的行情ID列表为例) 447 | >>> quote_id = quote_ids[0] 448 | >>> # 查看第一个行情ID 449 | >>> quote_ids[0] 450 | '115.ZCM' 451 | >>> # 获取第行情ID为第一个的期货日 K 线数据 452 | >>> ef.futures.get_quote_history(quote_id) 453 | 期货名称 期货代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 454 | 0 动力煤主力 ZCM 2015-05-18 440.0 437.6 440.2 437.6 64 2.806300e+06 0.00 0.00 0.0 0.0 455 | 1 动力煤主力 ZCM 2015-05-19 436.0 437.0 437.6 436.0 6 2.621000e+05 0.36 -0.32 -1.4 0.0 456 | 2 动力煤主力 ZCM 2015-05-20 436.8 435.8 437.0 434.8 8 3.487500e+05 0.50 -0.23 -1.0 0.0 457 | 3 动力煤主力 ZCM 2015-05-21 438.0 443.2 446.8 437.8 37 1.631850e+06 2.06 1.65 7.2 0.0 458 | 4 动力煤主力 ZCM 2015-05-22 439.2 441.4 443.8 439.2 34 1.502500e+06 1.04 0.09 0.4 0.0 459 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... 460 | 1524 动力煤主力 ZCM 2021-08-17 755.0 770.8 776.0 750.6 82373 6.288355e+09 3.25 -1.26 -9.8 0.0 461 | 1525 动力煤主力 ZCM 2021-08-18 770.8 776.8 785.8 766.0 77392 6.016454e+09 2.59 1.76 13.4 0.0 462 | 1526 动力煤主力 ZCM 2021-08-19 776.8 777.6 798.0 764.6 97229 7.597474e+09 4.30 0.03 0.2 0.0 463 | 1527 动力煤主力 ZCM 2021-08-20 778.0 793.0 795.0 775.2 70549 5.553617e+09 2.53 1.48 11.6 0.0 464 | 1528 动力煤主力 ZCM 2021-08-23 796.8 836.6 843.8 796.8 82954 6.850341e+09 5.97 6.28 49.4 0.0 465 | 466 | [1529 rows x 13 columns] 467 | 468 | >>> # 指定多个期货的 行情ID 469 | >>> quote_ids = ['115.ZCM','115.ZC109'] 470 | >>> futures_df = ef.futures.get_quote_history(quote_ids) 471 | >>> type(futures_df) 472 | 473 | >>> futures_df['115.ZCM'] 474 | 期货名称 期货代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 475 | 0 动力煤主力 ZCM 2015-05-18 440.0 437.6 440.2 437.6 64 2.806300e+06 0.00 0.00 0.0 0.0 476 | 1 动力煤主力 ZCM 2015-05-19 436.0 437.0 437.6 436.0 6 2.621000e+05 0.36 -0.32 -1.4 0.0 477 | 2 动力煤主力 ZCM 2015-05-20 436.8 435.8 437.0 434.8 8 3.487500e+05 0.50 -0.23 -1.0 0.0 478 | 3 动力煤主力 ZCM 2015-05-21 438.0 443.2 446.8 437.8 37 1.631850e+06 2.06 1.65 7.2 0.0 479 | 4 动力煤主力 ZCM 2015-05-22 439.2 441.4 443.8 439.2 34 1.502500e+06 1.04 0.09 0.4 0.0 480 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... 481 | 1524 动力煤主力 ZCM 2021-08-17 755.0 770.8 776.0 750.6 82373 6.288355e+09 3.25 -1.26 -9.8 0.0 482 | 1525 动力煤主力 ZCM 2021-08-18 770.8 776.8 785.8 766.0 77392 6.016454e+09 2.59 1.76 13.4 0.0 483 | 1526 动力煤主力 ZCM 2021-08-19 776.8 777.6 798.0 764.6 97229 7.597474e+09 4.30 0.03 0.2 0.0 484 | 1527 动力煤主力 ZCM 2021-08-20 778.0 793.0 795.0 775.2 70549 5.553617e+09 2.53 1.48 11.6 0.0 485 | 1528 动力煤主力 ZCM 2021-08-23 796.8 836.6 843.8 796.8 82954 6.850341e+09 5.97 6.28 49.4 0.0 486 | 487 | [1529 rows x 13 columns] 488 | ``` 489 | 490 | --- 491 | 492 | ## Docs 493 | 494 | 在线 API 文档 => [`Docs`](https://efinance.readthedocs.io) 495 | 496 | 如果需要本地使用,则可以使用 `sphinx` 来构建 `efinance` 的文档 497 | 498 | 步骤如下 499 | 500 | - 克隆本仓库到本地 501 | 502 | ```bash 503 | git clone https://github.com/Micro-sheep/efinance 504 | 505 | ``` 506 | 507 | - 生成文档 508 | 509 | ```bash 510 | cd efinance/docs 511 | pip install -r requirements.txt --upgrade 512 | sphinx-build . ./build -b html 513 | ``` 514 | 515 | 以上默认构建英文文档,如需构建中文文档,则最后一行代码改为 516 | 517 | ```bash 518 | sphinx-build . ./build -b html -D language=zh 519 | ``` 520 | 521 | 经过以上步骤,你将会在 `docs/build` 下看的生成的 `html` 文档 522 | 523 | 同时,你也可以使用 `pdoc` 来构建 `efinance` 的文档 524 | 525 | 步骤如下 526 | 527 | - 安装必要依赖 528 | 529 | ```bash 530 | pip install pdoc 531 | git clone https://github.com/Micro-sheep/efinance 532 | ``` 533 | 534 | - 生成文档 535 | 536 | ```bash 537 | cd efinance 538 | pdoc . -d numpy 539 | ``` 540 | 541 | 进行以上步骤之后,你将可以在弹出的浏览器界面看到 `efinance` 的文档。 542 | 543 | ## Contact 544 | 545 | [![zhihu](https://img.shields.io/badge/知乎-blue)](https://www.zhihu.com/people/la-ge-lang-ri-96-69) 546 | [![Github](https://img.shields.io/badge/Github-blue?style=social&logo=github)](https://github.com/Micro-sheep) 547 | [![Email](https://img.shields.io/badge/Email-blue)](mailto:micro-sheep@outlook.com) 548 | -------------------------------------------------------------------------------- /changelog.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## v0.5.5(2025-03-15) 4 | 5 | ### Fixed 6 | 7 | - `get_realtime_quotes` 盘中数据存在重复数据 8 | 9 | ### Changed 10 | 11 | - `get_all_company_performance` 和 `get_latest_holder_number` 速度优化 12 | 13 | --- 14 | 15 | ## v0.5.4(2025-03-10) 16 | 17 | ### Fixed 18 | 19 | - `get_realtime_quotes` 分页更加智能 20 | 21 | --- 22 | 23 | ## v0.5.3(2025-02-17) 24 | 25 | ### Fixed 26 | 27 | - `get_realtime_quotes` 自动分页以获取完整数据 28 | 29 | --- 30 | 31 | ## v0.5.2(2024-04-24) 32 | 33 | ### Fixed 34 | 35 | - 补充 setup.py 缺失的依赖 36 | 37 | --- 38 | 39 | ## v0.5.1(2024-02-22) 40 | 41 | ### Added 42 | 43 | - 增加用于检索股票市场的参数 44 | 45 | --- 46 | 47 | ## v0.5.0(2023-01-08) 48 | 49 | ### Added 50 | 51 | - 增加获取 广期所 期货行情的功能 52 | - 添加扩展市场类型的函数 53 | 54 | --- 55 | 56 | ## v0.4.9(2022-07-29) 57 | 58 | ### Added 59 | 60 | - 为 `get_quote_history` 添加更多选项 61 | 62 | --- 63 | 64 | ## v0.4.8(2022-06-30) 65 | 66 | ### Fixed 67 | 68 | - 修复 `stock` 模块的 `get_base_info` 函数的 bug 69 | 70 | --- 71 | 72 | ## v0.4.7(2022-06-24) 73 | 74 | ### Added 75 | 76 | - 添加获取近 n 日 1 分钟 K 线的功能 77 | 78 | ### Fixed 79 | 80 | - 修复部分函数命名拼写错误 81 | 82 | --- 83 | 84 | ## v0.4.6(2022-06-19) 85 | 86 | ### Changed 87 | 88 | - 从 `stock` 模块中抽离出获取证券最新行情的函数 89 | - 增强 `common` 模块中的配置以支持自定义获取更多属性 90 | 91 | --- 92 | 93 | ## v0.4.5(2022-06-05) 94 | 95 | ### Fixed 96 | 97 | - 修复 `bond` 模块的 `get_base_info` 进行正股代码转换时出现的问题 98 | 99 | ## Added 100 | 101 | 为 `futures` 和 `bond` 模块添加获取最新交易日成交明细的功能 102 | 103 | --- 104 | 105 | ## v0.4.4(2022-04-29) 106 | 107 | ### Added 108 | 109 | - 增加对 python3.10 及其以上版本的适配 110 | 111 | ### Changed 112 | 113 | - 将 `stock` 模块里面的 `get_belong_plate` 重命名为 `get_belong_board` 114 | 115 | --- 116 | 117 | ## v0.4.3(2022-04-28) 118 | 119 | ### Added 120 | 121 | - 为 `stock` 模块添加 `get_belong_plate` 函数,以支持获取股票所属板块 122 | - 为 `stock` 模块添加 `get_deal_detail` 函数,以支持获取股票最新交易日的成交明细 123 | 124 | --- 125 | 126 | ## v0.4.2(2022-03-07) 127 | 128 | ### Changed 129 | 130 | - 扩展 `get_quote_history` 函数,支持通过设定 `kwargs` 来指定返回类型 131 | 132 | ### Added 133 | 134 | - 为 `stock` 模块添加函数 `get_quote_snapshot` 以支持获取沪深市场 3 秒行情快照 135 | 136 | --- 137 | 138 | ## v0.4.0(2021-12-02) 139 | 140 | ### Fiexd 141 | 142 | - 修复 fund 模块的命名错误以及其他 bug 143 | 144 | ### Added 145 | 146 | - 添加对获取北证 A 股市场行情的支持 147 | 148 | --- 149 | 150 | ## v0.3.9(2021-10-23) 151 | 152 | ### Changed 153 | 154 | - 优化 `fund` 模块的获取基金列表的函数 155 | - 更新 `common` 模块的行情配置文件以支持获取更多板块的行情数据 156 | 157 | ### Added 158 | 159 | - 添加获取指数成分股的函数 `efnance.stock.get_members` 160 | - 增强函数 `efnance.stock.get_realtime_quotes` 161 | - 添加获取企业 IPO 审核情况的函数 `efnance.stock.get_latest_ipo_info` 162 | - 为搜索缓存添加过期时间 163 | - 增强获取股东户数变动情况的函数 `efnance.stock.get_latest_holder_number` 164 | 165 | --- 166 | 167 | ## v0.3.8(2021-09-18) 168 | 169 | ### Changed 170 | 171 | - 为 `fund` 模块的获取实时基金涨幅估计函数添加更多字段 172 | 173 | ### Added 174 | 175 | - 添加获取多个板块成分股实时行情以及板块历史行情的功能 176 | - 添加获取 ETF、LOF 基金实时行情的功能 177 | 178 | --- 179 | 180 | ## v0.3.7(2021-08-30) 181 | 182 | ### Added 183 | 184 | - 添加使用 `docker` 安装的方法说明 185 | - 添加获取沪深 A 股股东数量的功能 186 | - 为 `stock` 模块添加龙虎榜数据获取功能 187 | 188 | --- 189 | 190 | ### Fixed 191 | 192 | - 修复 `fund` 模块获取基金代码的函数产生的 bug 193 | - 修复 `fund` 模块中获取基金涨幅估计函数产生的 bug 194 | 195 | ### Changed 196 | 197 | - 为函数 `efinance.stock.get_all_company_performance` 添加更多字段 198 | 199 | ## v0.3.6 (2021-08-21) 200 | 201 | ### Fixed 202 | 203 | - 修复创建缓存文件夹出错的问题 204 | 205 | ### Changed 206 | 207 | - 简化部分代码 208 | 209 | ### Added 210 | 211 | - 为 `futures` 模块添加实时行情获取功能 212 | 213 | --- 214 | 215 | ## v0.3.5 (2021-08-15) 216 | 217 | ### Added 218 | 219 | - 添加沪深市场股票季度业绩表现数据获取功能 220 | - 为股票实时行情数据添加更多字段 221 | - 新增 `common` 模块,抽取出 `bond` 与 `stock` 的共同点放到其中 222 | - 为 `bond` 模块添加获取历史单子流入数据获取的功能 223 | - 添加更多的函数装饰器 224 | 225 | --- 226 | 227 | ## v0.3.4 (2021-08-08) 228 | 229 | ### Changed 230 | 231 | - 修改部分注释文档缩进等级,优化其在 `vscode` 中的显示效果 232 | 233 | --- 234 | 235 | ## v0.3.3 (2021-08-08) 236 | 237 | ### Changed 238 | 239 | - 修改项目文档主页链接 240 | 241 | --- 242 | 243 | ## v0.3.2 (2021-08-08) 244 | 245 | ### Added 246 | 247 | - 使用 `sphinx` 构建文档 248 | - 使用 read the docs 托管文档 249 | 250 | --- 251 | 252 | ## v0.3.1 (2021-08-05) 253 | 254 | ### Added 255 | 256 | - 添加 session 机制 257 | 258 | ### Fixed 259 | 260 | - 修复十大流通股东数据接口 261 | 262 | --- 263 | 264 | ## v0.3.0 (2021-08-03) 265 | 266 | ### Added 267 | 268 | - 添加搜索结果缓存机制 269 | - 引用 `jsonpath` 来解析数据 270 | 271 | ### Fixed 272 | 273 | - 修复股票、债券实时行情接口表头错误(误把最高价写成最新价格) 274 | -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | services: 3 | app: 4 | build: 5 | context: . 6 | # 环境变量文件 7 | env_file: ./.env 8 | # 项目工作目录(可在 .env 文件中找到定义) 9 | working_dir: ${APP_WORKING_DIR} 10 | -------------------------------------------------------------------------------- /docs/api.md: -------------------------------------------------------------------------------- 1 | 2 | ```{eval-rst} 3 | API REFERENCE 4 | ============= 5 | Stock 6 | ----- 7 | .. automodule:: efinance.stock 8 | :members: 9 | :undoc-members: 10 | :show-inheritance: 11 | :inherited-members: 12 | 13 | Fund 14 | ----- 15 | .. automodule:: efinance.fund 16 | :members: 17 | :undoc-members: 18 | :show-inheritance: 19 | :inherited-members: 20 | 21 | Bond 22 | ------- 23 | .. automodule:: efinance.bond 24 | :members: 25 | :undoc-members: 26 | :show-inheritance: 27 | :inherited-members: 28 | 29 | Futures 30 | ------- 31 | .. automodule:: efinance.futures 32 | :members: 33 | :undoc-members: 34 | :show-inheritance: 35 | :inherited-members: 36 | ``` 37 | -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | # Configuration file for the Sphinx documentation builder. 2 | # 3 | # This file only contains a selection of the most common options. For a full 4 | # list see the documentation: 5 | # https://www.sphinx-doc.org/en/master/usage/configuration.html 6 | 7 | # -- Path setup -------------------------------------------------------------- 8 | 9 | # If extensions (or modules to document with autodoc) are in another directory, 10 | # add these directories to sys.path here. If the directory is relative to the 11 | # documentation root, use os.path.abspath to make it absolute, like shown here. 12 | # 13 | import os 14 | import sys 15 | from pathlib import Path 16 | 17 | here = Path(__file__).parent 18 | sys.path.insert(0, os.path.abspath("../")) 19 | sys.path.insert(0, os.path.abspath(".")) 20 | 21 | # -- Project information ----------------------------------------------------- 22 | 23 | project = "efinance" 24 | copyright = "2021, micro sheep" 25 | author = "micro sheep" 26 | version_info = dict() 27 | exec((here / "../efinance/__version__.py").read_text(), version_info) 28 | # The full version, including alpha/beta/rc tags 29 | release = version_info["__version__"] 30 | 31 | # The name of the Pygments (syntax highlighting) style to use. 32 | pygments_style = "sphinx" 33 | # -- General configuration --------------------------------------------------- 34 | 35 | # Add any Sphinx extension module names here, as strings. They can be 36 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 37 | # ones. 38 | extensions = [ 39 | "sphinx_automodapi.automodapi", 40 | "sphinx.ext.autodoc", 41 | "sphinx.ext.intersphinx", 42 | "sphinx.ext.coverage", 43 | "sphinx.ext.imgmath", 44 | "sphinx.ext.viewcode", 45 | "sphinx.ext.napoleon", 46 | "sphinx_rtd_theme", 47 | "myst_parser", 48 | "sphinx_copybutton", 49 | ] 50 | source_suffix = [".rst", ".md"] 51 | # Add any paths that contain templates here, relative to this directory. 52 | templates_path = ["_templates"] 53 | 54 | # List of patterns, relative to source directory, that match files and 55 | # directories to ignore when looking for source files. 56 | # This pattern also affects html_static_path and html_extra_path. 57 | exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] 58 | 59 | 60 | # -- Options for HTML output ------------------------------------------------- 61 | 62 | # The theme to use for HTML and HTML Help pages. See the documentation for 63 | # a list of builtin themes. 64 | # 65 | # html_theme = "sphinx_rtd_theme" 66 | 67 | html_theme = "furo" 68 | -------------------------------------------------------------------------------- /docs/example.md: -------------------------------------------------------------------------------- 1 | ## Examples 2 | 3 | ### Stock 4 | 5 | - 获取股票历史日 K 线数据 6 | 7 | ```python 8 | >>> import efinance as ef 9 | >>> # 股票代码 10 | >>> stock_code = '600519' 11 | >>> ef.stock.get_quote_history(stock_code) 12 | 股票名称 股票代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 13 | 0 贵州茅台 600519 2001-08-27 -89.74 -89.53 -89.08 -90.07 406318.0 1.410347e+09 -1.10 0.92 0.83 56.83 14 | 1 贵州茅台 600519 2001-08-28 -89.64 -89.27 -89.24 -89.72 129647.0 4.634630e+08 -0.54 0.29 0.26 18.13 15 | 2 贵州茅台 600519 2001-08-29 -89.24 -89.36 -89.24 -89.42 53252.0 1.946890e+08 -0.20 -0.10 -0.09 7.45 16 | 3 贵州茅台 600519 2001-08-30 -89.38 -89.22 -89.14 -89.44 48013.0 1.775580e+08 -0.34 0.16 0.14 6.72 17 | 4 贵州茅台 600519 2001-08-31 -89.21 -89.24 -89.12 -89.28 23231.0 8.623100e+07 -0.18 -0.02 -0.02 3.25 18 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... 19 | 4756 贵州茅台 600519 2021-07-23 1937.82 1900.00 1937.82 1895.09 47585.0 9.057762e+09 2.20 -2.06 -40.01 0.38 20 | 4757 贵州茅台 600519 2021-07-26 1879.00 1804.11 1879.00 1780.00 98619.0 1.789436e+10 5.21 -5.05 -95.89 0.79 21 | 4758 贵州茅台 600519 2021-07-27 1803.00 1712.89 1810.00 1703.00 86577.0 1.523081e+10 5.93 -5.06 -91.22 0.69 22 | 4759 贵州茅台 600519 2021-07-28 1703.00 1768.90 1788.20 1682.12 85369.0 1.479247e+10 6.19 3.27 56.01 0.68 23 | 4760 贵州茅台 600519 2021-07-29 1810.01 1740.00 1823.00 1734.34 51035.0 9.067345e+09 5.01 -1.63 -28.90 0.41 24 | 25 | [4761 rows x 13 columns] 26 | ``` 27 | 28 | - 获取非 A 股的股票 K 线数据(支持输入股票名称以及代码) 29 | 30 | ```python 31 | >>> import efinance as ef 32 | >>> # 股票代码 33 | >>> stock_code = 'AAPL' 34 | >>> ef.stock.get_quote_history(stock_code) 35 | 股票名称 股票代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 36 | 0 苹果 AAPL 1984-09-07 -5.37 -5.37 -5.36 -5.37 2981600.0 0.000000e+00 0.00 0.00 0.00 0.02 37 | 1 苹果 AAPL 1984-09-10 -5.37 -5.37 -5.36 -5.37 2346400.0 0.000000e+00 -0.19 0.00 0.00 0.01 38 | 2 苹果 AAPL 1984-09-11 -5.36 -5.36 -5.36 -5.36 5444000.0 0.000000e+00 0.00 0.19 0.01 0.03 39 | 3 苹果 AAPL 1984-09-12 -5.36 -5.37 -5.36 -5.37 4773600.0 0.000000e+00 -0.19 -0.19 -0.01 0.03 40 | 4 苹果 AAPL 1984-09-13 -5.36 -5.36 -5.36 -5.36 7429600.0 0.000000e+00 0.00 0.19 0.01 0.04 41 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... 42 | 8739 苹果 AAPL 2021-07-22 145.94 146.80 148.19 145.81 77338156.0 1.137623e+10 1.64 0.96 1.40 0.47 43 | 8740 苹果 AAPL 2021-07-23 147.55 148.56 148.72 146.92 71447416.0 1.058233e+10 1.23 1.20 1.76 0.43 44 | 8741 苹果 AAPL 2021-07-26 148.27 148.99 149.83 147.70 72434089.0 1.080774e+10 1.43 0.29 0.43 0.44 45 | 8742 苹果 AAPL 2021-07-27 149.12 146.77 149.21 145.55 104818578.0 1.540140e+10 2.46 -1.49 -2.22 0.63 46 | 8743 苹果 AAPL 2021-07-28 144.81 144.98 146.97 142.54 118931191.0 1.723188e+10 3.02 -1.22 -1.79 0.72 47 | 48 | [8744 rows x 13 columns] 49 | 50 | >>> # 股票名称 51 | >>> stock_name = '微软' 52 | >>> ef.stock.get_quote_history(stock_name) 53 | 股票名称 股票代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 54 | 0 微软 MSFT 1986-03-13 -20.74 -20.73 -20.73 -20.74 1.031789e+09 0.000000e+00 0.00 0.00 0.00 13.72 55 | 1 微软 MSFT 1986-03-14 -20.73 -20.73 -20.73 -20.73 3.081600e+08 0.000000e+00 0.00 0.00 0.00 4.10 56 | 2 微软 MSFT 1986-03-17 -20.73 -20.73 -20.73 -20.73 1.331712e+08 0.000000e+00 0.00 0.00 0.00 1.77 57 | 3 微软 MSFT 1986-03-18 -20.73 -20.73 -20.73 -20.73 6.776640e+07 0.000000e+00 0.00 0.00 0.00 0.90 58 | 4 微软 MSFT 1986-03-19 -20.73 -20.73 -20.73 -20.73 4.789440e+07 0.000000e+00 0.00 0.00 0.00 0.64 59 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... 60 | 8357 微软 MSFT 2021-07-22 283.84 286.14 286.42 283.42 2.338406e+07 6.677062e+09 1.07 1.68 4.74 0.31 61 | 8358 微软 MSFT 2021-07-23 287.37 289.67 289.99 286.50 2.276807e+07 6.578686e+09 1.22 1.23 3.53 0.30 62 | 8359 微软 MSFT 2021-07-26 289.00 289.05 289.69 286.64 2.317607e+07 6.685868e+09 1.05 -0.21 -0.62 0.31 63 | 8360 微软 MSFT 2021-07-27 289.43 286.54 289.58 282.95 3.360407e+07 9.599993e+09 2.29 -0.87 -2.51 0.45 64 | 8361 微软 MSFT 2021-07-28 288.99 286.22 290.15 283.83 3.356685e+07 9.638499e+09 2.21 -0.11 -0.32 0.45 65 | 66 | [8362 rows x 13 columns] 67 | ``` 68 | 69 | - 获取 ETF K 线数据 70 | 71 | ```python 72 | >>> import efinance as ef 73 | >>> # ETF 代码(以中概互联网 ETF 为例) 74 | >>> etf_code = '513050' 75 | >>> ef.stock.get_quote_history(etf_code) 76 | 股票名称 股票代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 77 | 0 中概互联网ETF 513050 2017-01-18 0.989 0.977 0.989 0.969 345605.0 3.381795e+07 0.00 0.00 0.000 0.26 78 | 1 中概互联网ETF 513050 2017-01-19 0.978 0.989 0.990 0.978 257716.0 2.542553e+07 1.23 1.23 0.012 0.19 79 | 2 中概互联网ETF 513050 2017-01-20 0.989 0.988 0.990 0.986 50980.0 5.043289e+06 0.40 -0.10 -0.001 0.04 80 | 3 中概互联网ETF 513050 2017-01-23 0.988 0.988 0.989 0.986 13739.0 1.356129e+06 0.30 0.00 0.000 0.01 81 | 4 中概互联网ETF 513050 2017-01-24 0.989 0.989 0.992 0.987 17937.0 1.774398e+06 0.51 0.10 0.001 0.01 82 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... 83 | 1097 中概互联网ETF 513050 2021-07-23 1.789 1.760 1.789 1.758 4427623.0 7.836530e+08 1.73 -1.51 -0.027 3.32 84 | 1098 中概互联网ETF 513050 2021-07-26 1.679 1.645 1.698 1.642 13035366.0 2.182816e+09 3.18 -6.53 -0.115 9.78 85 | 1099 中概互联网ETF 513050 2021-07-27 1.600 1.547 1.620 1.546 14269546.0 2.257610e+09 4.50 -5.96 -0.098 10.70 86 | 1100 中概互联网ETF 513050 2021-07-28 1.545 1.552 1.578 1.506 13141023.0 2.024106e+09 4.65 0.32 0.005 9.85 87 | 1101 中概互联网ETF 513050 2021-07-29 1.615 1.641 1.651 1.606 10658041.0 1.734404e+09 2.90 5.73 0.089 7.99 88 | 89 | [1102 rows x 13 columns] 90 | ``` 91 | 92 | - 获取单只股票 5 分钟 K 线数据 93 | 94 | ```python 95 | >>> import efinance as ef 96 | >>> # 股票代码 97 | >>> stock_code = '600519' 98 | >>> # 5 分钟 99 | >>> frequency = 5 100 | >>> ef.stock.get_quote_history(stock_code, klt=frequency) 101 | 股票名称 股票代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 102 | 0 贵州茅台 600519 2021-06-16 09:35 2172.71 2159.71 2175.71 2150.74 1885.0 411159309.0 1.15 -0.64 -14.00 0.02 103 | 1 贵州茅台 600519 2021-06-16 09:40 2156.69 2148.71 2160.48 2143.37 1238.0 268790684.0 0.79 -0.51 -11.00 0.01 104 | 2 贵州茅台 600519 2021-06-16 09:45 2149.79 2159.71 2160.69 2149.79 706.0 153631002.0 0.51 0.51 11.00 0.01 105 | 3 贵州茅台 600519 2021-06-16 09:50 2159.61 2148.87 2159.71 2148.87 586.0 127346502.0 0.50 -0.50 -10.84 0.00 106 | 4 贵州茅台 600519 2021-06-16 09:55 2148.87 2161.04 2163.71 2148.72 788.0 171491075.0 0.70 0.57 12.17 0.01 107 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... 108 | 1521 贵州茅台 600519 2021-07-29 13:50 1746.51 1746.09 1748.95 1746.01 738.0 128889575.0 0.17 -0.09 -1.49 0.01 109 | 1522 贵州茅台 600519 2021-07-29 13:55 1746.08 1742.01 1746.09 1741.96 831.0 144968679.0 0.24 -0.23 -4.08 0.01 110 | 1523 贵州茅台 600519 2021-07-29 14:00 1742.00 1739.58 1742.00 1739.58 864.0 150446840.0 0.14 -0.14 -2.43 0.01 111 | 1524 贵州茅台 600519 2021-07-29 14:05 1741.87 1740.00 1745.00 1738.88 1083.0 188427970.0 0.35 0.02 0.42 0.01 112 | 1525 贵州茅台 600519 2021-07-29 14:10 1740.00 1740.02 1740.10 1740.00 59.0 10315488.0 0.01 0.00 0.02 0.00 113 | 114 | [1526 rows x 13 columns] 115 | ``` 116 | 117 | - 沪深市场 A 股最新状况 118 | 119 | ```python 120 | >>> import efinance as ef 121 | >>> ef.stock.get_realtime_quotes() 122 | 股票代码 股票名称 涨跌幅 最新价 最高 最低 今开 涨跌额 换手率 量比 动态市盈率 成交量 成交额 昨日收盘 总市值 流通市值 行情ID 市场类型 123 | 0 688787 N海天 277.59 139.48 172.39 139.25 171.66 102.54 85.62 - 78.93 74519 1110318832.0 36.94 5969744000 1213908667 1.688787 沪A 124 | 1 301045 N天禄 149.34 39.42 48.95 39.2 48.95 23.61 66.66 - 37.81 163061 683878656.0 15.81 4066344240 964237089 0.301045 深A 125 | 2 300532 今天国际 20.04 12.16 12.16 10.69 10.69 2.03 8.85 3.02 -22.72 144795 171535181.0 10.13 3322510580 1989333440 0.300532 深A 126 | 3 300600 国瑞科技 20.02 13.19 13.19 11.11 11.41 2.2 18.61 2.82 218.75 423779 541164432.0 10.99 3915421427 3003665117 0.300600 深A 127 | 4 300985 致远新能 20.01 47.08 47.08 36.8 39.4 7.85 66.65 2.17 58.37 210697 897370992.0 39.23 6277336472 1488300116 0.300985 深A 128 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 129 | 4598 603186 华正新材 -10.0 43.27 44.09 43.27 43.99 -4.81 1.98 0.48 25.24 27697 120486294.0 48.08 6146300650 6063519472 1.603186 沪A 130 | 4599 688185 康希诺-U -10.11 476.4 534.94 460.13 530.0 -53.6 6.02 2.74 -2088.07 40239 1960540832.0 530.0 117885131884 31831479215 1.688185 沪A 131 | 4600 688148 芳源股份 -10.57 31.3 34.39 31.3 33.9 -3.7 26.07 0.56 220.01 188415 620632512.0 35.0 15923562000 2261706043 1.688148 沪A 132 | 4601 300034 钢研高纳 -10.96 43.12 46.81 42.88 46.5 -5.31 7.45 1.77 59.49 323226 1441101824.0 48.43 20959281094 18706911861 0.300034 深A 133 | 4602 300712 永福股份 -13.71 96.9 110.94 95.4 109.0 -15.4 6.96 1.26 511.21 126705 1265152928.0 112.3 17645877600 17645877600 0.300712 深A 134 | 135 | [4603 rows x 18 columns] 136 | ``` 137 | 138 | - 股票龙虎榜 139 | 140 | ```python 141 | >>> import efinance as ef 142 | >>> # 获取最新一个公开的龙虎榜数据(后面还有获取指定日期区间的示例代码) 143 | >>> ef.stock.get_daily_billboard() 144 | 股票代码 股票名称 上榜日期 解读 收盘价 涨跌幅 换手率 龙虎榜净买额 龙虎榜买入额 龙虎榜卖出额 龙虎榜成交额 市场总成交额 净买额占总成交比 成交额占总成交比 流通市值 上榜原因 145 | 0 000608 阳光股份 2021-08-27 卖一主卖,成功率48.36% 3.73 -9.9034 3.8430 -8.709942e+06 1.422786e+07 2.293780e+07 3.716565e+07 110838793 -7.858208 33.531268 2.796761e+09 日跌幅偏离值达到7%的前5只证券 146 | 1 000751 锌业股份 2021-08-27 主力做T,成功率18.84% 5.32 -2.9197 19.6505 -1.079219e+08 5.638899e+07 1.643109e+08 2.206999e+08 1462953973 -7.376984 15.085906 7.500502e+09 日振幅值达到15%的前5只证券 147 | 2 000762 西藏矿业 2021-08-27 北京资金买入,成功率39.42% 63.99 1.0741 15.6463 2.938758e+07 4.675541e+08 4.381665e+08 9.057206e+08 4959962598 0.592496 18.260633 3.332571e+10 日振幅值达到15%的前5只证券 148 | 3 000833 粤桂股份 2021-08-27 实力游资买入,成功率44.55% 8.87 10.0496 8.8263 4.993555e+07 1.292967e+08 7.936120e+07 2.086580e+08 895910429 5.573721 23.290046 3.353614e+09 连续三个交易日内,涨幅偏离值累计达到20%的证券 149 | 4 001208 华菱线缆 2021-08-27 1家机构买入,成功率40.43% 19.72 4.3386 46.1985 4.055258e+07 1.537821e+08 1.132295e+08 2.670117e+08 1203913048 3.368398 22.178651 2.634710e+09 日换手率达到20%的前5只证券 150 | .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 151 | 70 688558 国盛智科 2021-08-27 买一主买,成功率38.71% 60.72 1.6064 34.0104 1.835494e+07 1.057779e+08 8.742293e+07 1.932008e+08 802569300 2.287023 24.072789 2.321743e+09 有价格涨跌幅限制的日换手率达到30%的前五只证券 152 | 71 688596 正帆科技 2021-08-27 1家机构买入,成功率57.67% 26.72 3.1660 3.9065 -1.371039e+07 8.409046e+07 9.780085e+07 1.818913e+08 745137400 -1.839982 24.410438 4.630550e+09 有价格涨跌幅限制的连续3个交易日内收盘价格涨幅偏离值累计达到30%的证券 153 | 72 688663 新风光 2021-08-27 卖一主卖,成功率37.18% 28.17 -17.6316 32.2409 1.036460e+07 5.416901e+07 4.380440e+07 9.797341e+07 274732700 3.772613 35.661358 8.492507e+08 有价格涨跌幅限制的日收盘价格跌幅达到15%的前五只证券 154 | 73 688663 新风光 2021-08-27 卖一主卖,成功率37.18% 28.17 -17.6316 32.2409 1.036460e+07 5.416901e+07 4.380440e+07 9.797341e+07 274732700 3.772613 35.661358 8.492507e+08 有价格涨跌幅限制的日换手率达到30%的前五只证券 155 | 74 688667 菱电电控 2021-08-27 1家机构卖出,成功率49.69% 123.37 -18.8996 17.7701 -2.079877e+06 4.611216e+07 4.819204e+07 9.430420e+07 268503400 -0.774618 35.122163 1.461225e+09 有价格涨跌幅限制的日收盘价格跌幅达到15%的前五只证券 156 | 157 | [75 rows x 16 columns] 158 | 159 | >>> # 获取指定日期区间的龙虎榜数据 160 | >>> start_date = '2021-08-20' # 开始日期 161 | >>> end_date = '2021-08-27' # 结束日期 162 | >>> ef.stock.get_daily_billboard(start_date = start_date,end_date = end_date) 163 | 股票代码 股票名称 上榜日期 解读 收盘价 涨跌幅 换手率 龙虎榜净买额 龙虎榜买入额 龙虎榜卖出额 龙虎榜成交额 市场总成交额 净买额占总成交比 成交额占总成交比 流通市值 上榜原因 164 | 0 000608 阳光股份 2021-08-27 卖一主卖,成功率48.36% 3.73 -9.9034 3.8430 -8.709942e+06 1.422786e+07 2.293780e+07 3.716565e+07 110838793 -7.858208 33.531268 2.796761e+09 日跌幅偏离值达到7%的前5只证券 165 | 1 000751 锌业股份 2021-08-27 主力做T,成功率18.84% 5.32 -2.9197 19.6505 -1.079219e+08 5.638899e+07 1.643109e+08 2.206999e+08 1462953973 -7.376984 15.085906 7.500502e+09 日振幅值达到15%的前5只证券 166 | 2 000762 西藏矿业 2021-08-27 北京资金买入,成功率39.42% 63.99 1.0741 15.6463 2.938758e+07 4.675541e+08 4.381665e+08 9.057206e+08 4959962598 0.592496 18.260633 3.332571e+10 日振幅值达到15%的前5只证券 167 | 3 000833 粤桂股份 2021-08-27 实力游资买入,成功率44.55% 8.87 10.0496 8.8263 4.993555e+07 1.292967e+08 7.936120e+07 2.086580e+08 895910429 5.573721 23.290046 3.353614e+09 连续三个交易日内,涨幅偏离值累计达到20%的证券 168 | 4 001208 华菱线缆 2021-08-27 1家机构买入,成功率40.43% 19.72 4.3386 46.1985 4.055258e+07 1.537821e+08 1.132295e+08 2.670117e+08 1203913048 3.368398 22.178651 2.634710e+09 日换手率达到20%的前5只证券 169 | .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 170 | 414 605580 恒盛能源 2021-08-20 买一主买,成功率33.33% 13.28 10.0249 0.4086 2.413149e+06 2.713051e+06 2.999022e+05 3.012953e+06 2713051 88.945937 111.054054 6.640000e+08 有价格涨跌幅限制的日收盘价格涨幅偏离值达到7%的前三只证券 171 | 415 688029 南微医学 2021-08-20 4家机构卖出,成功率55.82% 204.61 -18.5340 8.1809 -1.412053e+08 1.883342e+08 3.295394e+08 5.178736e+08 762045800 -18.529760 67.958326 9.001510e+09 有价格涨跌幅限制的日收盘价格跌幅达到15%的前五只证券 172 | 416 688408 中信博 2021-08-20 4家机构卖出,成功率47.86% 179.98 -0.0666 15.3723 -4.336304e+07 3.750919e+08 4.184550e+08 7.935469e+08 846547400 -5.122340 93.739221 5.695886e+09 有价格涨跌幅限制的日价格振幅达到30%的前五只证券 173 | 417 688556 高测股份 2021-08-20 上海资金买入,成功率60.21% 51.97 17.0495 10.6452 -3.940045e+07 1.642095e+08 2.036099e+08 3.678194e+08 575411600 -6.847351 63.922831 5.739089e+09 有价格涨跌幅限制的日收盘价格涨幅达到15%的前五只证券 174 | 418 688636 智明达 2021-08-20 2家机构买入,成功率47.37% 161.90 15.8332 11.9578 2.922406e+07 6.598126e+07 3.675721e+07 1.027385e+08 188330100 15.517464 54.552336 1.647410e+09 有价格涨跌幅限制的日收盘价格涨幅达到15%的前五只证券 175 | 176 | [418 rows x 16 columns] 177 | ``` 178 | 179 | - 沪深 A 股股票季度表现 180 | 181 | ```python 182 | >>> import efinance as ef 183 | >>> ef.stock.get_all_company_performance() # 默认为最新季度,亦可指定季度 184 | 股票代码 股票简称 公告日期 营业收入 营业收入同比增长 营业收入季度环比 净利润 净利润同比增长 净利润季度环比 每股收益 每股净资产 净资产收益率 销售毛利率 每股经营现金流量 185 | 0 688981 中芯国际 2021-08-28 00:00:00 1.609039e+10 22.253453 20.6593 5.241321e+09 278.100000 307.8042 0.6600 11.949525 5.20 26.665642 1.182556 186 | 1 688819 天能股份 2021-08-28 00:00:00 1.625468e+10 9.343279 23.9092 6.719446e+08 -14.890000 -36.8779 0.7100 11.902912 6.15 17.323263 -1.562187 187 | 2 688789 宏华数科 2021-08-28 00:00:00 4.555604e+08 56.418441 6.5505 1.076986e+08 49.360000 -7.3013 1.8900 14.926761 13.51 43.011243 1.421272 188 | 3 688681 科汇股份 2021-08-28 00:00:00 1.503343e+08 17.706987 121.9407 1.664509e+07 -13.100000 383.3331 0.2100 5.232517 4.84 47.455511 -0.232395 189 | 4 688670 金迪克 2021-08-28 00:00:00 3.209423e+07 -63.282413 -93.1788 -2.330505e+07 -242.275001 -240.1554 -0.3500 3.332254 -10.10 85.308531 1.050348 190 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 191 | 3720 600131 国网信通 2021-07-16 00:00:00 2.880378e+09 6.787087 69.5794 2.171389e+08 29.570000 296.2051 0.1800 4.063260 4.57 19.137437 -0.798689 192 | 3721 600644 乐山电力 2021-07-15 00:00:00 1.257030e+09 18.079648 5.7300 8.379727e+07 -14.300000 25.0007 0.1556 3.112413 5.13 23.645137 0.200906 193 | 3722 002261 拓维信息 2021-07-15 00:00:00 8.901777e+08 47.505282 24.0732 6.071063e+07 68.320000 30.0596 0.0550 2.351598 2.37 37.047968 -0.131873 194 | 3723 601952 苏垦农发 2021-07-13 00:00:00 4.544138e+09 11.754570 47.8758 3.288132e+08 1.460000 83.1486 0.2400 3.888046 6.05 15.491684 -0.173772 195 | 3724 601568 北元集团 2021-07-09 00:00:00 6.031506e+09 32.543303 30.6352 1.167989e+09 61.050000 40.8165 0.3200 3.541533 9.01 27.879243 0.389860 196 | 197 | [3725 rows x 14 columns] 198 | 199 | ``` 200 | 201 | - 股票历史单子流入数据(日级) 202 | 203 | ```python 204 | >>> import efinance as ef 205 | >>> ef.stock.get_history_bill('300750') 206 | 股票名称 股票代码 日期 主力净流入 小单净流入 中单净流入 大单净流入 超大单净流入 主力净流入占比 小单流入净占比 中单流入净占比 大单流入净占比 超大单流入净占比 收盘价 涨跌幅 207 | 0 宁德时代 300750 2021-03-18 4.453786e+07 51241536.0 -9.577939e+07 -26680704.0 71218560.0 1.16 1.33 -2.49 -0.69 1.85 335.56 0.84 208 | 1 宁德时代 300750 2021-03-19 -6.129661e+08 423235296.0 1.897308e+08 -244136864.0 -368829200.0 -10.13 6.99 3.14 -4.03 -6.09 316.26 -5.75 209 | 2 宁德时代 300750 2021-03-22 -5.674665e+08 473253808.0 9.421272e+07 -255868192.0 -311598336.0 -7.95 6.63 1.32 -3.58 -4.37 307.56 -2.75 210 | 3 宁德时代 300750 2021-03-23 -3.168412e+08 131142880.0 1.856984e+08 -349417168.0 32575936.0 -6.88 2.85 4.03 -7.59 0.71 303.67 -1.26 211 | 4 宁德时代 300750 2021-03-24 -5.999049e+08 371268928.0 2.286360e+08 -6849616.0 -593055328.0 -8.18 5.06 3.12 -0.09 -8.09 288.55 -4.98 212 | .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 213 | 97 宁德时代 300750 2021-08-09 -1.152779e+09 -596512.0 1.153376e+09 -370189552.0 -782589456.0 -12.09 -0.01 12.10 -3.88 -8.21 516.00 -5.13 214 | 98 宁德时代 300750 2021-08-10 -1.009431e+09 -358999.0 1.009790e+09 -392670720.0 -616759952.0 -11.03 -0.00 11.03 -4.29 -6.74 510.50 -1.07 215 | 99 宁德时代 300750 2021-08-11 1.305631e+08 -475792.0 -1.300873e+08 -204097776.0 334660864.0 2.25 -0.01 -2.25 -3.52 5.78 517.25 1.32 216 | 100 宁德时代 300750 2021-08-12 -1.425337e+09 -488240.0 1.425825e+09 -454688192.0 -970648896.0 -16.58 -0.01 16.58 -5.29 -11.29 502.00 -2.95 217 | 101 宁德时代 300750 2021-08-13 -3.111439e+08 -895641.0 3.120392e+08 -145200128.0 -165943808.0 -2.21 -0.01 2.22 -1.03 -1.18 502.05 0.01 218 | 219 | [102 rows x 15 columns] 220 | ``` 221 | 222 | - 股票最新一个交易日单子流入数据(分钟级) 223 | 224 | ```python 225 | >>> import efinance as ef 226 | >>> ef.stock.get_today_bill('300750') 227 | 股票名称 股票代码 时间 主力净流入 小单净流入 中单净流入 大单净流入 超大单净流入 228 | 0 宁德时代 300750 2021-08-13 09:31 -58855676.0 -171274.0 59026945.0 22025460.0 -80881136.0 229 | 1 宁德时代 300750 2021-08-13 09:32 -50671227.0 -190312.0 50861534.0 8927176.0 -59598403.0 230 | 2 宁德时代 300750 2021-08-13 09:33 -67833979.0 -190312.0 68024288.0 34170593.0 -102004572.0 231 | 3 宁德时代 300750 2021-08-13 09:34 -28890553.0 -220312.0 29110861.0 16373829.0 -45264382.0 232 | 4 宁德时代 300750 2021-08-13 09:35 -14955904.0 -482660.0 15438561.0 14601153.0 -29557057.0 233 | .. ... ... ... ... ... ... ... ... 234 | 235 宁德时代 300750 2021-08-13 14:56 -311695708.0 -895633.0 312591337.0 -144447542.0 -167248166.0 235 | 236 宁德时代 300750 2021-08-13 14:57 -310641455.0 -895633.0 311537085.0 -144697852.0 -165943603.0 236 | 237 宁德时代 300750 2021-08-13 14:58 -311143584.0 -895633.0 312039214.0 -145199981.0 -165943603.0 237 | 238 宁德时代 300750 2021-08-13 14:59 -311143584.0 -895633.0 312039214.0 -145199981.0 -165943603.0 238 | 239 宁德时代 300750 2021-08-13 15:00 -311143584.0 -895633.0 312039214.0 -145199981.0 -165943603.0 239 | 240 | [240 rows x 8 columns] 241 | ``` 242 | 243 | ### Fund 244 | 245 | - 获取基金历史净值信息 246 | 247 | ```python 248 | >>> import efinance as ef 249 | >>> ef.fund.get_quote_history('161725') 250 | 日期 单位净值 累计净值 涨跌幅 251 | 0 2021-07-29 1.2726 2.9037 -1.52 252 | 1 2021-07-28 1.2922 2.9233 0.85 253 | 2 2021-07-27 1.2813 2.9124 -3.6 254 | 3 2021-07-26 1.3292 2.9603 -7.24 255 | 4 2021-07-23 1.4329 3.0640 -2.29 256 | ... ... ... ... ... 257 | 1502 2015-06-08 1.0380 1.0380 2.5692 258 | 1503 2015-06-05 1.0120 1.0120 1.5045 259 | 1504 2015-06-04 0.9970 0.9970 -- 260 | 1505 2015-05-29 0.9950 0.9950 -- 261 | 1506 2015-05-27 1.0000 1.0000 -- 262 | 263 | [1507 rows x 4 columns] 264 | ``` 265 | 266 | - 获取基金公开持仓信息 267 | 268 | ```python 269 | >>> ef.fund.get_invest_position('161725') 270 | 基金代码 股票代码 股票简称 持仓占比 较上期变化 公开日期 271 | 0 161725 600519 贵州茅台 16.78 1.36 2022-03-31 272 | 1 161725 600809 山西汾酒 15.20 0.52 2022-03-31 273 | 2 161725 000568 泸州老窖 14.57 -0.89 2022-03-31 274 | 3 161725 000858 五粮液 12.83 -1.26 2022-03-31 275 | 4 161725 002304 洋河股份 11.58 0.91 2022-03-31 276 | 5 161725 603369 今世缘 3.75 -0.04 2022-03-31 277 | 6 161725 000799 酒鬼酒 3.40 -0.91 2022-03-31 278 | 7 161725 000596 古井贡酒 3.27 -0.24 2022-03-31 279 | 8 161725 600779 水井坊 2.59 -0.26 2022-03-31 280 | 9 161725 603589 口子窖 2.30 -0.38 2022-03-31 281 | ``` 282 | 283 | - 多只基金信息 284 | 285 | ```python 286 | >>> import efinance as ef 287 | >>> # 获取多只基金基本信息 288 | >>> ef.fund.get_base_info(['161725','005827']) 289 | 0 161725 招商中证白酒指数(LOF)A 2015-05-27 -6.03 1.1959 招商基金 2021-07-30 产品特色:布局白酒领域的指数基金,历史业绩优秀,外资偏爱白酒板块。 290 | 1 005827 易方达蓝筹精选混合 2018-09-05 -2.98 2.4967 易方达基金 2021-07-30 明星消费基金经理另一力作,A+H股同步布局,价值投资典范,适合长期持有。 291 | 292 | ``` 293 | 294 | ### Bond 295 | 296 | - 可转债整体行情 297 | 298 | ```python 299 | >>> import efinance as ef 300 | >>> ef.bond.get_realtime_quotes() 301 | 债券代码 债券名称 涨跌幅 最新价 最高 最低 涨跌额 换手率 动态市盈率 成交量 成交额 昨日收盘 总市值 流通市值 行情ID 市场类型 302 | 0 123015 蓝盾转债 13.49 198.613 205.0 175.5 23.613 315.36 - 316062 613480512.0 175.0 199056701 199056701 0.123015 深A 303 | 1 123077 汉得转债 9.59 115.51 122.971 105.401 10.11 32.59 - 305380 358093216.0 105.4 1082332396 1082332396 0.123077 深A 304 | 2 123066 赛意转债 8.08 232.377 245.8 225.0 17.377 470.3 - 454204 1081363632.0 215.0 224423665 224423665 0.123066 深A 305 | 3 128093 百川转债 7.69 360.751 367.9 335.5 25.751 343.84 - 558874 1984944768.0 335.0 586364315 586364315 0.128093 深A 306 | 4 128082 华锋转债 7.41 158.507 163.769 147.089 10.935 103.16 - 226444 355827984.0 147.572 347931900 347931900 0.128082 深A 307 | .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 308 | 383 123087 明电转债 -4.34 151.75 169.0 150.302 -6.879 117.66 - 520370 817884784.0 158.629 671147760 671147760 0.123087 深A 309 | 384 123070 鹏辉转债 -4.63 175.001 179.799 174.471 -8.499 18.46 - 144998 257005833.0 183.5 1374730681 1374730681 0.123070 深A 310 | 385 123027 蓝晓转债 -4.67 338.413 352.825 338.015 -16.586 44.23 - 47356 162870853.0 354.999 362300558 362300558 0.123027 深A 311 | 386 113621 彤程转债 -5.03 215.61 222.5 214.41 -11.41 11.46 - 91710 200327611.0 227.02 1725268098 1725268098 1.113621 沪A 312 | 387 123047 久吾转债 -5.7 305.5 319.52 305.382 -18.47 122.41 - 193587 600277600.0 323.97 483119533 483119533 0.123047 深A 313 | 314 | [388 rows x 16 columns] 315 | ``` 316 | 317 | - 全部可转债信息 318 | 319 | ```python 320 | >>> import efinance as ef 321 | >>> ef.bond.get_all_base_info() 322 | 债券代码 债券名称 正股代码 正股名称 债券评级 申购日期 发行规模(亿) 网上发行中签率(%) 上市日期 到期日期 期限(年) 利率说明 323 | 0 123120 隆华转债 300263 隆华科技 AA- 2021-07-30 00:00:00 7.989283 NaN None 2027-07-30 00:00:00 6 第一年为0.40%、第二年为0.70%、第三年为1.00%、第四年为1.60%、第五年为2.... 324 | 1 110081 闻泰转债 600745 闻泰科技 AA+ 2021-07-28 00:00:00 86.000000 0.044030 None 2027-07-28 00:00:00 6 第一年0.10%、第二年0.20%、第三年0.30%、第四年1.50%、第五年1.80%、第... 325 | 2 118001 金博转债 688598 金博股份 A+ 2021-07-23 00:00:00 5.999010 0.001771 None 2027-07-23 00:00:00 6 第一年0.50%、第二年0.70%、第三年1.20%、第四年1.80%、第五年2.40%、第... 326 | 3 123119 康泰转2 300601 康泰生物 AA 2021-07-15 00:00:00 20.000000 0.014182 None 2027-07-15 00:00:00 6 第一年为0.30%、第二年为0.50%、第三年为1.00%、第四年为1.50%、第五年为1.... 327 | 4 113627 太平转债 603877 太平鸟 AA 2021-07-15 00:00:00 8.000000 0.000542 None 2027-07-15 00:00:00 6 第一年0.30%、第二年0.50%、第三年1.00%、第四年1.50%、第五年1.80%、第... 328 | .. ... ... ... ... ... ... ... ... ... ... ... ... 329 | 80 110227 赤化转债 600227 圣济堂 AAA 2007-10-10 00:00:00 4.500000 0.158854 2007-10-23 00:00:00 2009-05-25 00:00:00 1.6192 票面利率和付息日期:本次发行的可转债票面利率第一年为1.5%、第二年为1.8%、第三年为2.... 330 | 81 126006 07深高债 600548 深高速 AAA 2007-10-09 00:00:00 15.000000 0.290304 2007-10-30 00:00:00 2013-10-09 00:00:00 6 None 331 | 82 110971 恒源转债 600971 恒源煤电 AAA 2007-09-24 00:00:00 4.000000 5.311774 2007-10-12 00:00:00 2009-12-21 00:00:00 2.2484 票面利率为:第一年年利率1.5%,第二年年利率1.8%,第三年年利率2.1%,第四年年利率2... 332 | 83 110567 山鹰转债 600567 山鹰国际 AA 2007-09-05 00:00:00 4.700000 0.496391 2007-09-17 00:00:00 2010-02-01 00:00:00 2.4055 票面利率和付息日期:本次发行的可转债票面利率第一年为1.4%,第二年为1.7%,第三年为2.... 333 | 84 110026 中海转债 600026 中远海能 AAA 2007-07-02 00:00:00 20.000000 1.333453 2007-07-12 00:00:00 2008-03-27 00:00:00 0.737 票面利率:第一年为1.84%,第二年为2.05%,第三年为2.26%,第四年为2.47%,第... 334 | 335 | [585 rows x 12 columns] 336 | ``` 337 | 338 | - 指定可转债 K 线数据 339 | 340 | ```python 341 | >>> import efinance as ef 342 | >>> # 可转债代码(以 东财转3 为例) 343 | >>> bond_code = '123111' 344 | >>> ef.bond.get_quote_history(bond_code) 345 | 债券名称 债券代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 346 | 0 东财转3 123111 2021-04-23 130.000 130.000 130.000 130.000 1836427 2.387355e+09 0.00 30.00 30.000 11.62 347 | 1 东财转3 123111 2021-04-26 130.353 130.010 133.880 125.110 8610944 1.126033e+10 6.75 0.01 0.010 54.50 348 | 2 东财转3 123111 2021-04-27 129.000 129.600 130.846 128.400 1820766 2.357472e+09 1.88 -0.32 -0.410 11.52 349 | 3 东财转3 123111 2021-04-28 129.100 130.770 131.663 128.903 1467727 1.921641e+09 2.13 0.90 1.170 9.29 350 | 4 东财转3 123111 2021-04-29 130.690 131.208 133.150 130.560 1156934 1.525974e+09 1.98 0.33 0.438 7.32 351 | .. ... ... ... ... ... ... ... ... ... ... ... ... ... 352 | 72 东财转3 123111 2021-08-09 159.600 159.300 162.990 158.690 596124 9.585751e+08 2.69 -0.34 -0.550 3.77 353 | 73 东财转3 123111 2021-08-10 159.190 160.950 161.450 157.000 517237 8.234596e+08 2.79 1.04 1.650 3.27 354 | 74 东财转3 123111 2021-08-11 161.110 159.850 162.300 159.400 298906 4.800711e+08 1.80 -0.68 -1.100 1.89 355 | 75 东财转3 123111 2021-08-12 159.110 158.290 160.368 158.010 270641 4.298100e+08 1.48 -0.98 -1.560 1.71 356 | 76 东财转3 123111 2021-08-13 158.000 158.358 160.290 157.850 250059 3.975513e+08 1.54 0.04 0.068 1.58 357 | 358 | [77 rows x 13 columns] 359 | ``` 360 | 361 | ### Futures 362 | 363 | - 获取交易所期货基本信息 364 | 365 | ```python 366 | >>> import efinance as ef 367 | >>> ef.futures.get_futures_base_info() 368 | 期货代码 期货名称 行情ID 市场类型 369 | 0 ZCM 动力煤主力 115.ZCM 郑商所 370 | 1 ZC201 动力煤201 115.ZC201 郑商所 371 | 2 jm 焦炭主力 114.jm 大商所 372 | 3 j2201 焦炭2201 114.j2201 大商所 373 | 4 jmm 焦煤主力 114.jmm 大商所 374 | .. ... ... ... ... 375 | 846 jm2109 焦煤2109 114.jm2109 大商所 376 | 847 071108 IH2108 8.071108 中金所 377 | 848 070131 IH次主力合约 8.070131 中金所 378 | 849 070120 IH当月连续 8.07012 中金所 379 | 850 lu2109 低硫燃油2109 142.lu2109 上海能源期货交易所 380 | 381 | [851 rows x 4 columns] 382 | ``` 383 | 384 | - 获取期货历史行情 385 | 386 | ```python 387 | >>> import efinance as ef 388 | >>> # 获取全部期货行情ID列表 389 | >>> quote_ids = ef.futures.get_realtime_quotes()['行情ID'] 390 | >>> # 指定单个期货的行情ID(以上面获得到的行情ID列表为例) 391 | >>> quote_id = quote_ids[0] 392 | >>> # 查看第一个行情ID 393 | >>> quote_ids[0] 394 | '115.ZCM' 395 | >>> # 获取第行情ID为第一个的期货日 K 线数据 396 | >>> ef.futures.get_quote_history(quote_id) 397 | 期货名称 期货代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 398 | 0 动力煤主力 ZCM 2015-05-18 440.0 437.6 440.2 437.6 64 2.806300e+06 0.00 0.00 0.0 0.0 399 | 1 动力煤主力 ZCM 2015-05-19 436.0 437.0 437.6 436.0 6 2.621000e+05 0.36 -0.32 -1.4 0.0 400 | 2 动力煤主力 ZCM 2015-05-20 436.8 435.8 437.0 434.8 8 3.487500e+05 0.50 -0.23 -1.0 0.0 401 | 3 动力煤主力 ZCM 2015-05-21 438.0 443.2 446.8 437.8 37 1.631850e+06 2.06 1.65 7.2 0.0 402 | 4 动力煤主力 ZCM 2015-05-22 439.2 441.4 443.8 439.2 34 1.502500e+06 1.04 0.09 0.4 0.0 403 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... 404 | 1524 动力煤主力 ZCM 2021-08-17 755.0 770.8 776.0 750.6 82373 6.288355e+09 3.25 -1.26 -9.8 0.0 405 | 1525 动力煤主力 ZCM 2021-08-18 770.8 776.8 785.8 766.0 77392 6.016454e+09 2.59 1.76 13.4 0.0 406 | 1526 动力煤主力 ZCM 2021-08-19 776.8 777.6 798.0 764.6 97229 7.597474e+09 4.30 0.03 0.2 0.0 407 | 1527 动力煤主力 ZCM 2021-08-20 778.0 793.0 795.0 775.2 70549 5.553617e+09 2.53 1.48 11.6 0.0 408 | 1528 动力煤主力 ZCM 2021-08-23 796.8 836.6 843.8 796.8 82954 6.850341e+09 5.97 6.28 49.4 0.0 409 | 410 | [1529 rows x 13 columns] 411 | 412 | >>> # 指定多个期货的 行情ID 413 | >>> quote_ids = ['115.ZCM','115.ZC109'] 414 | >>> futures_df = ef.futures.get_quote_history(quote_ids) 415 | >>> type(futures_df) 416 | 417 | >>> futures_df['115.ZCM'] 418 | 期货名称 期货代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 419 | 0 动力煤主力 ZCM 2015-05-18 440.0 437.6 440.2 437.6 64 2.806300e+06 0.00 0.00 0.0 0.0 420 | 1 动力煤主力 ZCM 2015-05-19 436.0 437.0 437.6 436.0 6 2.621000e+05 0.36 -0.32 -1.4 0.0 421 | 2 动力煤主力 ZCM 2015-05-20 436.8 435.8 437.0 434.8 8 3.487500e+05 0.50 -0.23 -1.0 0.0 422 | 3 动力煤主力 ZCM 2015-05-21 438.0 443.2 446.8 437.8 37 1.631850e+06 2.06 1.65 7.2 0.0 423 | 4 动力煤主力 ZCM 2015-05-22 439.2 441.4 443.8 439.2 34 1.502500e+06 1.04 0.09 0.4 0.0 424 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... 425 | 1524 动力煤主力 ZCM 2021-08-17 755.0 770.8 776.0 750.6 82373 6.288355e+09 3.25 -1.26 -9.8 0.0 426 | 1525 动力煤主力 ZCM 2021-08-18 770.8 776.8 785.8 766.0 77392 6.016454e+09 2.59 1.76 13.4 0.0 427 | 1526 动力煤主力 ZCM 2021-08-19 776.8 777.6 798.0 764.6 97229 7.597474e+09 4.30 0.03 0.2 0.0 428 | 1527 动力煤主力 ZCM 2021-08-20 778.0 793.0 795.0 775.2 70549 5.553617e+09 2.53 1.48 11.6 0.0 429 | 1528 动力煤主力 ZCM 2021-08-23 796.8 836.6 843.8 796.8 82954 6.850341e+09 5.97 6.28 49.4 0.0 430 | 431 | [1529 rows x 13 columns] 432 | ``` 433 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | ```{include} ../README.md 2 | 3 | ``` 4 | 5 | ```{include} ../changelog.md 6 | 7 | ``` 8 | 9 | ```{eval-rst} 10 | 11 | .. toctree:: 12 | :maxdepth: 2 13 | :hidden: 14 | :caption: GETTING STARTED 15 | 16 | install 17 | example 18 | 19 | ---- 20 | 21 | .. toctree:: 22 | :maxdepth: 2 23 | :hidden: 24 | :caption: DOCUMENTATION 25 | 26 | api 27 | 28 | ``` 29 | -------------------------------------------------------------------------------- /docs/install.md: -------------------------------------------------------------------------------- 1 | ## Installation 2 | 3 | - 通过 `pip` 安装 4 | 5 | ```bash 6 | pip install efinance 7 | ``` 8 | 9 | - 通过 `pip` 更新 10 | 11 | ```bash 12 | pip install efinance --upgrade 13 | ``` 14 | 15 | - 通过 `docker` 安装 16 | 17 | ```bash 18 | # 克隆代码 19 | git clone https://github.com/Micro-sheep/efinance 20 | # 切换工作目录为该项目的根目录 21 | cd efinance 22 | # 构建镜像(-t 指定构建后生成的镜像名称 . 指定 build 的对象是当前工作目录下的 dockerfile) 23 | docker build -t efinance . --no-cache 24 | # 以交互的方式运行镜像(运行之后自动删除容器,如不想删除 则可去掉 --rm) 25 | docker run --rm -it efinance 26 | ``` 27 | 28 | - 源码安装(用于开发) 29 | 30 | ```bash 31 | git clone https://github.com/Micro-sheep/efinance 32 | cd efinance 33 | pip install -e . 34 | ``` 35 | -------------------------------------------------------------------------------- /docs/requirements.txt: -------------------------------------------------------------------------------- 1 | myst_parser 2 | numpydoc 3 | sphinx_automodapi 4 | sphinx_rtd_theme 5 | furo 6 | sphinx_copybutton 7 | -------------------------------------------------------------------------------- /efinance/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | .. include:: ../README.md 3 | """ 4 | 5 | __docformat__ = "restructuredtext" 6 | from efinance.api import bond, fund, futures, stock 7 | 8 | from efinance import utils 9 | 10 | 11 | __all__ = ["stock", "fund", "bond", "futures", "utils"] 12 | -------------------------------------------------------------------------------- /efinance/api/__init__.py: -------------------------------------------------------------------------------- 1 | import efinance.bond as bond 2 | import efinance.fund as fund 3 | import efinance.futures as futures 4 | import efinance.stock as stock 5 | -------------------------------------------------------------------------------- /efinance/bond/__init__.py: -------------------------------------------------------------------------------- 1 | # from ..stock import get_quote_history 2 | from .getter import ( 3 | get_all_base_info, 4 | get_base_info, 5 | get_deal_detail, 6 | get_history_bill, 7 | get_quote_history, 8 | get_realtime_quotes, 9 | get_today_bill, 10 | ) 11 | 12 | __all__ = [ 13 | "get_quote_history", 14 | "get_realtime_quotes", 15 | "get_all_base_info", 16 | "get_base_info", 17 | "get_today_bill", 18 | "get_history_bill", 19 | "get_deal_detail", 20 | ] 21 | -------------------------------------------------------------------------------- /efinance/bond/config.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | HERE = Path(__file__).parent 4 | 5 | # 债券基本信息表头 6 | EASTMONEY_BOND_BASE_INFO_FIELDS = { 7 | "SECURITY_CODE": "债券代码", 8 | "SECURITY_NAME_ABBR": "债券名称", 9 | "CONVERT_STOCK_CODE": "正股代码", 10 | "SECURITY_SHORT_NAME": "正股名称", 11 | "RATING": "债券评级", 12 | "PUBLIC_START_DATE": "申购日期", 13 | "ACTUAL_ISSUE_SCALE": "发行规模(亿)", 14 | "ONLINE_GENERAL_LWR": "网上发行中签率(%)", 15 | "LISTING_DATE": "上市日期", 16 | "EXPIRE_DATE": "到期日期", 17 | "BOND_EXPIRE": "期限(年)", 18 | "INTEREST_RATE_EXPLAIN": "利率说明", 19 | } 20 | -------------------------------------------------------------------------------- /efinance/bond/getter.py: -------------------------------------------------------------------------------- 1 | from typing import Dict, List, Union 2 | 3 | import multitasking 4 | import pandas as pd 5 | import requests 6 | 7 | from ..common import get_deal_detail as get_deal_detail_for_bond 8 | from ..common import get_history_bill as get_history_bill_for_bond 9 | from ..common import get_quote_history as get_quote_history_for_bond 10 | from ..common import get_realtime_quotes_by_fs 11 | from ..common import get_today_bill as get_today_bill_for_bond 12 | from ..common.config import EASTMONEY_REQUEST_HEADERS, FS_DICT, MagicConfig 13 | from ..utils import get_quote_id, process_dataframe_and_series, to_numeric 14 | from .config import EASTMONEY_BOND_BASE_INFO_FIELDS 15 | 16 | 17 | @to_numeric 18 | def get_base_info_single(bond_code: str) -> pd.Series: 19 | """ 20 | 获取单只债券基本信息 21 | 22 | Parameters 23 | ---------- 24 | bond_code : str 25 | 债券代码 26 | 27 | Returns 28 | ------- 29 | Series 30 | 债券的一些基本信息 31 | """ 32 | columns = EASTMONEY_BOND_BASE_INFO_FIELDS 33 | params = ( 34 | ("reportName", "RPT_BOND_CB_LIST"), 35 | ("columns", "ALL"), 36 | ("source", "WEB"), 37 | ("client", "WEB"), 38 | ("filter", f'(SECURITY_CODE="{bond_code}")'), 39 | ) 40 | 41 | url = "http://datacenter-web.eastmoney.com/api/data/v1/get" 42 | json_response = requests.get( 43 | url, headers=EASTMONEY_REQUEST_HEADERS, params=params 44 | ).json() 45 | if json_response["result"] is None: 46 | return pd.Series(index=columns.values(), dtype="object") 47 | items = json_response["result"]["data"] 48 | s = pd.Series(items[0]).rename(index=columns) 49 | s = s[columns.values()] 50 | return s 51 | 52 | 53 | def get_base_info_multi(bond_codes: List[str]) -> pd.DataFrame: 54 | """ 55 | 获取多只债券基本信息 56 | 57 | Parameters 58 | ---------- 59 | bond_codes : List[str] 60 | 债券代码构成的字符串列表 61 | 62 | Returns 63 | ------- 64 | DataFrame 65 | 多只债券信息 66 | """ 67 | ss = [] 68 | 69 | @multitasking.task 70 | def start(bond_code: str) -> None: 71 | s = get_base_info_single(bond_code) 72 | ss.append(s) 73 | 74 | for bond_code in bond_codes: 75 | start(bond_code) 76 | multitasking.wait_for_tasks() 77 | df = pd.DataFrame(ss) 78 | return df 79 | 80 | 81 | def get_base_info(bond_codes: Union[str, List[str]]) -> Union[pd.DataFrame, pd.Series]: 82 | """ 83 | 获取单只或多只债券基本信息 84 | 85 | Parameters 86 | ---------- 87 | bond_codes : Union[str, List[str]] 88 | 债券代码、名称 或者 债券代码、名称构成的列表 89 | 90 | Returns 91 | ------- 92 | Union[DataFrame, Series] 93 | 单只或多只债券基本信息 94 | 95 | - ``DataFrame`` : 当 ``bond_codes`` 是字符串列表时 96 | - ``Series`` : 当 ``bond_codes`` 是字符串时 97 | 98 | Examples 99 | -------- 100 | >>> import efinance as ef 101 | >>> # 单只债券 102 | >>> ef.bond.get_base_info('123111') 103 | 债券代码 123111 104 | 债券名称 东财转3 105 | 正股代码 300059 106 | 正股名称 东方财富 107 | 债券评级 AA+ 108 | 申购日期 2021-04-07 00:00:00 109 | 发行规模(亿) 158 110 | 网上发行中签率(%) 0.05877 111 | 上市日期 2021-04-23 00:00:00 112 | 到期日期 2027-04-07 00:00:00 113 | 期限(年) 6 114 | 利率说明 第一年0.2%、第二年0.3%、第三年0.4%、第四年0.8%、第五年1.8%、第六年2.0%。 115 | dtype: object 116 | 117 | >>> 多只债券 118 | >>> bond_codes = ['123111','113050'] 119 | >>> ef.bond.get_base_info(bond_codes) 120 | 债券代码 债券名称 正股代码 正股名称 ... 上市日期 到期日期 期限(年) 利率说明 121 | 0 113050 南银转债 601009 南京银行 ... 2021-07-01 00:00:00 2027-06-15 00:00:00 6 第一年0.20%、第二年0.40%、第三年0.70%、第四年1.20% 122 | 、第五年1.70%、第... 123 | 1 123111 东财转3 300059 东方财富 ... 2021-04-23 00:00:00 2027-04-07 00:00:00 6 第一年0.2%、第二年0.3%、第三年0.4%、第四年0.8%、第 124 | 五年1.8%、第六年2.0%。 125 | 126 | """ 127 | if isinstance(bond_codes, str): 128 | return get_base_info_single(bond_codes) 129 | elif hasattr(bond_codes, "__iter__"): 130 | return get_base_info_multi(bond_codes) 131 | 132 | 133 | def get_all_base_info() -> pd.DataFrame: 134 | """ 135 | 获取全部债券基本信息列表 136 | 137 | Returns 138 | ------- 139 | DataFrame 140 | 债券一些基本信息 141 | 142 | Examples 143 | -------- 144 | >>> import efinance as ef 145 | >>> ef.bond.get_all_base_info() 146 | 债券代码 债券名称 正股代码 正股名称 债券评级 申购日期 发行规模(亿) 网上发行中签率(%) 上市日期 到期日期 期限(年) 利率说明 147 | 0 123120 隆华转债 300263 隆华科技 AA- 2021-07-30 00:00:00 7.989283 NaN None 2027-07-30 00:00:00 6 第一年为0.40%、第二年为0.70%、第三年为1.00%、第四年为1.60%、第五年为2.... 148 | 1 110081 闻泰转债 600745 闻泰科技 AA+ 2021-07-28 00:00:00 86.000000 0.044030 None 2027-07-28 00:00:00 6 第一年0.10%、第二年0.20%、第三年0.30%、第四年1.50%、第五年1.80%、第... 149 | 2 118001 金博转债 688598 金博股份 A+ 2021-07-23 00:00:00 5.999010 0.001771 None 2027-07-23 00:00:00 6 第一年0.50%、第二年0.70%、第三年1.20%、第四年1.80%、第五年2.40%、第... 150 | 3 123119 康泰转2 300601 康泰生物 AA 2021-07-15 00:00:00 20.000000 0.014182 None 2027-07-15 00:00:00 6 第一年为0.30%、第二年为0.50%、第三年为1.00%、第 四年为1.50%、第五年为1.... 151 | 4 113627 太平转债 603877 太平鸟 AA 2021-07-15 00:00:00 8.000000 0.000542 None 2027-07-15 00:00:00 6 第一年0.30%、第二年0.50%、第三年1.00%、第四年1.50%、第五年1.80%、第... 152 | .. ... ... ... ... ... ... ... ... ... ... ... ... 153 | 80 110227 赤化转债 600227 圣济堂 AAA 2007-10-10 00:00:00 4.500000 0.158854 2007-10-23 00:00:00 2009-05-25 00:00:00 1.6192 票面利率和付息日期:本次发行的债券票面利率第一 年为1.5%、第二年为1.8%、第三年为2.... 154 | 81 126006 07深高债 600548 深高速 AAA 2007-10-09 00:00:00 15.000000 0.290304 2007-10-30 00:00:00 2013-10-09 00:00:00 6 None 155 | 82 110971 恒源转债 600971 恒源煤电 AAA 2007-09-24 00:00:00 4.000000 5.311774 2007-10-12 00:00:00 2009-12-21 00:00:00 2.2484 票面利率为:第一年年利率1.5%,第二年年利率1.8%,第三年年利率2.1%,第四年年利率2... 156 | 83 110567 山鹰转债 600567 山鹰国际 AA 2007-09-05 00:00:00 4.700000 0.496391 2007-09-17 00:00:00 2010-02-01 00:00:00 2.4055 票面利率和付息日期:本次发行的债券票面利率第一年为1.4%,第二年为1.7%,第三年为2.... 157 | 84 110026 中海转债 600026 中远海能 AAA 2007-07-02 00:00:00 20.000000 1.333453 2007-07-12 00:00:00 2008-03-27 00:00:00 0.737 票面利率:第一年为1.84%,第二年为2.05%,第三年为2.26%,第四年为2.47%,第... 158 | 159 | """ 160 | page = 1 161 | dfs: List[pd.DataFrame] = [] 162 | columns = EASTMONEY_BOND_BASE_INFO_FIELDS 163 | while 1: 164 | params = ( 165 | ("sortColumns", "PUBLIC_START_DATE"), 166 | ("sortTypes", "-1"), 167 | ("pageSize", "500"), 168 | ("pageNumber", f"{page}"), 169 | ("reportName", "RPT_BOND_CB_LIST"), 170 | ("columns", "ALL"), 171 | ("source", "WEB"), 172 | ("client", "WEB"), 173 | ) 174 | 175 | url = "http://datacenter-web.eastmoney.com/api/data/v1/get" 176 | json_response = requests.get( 177 | url, headers=EASTMONEY_REQUEST_HEADERS, params=params 178 | ).json() 179 | if json_response["result"] is None: 180 | break 181 | data = json_response["result"]["data"] 182 | df = pd.DataFrame(data).rename(columns=columns)[columns.values()] 183 | dfs.append(df) 184 | page += 1 185 | 186 | df = pd.concat(dfs, ignore_index=True) 187 | return df 188 | 189 | 190 | @process_dataframe_and_series(remove_columns_and_indexes=["市场编号"]) 191 | @to_numeric 192 | def get_realtime_quotes(**kwargs) -> pd.DataFrame: 193 | """ 194 | 获取沪深市场全部债券实时行情信息 195 | 196 | Returns 197 | ------- 198 | DataFrame 199 | 沪深市场全部债券实时行情信息 200 | 201 | Examples 202 | -------- 203 | >>> import efinance as ef 204 | >>> ef.bond.get_realtime_quotes() 205 | 债券代码 债券名称 涨跌幅 最新价 最高 最低 今开 涨跌额 换手率 量比 动态市盈率 成交量 成交额 昨日收盘 总市值 流通市值 行情ID 市场类型 206 | 0 123051 今天转债 24.03 158.66 165.0 134.0 134.0 30.74 496.74 67.16 - 1388341 2185911136.0 127.92 443443594 443443594 0.123051 深A 207 | 1 123042 银河转债 16.04 219.309 224.0 193.11 194.5 30.309 1833.99 1.34 - 3042265 6402014720.0 189.0 363794813 363794813 0.123042 深A 208 | 2 113034 滨化转债 13.49 247.71 255.62 214.5 214.5 29.45 334.56 2.96 - 1585993 3798255024.0 218.26 1174284861 1174284861 1.113034 沪A 209 | 3 128064 司尔转债 11.29 148.01 150.34 133.007 133.73 15.01 277.06 7.04 - 887301 1305800336.0 133.0 474009426 474009426 0.128064 深A 210 | 4 113027 华钰转债 8.38 129.86 130.2 122.3 123.0 10.04 83.84 4.15 - 272641 346817120.0 119.82 422273164 422273164 1.113027 沪A 211 | .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 212 | 390 113621 彤程转债 -4.45 188.57 198.22 188.0 196.01 -8.79 29.91 0.47 - 168709 326018848.0 197.36 1063693010 1063693010 1.113621 沪A 213 | 391 128017 金禾转债 -4.86 182.676 204.989 182.61 195.16 -9.324 35.58 2.0 - 196375 375750768.0 192.0 1008366222 1008366222 0.128017 深A 214 | 392 113548 石英转债 -5.16 250.22 267.57 246.56 262.3 -13.61 143.32 0.72 - 175893 452796304.0 263.83 307086749 307086749 1.113548 沪A 215 | 393 128093 百川转债 -5.71 429.042 449.97 426.078 443.1 -25.958 426.86 0.36 - 693261 3032643232.0 455.0 696810974 696810974 0.128093 深A 216 | 394 123066 赛意转债 -6.0 193.08 203.999 193.08 203.0 -12.32 323.13 0.22 - 133317 261546032.0 205.4 79660753 79660753 0.123066 深A 217 | 218 | """ 219 | df = get_realtime_quotes_by_fs(FS_DICT["bond"], **kwargs) 220 | df.rename(columns={"代码": "债券代码", "名称": "债券名称"}, inplace=True) 221 | return df 222 | 223 | 224 | def get_quote_history( 225 | bond_codes: Union[str, List[str]], 226 | beg: str = "19000101", 227 | end: str = "20500101", 228 | klt: int = 101, 229 | fqt: int = 1, 230 | **kwargs, 231 | ) -> Union[pd.DataFrame, Dict[str, pd.DataFrame]]: 232 | """ 233 | 获取债券的 K 线数据 234 | 235 | Parameters 236 | ---------- 237 | bond_codes : Union[str,List[str]] 238 | 债券代码、名称 或者 代码、名称构成的列表 239 | beg : str, optional 240 | 开始日期,默认为 ``'19000101'`` ,表示 1900年1月1日 241 | end : str, optional 242 | 结束日期,默认为 ``'20500101'`` ,表示 2050年1月1日 243 | klt : int, optional 244 | 行情之间的时间间隔,默认为 ``101`` ,可选示例如下 245 | 246 | - ``1`` : 分钟 247 | - ``5`` : 5 分钟 248 | - ``15`` : 15 分钟 249 | - ``30`` : 30 分钟 250 | - ``60`` : 60 分钟 251 | - ``101`` : 日 252 | - ``102`` : 周 253 | - ``103`` : 月 254 | 255 | fqt : int, optional 256 | 复权方式,默认为 ``1`` ,可选示例如下 257 | 258 | - ``0`` : 不复权 259 | - ``1`` : 前复权 260 | - ``2`` : 后复权 261 | 262 | Returns 263 | ------- 264 | Union[DataFrame, Dict[str, DataFrame]] 265 | 债券的 K 线数据 266 | 267 | - ``DataFrame`` : 当 ``codes`` 是 ``str`` 时 268 | - ``Dict[str, DataFrame]`` : 当 ``bond_codes`` 是 ``List[str]`` 时 269 | 270 | Examples 271 | -------- 272 | >>> import efinance as ef 273 | >>> # 获取单只债券日 K 行情 274 | >>> ef.bond.get_quote_history('123111') 275 | 债券名称 债券代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 276 | 0 东财转3 123111 2021-04-23 130.000 130.000 130.000 130.000 1836427 2.387355e+09 0.00 30.00 30.000 11.62 277 | 1 东财转3 123111 2021-04-26 130.353 130.010 133.880 125.110 8610944 1.126033e+10 6.75 0.01 0.010 54.50 278 | 2 东财转3 123111 2021-04-27 129.000 129.600 130.846 128.400 1820766 2.357472e+09 1.88 -0.32 -0.410 11.52 279 | 3 东财转3 123111 2021-04-28 129.100 130.770 131.663 128.903 1467727 1.921641e+09 2.13 0.90 1.170 9.29 280 | 4 东财转3 123111 2021-04-29 130.690 131.208 133.150 130.560 1156934 1.525974e+09 1.98 0.33 0.438 7.32 281 | .. ... ... ... ... ... ... ... ... ... ... ... ... ... 282 | 72 东财转3 123111 2021-08-09 159.600 159.300 162.990 158.690 596124 9.585751e+08 2.69 -0.34 -0.550 3.77 283 | 73 东财转3 123111 2021-08-10 159.190 160.950 161.450 157.000 517237 8.234596e+08 2.79 1.04 1.650 3.27 284 | 74 东财转3 123111 2021-08-11 161.110 159.850 162.300 159.400 298906 4.800711e+08 1.80 -0.68 -1.100 1.89 285 | 75 东财转3 123111 2021-08-12 159.110 158.290 160.368 158.010 270641 4.298100e+08 1.48 -0.98 -1.560 1.71 286 | 76 东财转3 123111 2021-08-13 158.000 158.358 160.290 157.850 250059 3.975513e+08 1.54 0.04 0.068 1.58 287 | 288 | """ 289 | df = get_quote_history_for_bond( 290 | bond_codes, beg=beg, end=end, klt=klt, fqt=fqt, **kwargs 291 | ) 292 | 293 | if isinstance(df, pd.DataFrame): 294 | 295 | df.rename(columns={"代码": "债券代码", "名称": "债券名称"}, inplace=True) 296 | elif isinstance(df, dict): 297 | for bond_code in df.keys(): 298 | df[bond_code].rename( 299 | columns={"代码": "债券代码", "名称": "债券名称"}, inplace=True 300 | ) 301 | return df 302 | 303 | 304 | def get_history_bill(bond_code: str) -> pd.DataFrame: 305 | """ 306 | 获取单支债券的历史单子流入流出数据 307 | 308 | Parameters 309 | ---------- 310 | bond_code : str 311 | 债券代码 312 | 313 | Returns 314 | ------- 315 | DataFrame 316 | 沪深市场单只债券历史单子流入流出数据 317 | 318 | Examples 319 | -------- 320 | >>> import efinance as ef 321 | >>> ef.bond.get_history_bill('123111') 322 | 323 | """ 324 | 325 | df = get_history_bill_for_bond(bond_code) 326 | df.rename(columns={"代码": "债券代码", "名称": "债券名称"}, inplace=True) 327 | return df 328 | 329 | 330 | def get_today_bill(bond_code: str) -> pd.DataFrame: 331 | """ 332 | 获取单只债券最新交易日的日内分钟级单子流入流出数据 333 | 334 | Parameters 335 | ---------- 336 | bond_code : str 337 | 债券代码 338 | 339 | Returns 340 | ------- 341 | DataFrame 342 | 单只债券最新交易日的日内分钟级单子流入流出数据 343 | 344 | Examples 345 | -------- 346 | >>> import efinance as ef 347 | >>> ef.bond.get_today_bill('123111') 348 | 债券名称 债券代码 时间 主力净流入 小单净流入 中单净流入 大单净流入 超大单净流入 349 | 0 东财转3 123111 2021-08-13 09:31 -278046.0 319657.0 -41611.0 -278046.0 0.0 350 | 1 东财转3 123111 2021-08-13 09:32 -988506.0 571643.0 416863.0 -988506.0 0.0 351 | 2 东财转3 123111 2021-08-13 09:33 -990089.0 501980.0 488109.0 -990089.0 0.0 352 | 3 东财转3 123111 2021-08-13 09:34 -1718728.0 9051.0 1709678.0 -1718728.0 0.0 353 | 4 东财转3 123111 2021-08-13 09:35 -1653717.0 -133654.0 1787373.0 -1653717.0 0.0 354 | .. ... ... ... ... ... ... ... ... 355 | 235 东财转3 123111 2021-08-13 14:56 5942063.0 -747717.0 -5194332.0 11700567.0 -5758504.0 356 | 236 东财转3 123111 2021-08-13 14:57 5916755.0 -483170.0 -5433570.0 11963346.0 -6046591.0 357 | 237 东财转3 123111 2021-08-13 14:58 5503692.0 -187241.0 -5316435.0 11757642.0 -6253950.0 358 | 238 东财转3 123111 2021-08-13 14:59 5503692.0 -187241.0 -5316435.0 11757642.0 -6253950.0 359 | 239 东财转3 123111 2021-08-13 15:00 5503692.0 -187241.0 -5316435.0 11757642.0 -6253950.0 360 | 361 | """ 362 | df = get_today_bill_for_bond(bond_code) 363 | df.rename(columns={"代码": "债券代码", "名称": "债券名称"}, inplace=True) 364 | 365 | return df 366 | 367 | 368 | def get_deal_detail(bond_code: str, max_count: int = 1000000, **kwargs) -> pd.DataFrame: 369 | """ 370 | 获取债券最新交易日成交明细 371 | 372 | Parameters 373 | ---------- 374 | bond_code : str 375 | 债券代码或者名称 376 | max_count : int, optional 377 | 最近的最大数据条数, 默认为 ``1000000`` 378 | 379 | Returns 380 | ------- 381 | DataFrame 382 | 债券最新交易日成交明细 383 | 384 | Examples 385 | -------- 386 | >>> import efinance as ef 387 | >>> ef.bond.get_deal_detail('113050') 388 | 债券名称 债券代码 时间 昨收 成交价 成交量 单数 389 | 0 南银转债 113050 09:15:30 122.44 122.60 21 0 390 | 1 南银转债 113050 09:17:07 122.44 122.60 21 0 391 | 2 南银转债 113050 09:20:52 122.44 122.60 21 0 392 | 3 南银转债 113050 09:22:34 122.44 122.60 21 0 393 | 4 南银转债 113050 09:23:35 122.44 122.56 21 0 394 | ... ... ... ... ... ... ... .. 395 | 1720 南银转债 113050 14:58:49 122.44 121.87 1 0 396 | 1721 南银转债 113050 14:58:52 122.44 121.87 5 0 397 | 1722 南银转债 113050 14:59:01 122.44 121.88 4 0 398 | 1723 南银转债 113050 14:59:31 122.44 121.82 130 0 399 | 1724 南银转债 113050 15:00:00 122.44 121.82 50 0 400 | 401 | """ 402 | 403 | quote_id = "" 404 | if kwargs.get(MagicConfig.QUOTE_ID_MODE): 405 | quote_id = bond_code 406 | else: 407 | quote_id = get_quote_id(bond_code) 408 | columns = ["债券名称", "债券代码", "时间", "昨收", "成交价", "成交量", "单数"] 409 | if not quote_id: 410 | return pd.DataFrame(columns=columns) 411 | df = get_deal_detail_for_bond(quote_id, max_count=max_count) 412 | df.rename(columns={"代码": "债券代码", "名称": "债券名称"}, inplace=True) 413 | return df 414 | -------------------------------------------------------------------------------- /efinance/common/__init__.py: -------------------------------------------------------------------------------- 1 | from .getter import ( 2 | get_base_info, 3 | get_deal_detail, 4 | get_history_bill, 5 | get_latest_quote, 6 | get_quote_history, 7 | get_realtime_quotes_by_fs, 8 | get_today_bill, 9 | ) 10 | 11 | __all__ = [] 12 | -------------------------------------------------------------------------------- /efinance/common/config.py: -------------------------------------------------------------------------------- 1 | import enum 2 | from pathlib import Path 3 | 4 | HERE = Path(__file__).parent 5 | 6 | 7 | class MarketType(enum.Enum): 8 | A_stock = "AStock" # A股 9 | A_stock_index = "Index" # A股指数 10 | B_stock = "BStock" # B股 11 | index = "Index" # 沪深京指数 12 | STAR_market = "23" # 科创板 13 | CSI_free_float = "24" # 中证系列指数 14 | NEEQ = "NEEQ" # 京A,新三板(全国中小企业股份转让系统) 15 | BK = "BK" # 板块 16 | Hongkong = "HK" # 港股 17 | US_stock = "UsStock" # 美股 18 | London_stock = "LSE" # 英股 19 | London_stock_IOB = "LSEIOB" # 伦敦交易所国际挂盘册 20 | universal_index = "UniversalIndex" # 国外指数 21 | SIX_Swiss = "SIX" # SIX瑞士股市 22 | 23 | @classmethod 24 | def has_value(cls, value): 25 | return value in cls._value2member_map_ 26 | 27 | 28 | class MagicConfig: 29 | EXTRA_FIELDS = "extra_fields" 30 | QUOTE_ID_MODE = "quote_id_mode" 31 | QUOTE_SYMBOL_MODE = "quote_symbol_mode" 32 | RETURN_DF = "return_df" 33 | 34 | 35 | # 各个市场编号 36 | MARKET_NUMBER_DICT = { 37 | "0": "深A", 38 | "1": "沪A", 39 | "105": "美股", 40 | "106": "美股", 41 | "107": "美股", 42 | "116": "港股", 43 | "128": "港股", 44 | "113": "上期所", 45 | "114": "大商所", 46 | "115": "郑商所", 47 | "8": "中金所", 48 | "142": "上海能源期货交易所", 49 | "155": "英股", 50 | "90": "板块", 51 | "225": "广期所", 52 | } 53 | # ! Powerful 54 | FS_DICT = { 55 | # 可转债 56 | "bond": "b:MK0354", 57 | "可转债": "b:MK0354", 58 | "stock": "m:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048", 59 | # 沪深A股 60 | # 'stock': 'm:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23', 61 | "沪深A股": "m:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23", 62 | "沪深京A股": "m:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048", 63 | "北证A股": "m:0 t:81 s:2048", 64 | "北A": "m:0 t:81 s:2048", 65 | # 期货 66 | "futures": "m:113,m:114,m:115,m:8,m:142,m:225", 67 | "期货": "m:113,m:114,m:115,m:8,m:142,m:225", 68 | "上证A股": "m:1 t:2,m:1 t:23", 69 | "沪A": "m:1 t:2,m:1 t:23", 70 | "深证A股": "m:0 t:6,m:0 t:80", 71 | "深A": "m:0 t:6,m:0 t:80", 72 | # 沪深新股 73 | "新股": "m:0 f:8,m:1 f:8", 74 | "创业板": "m:0 t:80", 75 | "科创板": "m:1 t:23", 76 | "沪股通": "b:BK0707", 77 | "深股通": "b:BK0804", 78 | "风险警示板": "m:0 f:4,m:1 f:4", 79 | "两网及退市": "m:0 s:3", 80 | # 板块 81 | "地域板块": "m:90 t:1 f:!50", 82 | "行业板块": "m:90 t:2 f:!50", 83 | "概念板块": "m:90 t:3 f:!50", 84 | # 指数 85 | "上证系列指数": "m:1 s:2", 86 | "深证系列指数": "m:0 t:5", 87 | "沪深系列指数": "m:1 s:2,m:0 t:5", 88 | # ETF 基金 89 | "ETF": "b:MK0021,b:MK0022,b:MK0023,b:MK0024", 90 | # LOF 基金 91 | "LOF": "b:MK0404,b:MK0405,b:MK0406,b:MK0407", 92 | "美股": "m:105,m:106,m:107", 93 | "港股": "m:128 t:3,m:128 t:4,m:128 t:1,m:128 t:2", 94 | "英股": "m:155 t:1,m:155 t:2,m:155 t:3,m:156 t:1,m:156 t:2,m:156 t:5,m:156 t:6,m:156 t:7,m:156 t:8", 95 | "中概股": "b:MK0201", 96 | "中国概念股": "b:MK0201", 97 | } 98 | 99 | # 股票、ETF、债券 K 线表头 100 | EASTMONEY_KLINE_FIELDS = { 101 | "f51": "日期", 102 | "f52": "开盘", 103 | "f53": "收盘", 104 | "f54": "最高", 105 | "f55": "最低", 106 | "f56": "成交量", 107 | "f57": "成交额", 108 | "f58": "振幅", 109 | "f59": "涨跌幅", 110 | "f60": "涨跌额", 111 | "f61": "换手率", 112 | } 113 | # 股票、ETF、债券 近 n 天 1 分钟 K 线表头 114 | EASTMONEY_KLINE_NDAYS_FIELDS = { 115 | "f51": "日期", 116 | "f52": "开盘", 117 | "f53": "收盘", 118 | "f54": "最高", 119 | "f55": "最低", 120 | "f56": "成交量", 121 | "f57": "成交额", 122 | } 123 | # 股票、债券榜单表头 124 | EASTMONEY_QUOTE_FIELDS = { 125 | "f12": "代码", 126 | "f14": "名称", 127 | "f3": "涨跌幅", 128 | "f2": "最新价", 129 | "f15": "最高", 130 | "f16": "最低", 131 | "f17": "今开", 132 | "f4": "涨跌额", 133 | "f8": "换手率", 134 | "f10": "量比", 135 | "f9": "动态市盈率", 136 | "f5": "成交量", 137 | "f6": "成交额", 138 | "f18": "昨日收盘", 139 | "f20": "总市值", 140 | "f21": "流通市值", 141 | "f13": "市场编号", 142 | "f124": "更新时间戳", 143 | "f297": "最新交易日", 144 | } 145 | 146 | # 股票、债券历史大单数据表头 147 | EASTMONEY_HISTORY_BILL_FIELDS = { 148 | "f51": "日期", 149 | "f52": "主力净流入", 150 | "f53": "小单净流入", 151 | "f54": "中单净流入", 152 | "f55": "大单净流入", 153 | "f56": "超大单净流入", 154 | "f57": "主力净流入占比", 155 | "f58": "小单流入净占比", 156 | "f59": "中单流入净占比", 157 | "f60": "大单流入净占比", 158 | "f61": "超大单流入净占比", 159 | "f62": "收盘价", 160 | "f63": "涨跌幅", 161 | } 162 | # 请求头 163 | EASTMONEY_REQUEST_HEADERS = { 164 | "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko", 165 | "Accept": "*/*", 166 | "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", 167 | # 'Referer': 'http://quote.eastmoney.com/center/gridlist.html', 168 | } 169 | 170 | EASTMONEY_BASE_INFO_FIELDS = { 171 | "f57": "代码", 172 | "f58": "名称", 173 | "f162": "市盈率(动)", 174 | "f167": "市净率", 175 | "f127": "所处行业", 176 | "f116": "总市值", 177 | "f117": "流通市值", 178 | "f198": "板块编号", 179 | "f173": "ROE", 180 | "f187": "净利率", 181 | "f105": "净利润", 182 | "f186": "毛利率", 183 | } 184 | -------------------------------------------------------------------------------- /efinance/common/getter.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from typing import Dict, List, Union 3 | import numpy as np 4 | import multitasking 5 | import pandas as pd 6 | from jsonpath import jsonpath 7 | from retry import retry 8 | from tqdm.auto import tqdm 9 | import time 10 | from concurrent.futures import ThreadPoolExecutor 11 | 12 | from ..common.config import MARKET_NUMBER_DICT, MarketType 13 | from ..shared import BASE_INFO_CACHE, session, MAX_CONNECTIONS 14 | from ..utils import get_quote_id, to_numeric 15 | from .config import ( 16 | EASTMONEY_BASE_INFO_FIELDS, 17 | EASTMONEY_HISTORY_BILL_FIELDS, 18 | EASTMONEY_KLINE_FIELDS, 19 | EASTMONEY_KLINE_NDAYS_FIELDS, 20 | EASTMONEY_QUOTE_FIELDS, 21 | EASTMONEY_REQUEST_HEADERS, 22 | MagicConfig, 23 | ) 24 | 25 | 26 | @to_numeric 27 | def get_realtime_quotes_by_fs(fs: str, **kwargs) -> pd.DataFrame: 28 | """ 29 | 获取沪深市场最新行情总体情况 30 | 31 | Returns 32 | ------- 33 | DataFrame 34 | 沪深市场最新行情信息(涨跌幅、换手率等信息) 35 | 36 | """ 37 | 38 | columns = {**EASTMONEY_QUOTE_FIELDS, **kwargs.get(MagicConfig.EXTRA_FIELDS, {})} 39 | fields = ",".join(columns.keys()) 40 | 41 | def get_by_page(pn: int, pz: int): 42 | params = ( 43 | ("pn", pn), 44 | ("pz", pz), 45 | ("po", "1"), 46 | ("np", "1"), 47 | ("fltt", "2"), 48 | ("invt", "2"), 49 | # NOTE 按代码排序。避免多次请求顺序不一致 50 | ("fid", "f12"), 51 | ("fs", fs), 52 | ("fields", fields), 53 | ) 54 | url = "http://push2.eastmoney.com/api/qt/clist/get" 55 | json_response = session.get( 56 | url, headers=EASTMONEY_REQUEST_HEADERS, params=params 57 | ).json() 58 | return json_response 59 | 60 | def mixed_sort_key(series: pd.Series): 61 | sort_keys = pd.Series(index=series.index, dtype=float) 62 | 63 | for idx, val in series.items(): 64 | if isinstance(val, str): 65 | sort_keys[idx] = np.nan 66 | else: 67 | sort_keys[idx] = val 68 | 69 | return sort_keys 70 | 71 | json_response = get_by_page(1, pz=200) 72 | total = json_response["data"]["total"] 73 | pz = len(json_response["data"]["diff"]) 74 | div, mod = divmod(total, pz) 75 | pages = div + 1 if mod else div 76 | 77 | with ThreadPoolExecutor() as executor: 78 | tasks = executor.map(get_by_page, range(1, pages + 1), [pz] * pages) 79 | responses = list(tasks) 80 | 81 | dfs = [ 82 | pd.DataFrame(response["data"]["diff"])[list(columns.keys())] 83 | for response in responses 84 | ] 85 | df = ( 86 | pd.concat(dfs, axis=0, ignore_index=True) 87 | .rename(columns=columns)[columns.values()] 88 | .sort_values( 89 | by="涨跌幅", 90 | ascending=False, 91 | ignore_index=True, 92 | key=mixed_sort_key, 93 | ) 94 | ) 95 | 96 | df["行情ID"] = df["市场编号"].astype(str) + "." + df["代码"].astype(str) 97 | df["市场类型"] = ( 98 | df["市场编号"].astype(str).apply(lambda x: MARKET_NUMBER_DICT.get(x)) 99 | ) 100 | df["更新时间"] = df["更新时间戳"].apply(lambda x: str(datetime.fromtimestamp(x))) 101 | df["最新交易日"] = pd.to_datetime(df["最新交易日"], format="%Y%m%d").astype(str) 102 | tmp = df["最新交易日"] 103 | del df["最新交易日"] 104 | df["最新交易日"] = tmp 105 | del df["更新时间戳"] 106 | return df 107 | 108 | 109 | @to_numeric 110 | def get_quote_history_single( 111 | code: str, 112 | beg: str = "19000101", 113 | end: str = "20500101", 114 | klt: int = 101, 115 | fqt: int = 1, 116 | market_type: Union[MarketType, None] = None, 117 | suppress_error: bool = False, 118 | use_id_cache: bool = True, 119 | **kwargs, 120 | ) -> pd.DataFrame: 121 | """ 122 | 获取单只股票、债券 K 线数据 123 | 124 | """ 125 | 126 | fields = list(EASTMONEY_KLINE_FIELDS.keys()) 127 | columns = list(EASTMONEY_KLINE_FIELDS.values()) 128 | fields2 = ",".join(fields) 129 | if kwargs.get(MagicConfig.QUOTE_ID_MODE): 130 | quote_id = code 131 | else: 132 | quote_id = get_quote_id( 133 | stock_code=code, 134 | market_type=market_type, 135 | use_local=use_id_cache, 136 | suppress_error=suppress_error, 137 | **kwargs, 138 | ) 139 | params = ( 140 | ("fields1", "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13"), 141 | ("fields2", fields2), 142 | ("beg", beg), 143 | ("end", end), 144 | ("rtntype", "6"), 145 | ("secid", quote_id), 146 | ("klt", f"{klt}"), 147 | ("fqt", f"{fqt}"), 148 | ) 149 | 150 | url = "https://push2his.eastmoney.com/api/qt/stock/kline/get" 151 | 152 | json_response = session.get( 153 | url, headers=EASTMONEY_REQUEST_HEADERS, params=params, verify=False 154 | ).json() 155 | klines: List[str] = jsonpath(json_response, "$..klines[:]") 156 | if not klines: 157 | columns.insert(0, "代码") 158 | columns.insert(0, "名称") 159 | return pd.DataFrame(columns=columns) 160 | 161 | rows = [kline.split(",") for kline in klines] 162 | name = json_response["data"]["name"] 163 | code = quote_id.split(".")[-1] 164 | df = pd.DataFrame(rows, columns=columns) 165 | df.insert(0, "代码", code) 166 | df.insert(0, "名称", name) 167 | 168 | return df 169 | 170 | 171 | def get_quote_history_multi( 172 | codes: List[str], 173 | beg: str = "19000101", 174 | end: str = "20500101", 175 | klt: int = 101, 176 | fqt: int = 1, 177 | tries: int = 3, 178 | market_type: Union[MarketType, None] = None, 179 | suppress_error: bool = False, 180 | use_id_cache: bool = True, 181 | **kwargs, 182 | ) -> Dict[str, pd.DataFrame]: 183 | """ 184 | 获取多只股票、债券历史行情信息 185 | 186 | """ 187 | 188 | dfs: Dict[str, pd.DataFrame] = {} 189 | total = len(codes) 190 | 191 | @multitasking.task 192 | @retry(tries=tries, delay=1) 193 | def start(code: str): 194 | _df = get_quote_history_single( 195 | code, 196 | beg=beg, 197 | end=end, 198 | klt=klt, 199 | fqt=fqt, 200 | market_type=market_type, 201 | suppress_error=suppress_error, 202 | use_id_cache=use_id_cache, 203 | **kwargs, 204 | ) 205 | dfs[code] = _df 206 | pbar.update(1) 207 | pbar.set_description_str(f"Processing => {code}") 208 | 209 | pbar = tqdm(total=total) 210 | for code in codes: 211 | if len(multitasking.get_active_tasks()) > MAX_CONNECTIONS: 212 | time.sleep(3) 213 | start(code) 214 | 215 | multitasking.wait_for_tasks() 216 | pbar.close() 217 | 218 | if kwargs.get(MagicConfig.RETURN_DF): 219 | return pd.concat(dfs, axis=0, ignore_index=True) 220 | return dfs 221 | 222 | 223 | def get_quote_history( 224 | codes: Union[str, List[str]], 225 | beg: str = "19000101", 226 | end: str = "20500101", 227 | klt: int = 101, 228 | fqt: int = 1, 229 | market_type: Union[MarketType, None] = None, 230 | suppress_error: bool = False, 231 | use_id_cache: bool = True, 232 | **kwargs, 233 | ) -> Union[pd.DataFrame, Dict[str, pd.DataFrame]]: 234 | """ 235 | 获取股票、ETF、债券的 K 线数据 236 | 237 | Parameters 238 | ---------- 239 | codes : Union[str,List[str]] 240 | 股票、债券代码 或者 代码构成的列表 241 | beg : str, optional 242 | 开始日期,默认为 ``'19000101'`` ,表示 1900年1月1日 243 | end : str, optional 244 | 结束日期,默认为 ``'20500101'`` ,表示 2050年1月1日 245 | klt : int, optional 246 | 行情之间的时间间隔,默认为 ``101`` ,可选示例如下 247 | 248 | - ``1`` : 分钟 249 | - ``5`` : 5 分钟 250 | - ``15`` : 15 分钟 251 | - ``30`` : 30 分钟 252 | - ``60`` : 60 分钟 253 | - ``101`` : 日 254 | - ``102`` : 周 255 | - ``103`` : 月 256 | 257 | fqt : int, optional 258 | 复权方式,默认为 ``1`` ,可选示例如下 259 | 260 | - ``0`` : 不复权 261 | - ``1`` : 前复权 262 | - ``2`` : 后复权 263 | 264 | market_type : MarketType, optional 265 | 市场类型,目前可筛选A股,港股,美股和英股。默认不筛选,可选示例如下 266 | 267 | - ``A_stock`` : A股 268 | - ``Hongkong`` : 香港 269 | - ``London_stock_exchange`` : 英股 270 | - ``US_stock`` : 美股 271 | 272 | suppress_error : bool, optional 273 | 遇到错误的股票代码,是否不报错,返回空的DataFrame 274 | use_id_cache : bool, optional 275 | 是否使用本地缓存的东方财富股票行情ID 276 | 277 | Returns 278 | ------- 279 | Union[DataFrame, Dict[str, DataFrame]] 280 | 股票、债券的 K 线数据 281 | 282 | - ``DataFrame`` : 当 ``codes`` 是 ``str`` 时 283 | - ``Dict[str, DataFrame]`` : 当 ``codes`` 是 ``List[str]`` 时 284 | 285 | """ 286 | 287 | if isinstance(codes, str): 288 | return get_quote_history_single( 289 | codes, 290 | beg=beg, 291 | end=end, 292 | klt=klt, 293 | fqt=fqt, 294 | market_type=market_type, 295 | suppress_error=suppress_error, 296 | use_id_cache=use_id_cache, 297 | **kwargs, 298 | ) 299 | 300 | elif hasattr(codes, "__iter__"): 301 | codes = list(codes) 302 | return get_quote_history_multi( 303 | codes, 304 | beg=beg, 305 | end=end, 306 | klt=klt, 307 | fqt=fqt, 308 | market_type=market_type, 309 | suppress_error=suppress_error, 310 | use_id_cache=use_id_cache, 311 | **kwargs, 312 | ) 313 | raise TypeError("代码数据类型输入不正确!") 314 | 315 | 316 | @to_numeric 317 | def get_history_bill(code: str) -> pd.DataFrame: 318 | """ 319 | 获取单支股票、债券的历史单子流入流出数据 320 | 321 | Parameters 322 | ---------- 323 | code : str 324 | 股票、债券代码 325 | 326 | Returns 327 | ------- 328 | DataFrame 329 | 沪深市场单只股票、债券历史单子流入流出数据 330 | 331 | """ 332 | 333 | fields = list(EASTMONEY_HISTORY_BILL_FIELDS.keys()) 334 | columns = list(EASTMONEY_HISTORY_BILL_FIELDS.values()) 335 | fields2 = ",".join(fields) 336 | quote_id = get_quote_id(code) 337 | params = ( 338 | ("lmt", "100000"), 339 | ("klt", "101"), 340 | ("secid", quote_id), 341 | ("fields1", "f1,f2,f3,f7"), 342 | ("fields2", fields2), 343 | ) 344 | url = "http://push2his.eastmoney.com/api/qt/stock/fflow/daykline/get" 345 | json_response = session.get( 346 | url, headers=EASTMONEY_REQUEST_HEADERS, params=params 347 | ).json() 348 | 349 | klines: List[str] = jsonpath(json_response, "$..klines[:]") 350 | if not klines: 351 | columns.insert(0, "代码") 352 | columns.insert(0, "名称") 353 | return pd.DataFrame(columns=columns) 354 | rows = [kline.split(",") for kline in klines] 355 | name = jsonpath(json_response, "$..name")[0] 356 | code = quote_id.split(".")[-1] 357 | df = pd.DataFrame(rows, columns=columns) 358 | df.insert(0, "代码", code) 359 | df.insert(0, "名称", name) 360 | 361 | return df 362 | 363 | 364 | @to_numeric 365 | def get_today_bill(code: str) -> pd.DataFrame: 366 | """ 367 | 获取单只股票最新交易日的日内分钟级单子流入流出数据 368 | 369 | Parameters 370 | ---------- 371 | code : str 372 | 股票、债券代码 373 | 374 | Returns 375 | ------- 376 | DataFrame 377 | 单只股票、债券最新交易日的日内分钟级单子流入流出数据 378 | 379 | """ 380 | quote_id = get_quote_id(code) 381 | params = ( 382 | ("lmt", "0"), 383 | ("klt", "1"), 384 | ("secid", quote_id), 385 | ("fields1", "f1,f2,f3,f7"), 386 | ("fields2", "f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f62,f63"), 387 | ) 388 | url = "http://push2.eastmoney.com/api/qt/stock/fflow/kline/get" 389 | json_response = session.get( 390 | url, headers=EASTMONEY_REQUEST_HEADERS, params=params 391 | ).json() 392 | columns = [ 393 | "时间", 394 | "主力净流入", 395 | "小单净流入", 396 | "中单净流入", 397 | "大单净流入", 398 | "超大单净流入", 399 | ] 400 | name = jsonpath(json_response, "$..name")[0] 401 | code = quote_id.split(".")[-1] 402 | klines: List[str] = jsonpath(json_response, "$..klines[:]") 403 | if not klines: 404 | columns.insert(0, "代码") 405 | columns.insert(0, "名称") 406 | return pd.DataFrame(columns=columns) 407 | rows = [kline.split(",") for kline in klines] 408 | df = pd.DataFrame(rows, columns=columns) 409 | df.insert(0, "代码", code) 410 | df.insert(0, "名称", name) 411 | return df 412 | 413 | 414 | @to_numeric 415 | def get_base_info(quote_id: str) -> pd.Series: 416 | 417 | fields = ",".join(EASTMONEY_BASE_INFO_FIELDS.keys()) 418 | params = ( 419 | ("ut", "fa5fd1943c7b386f172d6893dbfba10b"), 420 | ("invt", "2"), 421 | ("fltt", "2"), 422 | ("fields", fields), 423 | ("secid", quote_id), 424 | ) 425 | url = "http://push2.eastmoney.com/api/qt/stock/get" 426 | json_response = session.get( 427 | url, headers=EASTMONEY_REQUEST_HEADERS, params=params 428 | ).json() 429 | items = json_response["data"] 430 | if not items: 431 | return pd.Series(index=EASTMONEY_BASE_INFO_FIELDS.values(), dtype="object") 432 | 433 | s = pd.Series(items, dtype="object").rename(index=EASTMONEY_BASE_INFO_FIELDS) 434 | return s 435 | 436 | 437 | @to_numeric 438 | def get_deal_detail(quote_id: str, max_count: int = 1000000) -> pd.DataFrame: 439 | """ 440 | 获取股票、期货、债券的最新交易日成交情况 441 | 442 | Parameters 443 | ---------- 444 | quote_id : str 445 | 包含市场编号的股票、期货、债券代码 446 | max_count : int, optional 447 | 最大数据条数, 默认为 ``1000000`` 448 | 449 | Returns 450 | ------- 451 | DataFrame 452 | 股票、期货、债券的最新交易日成交情况 453 | 454 | Notes 455 | ------ 456 | 返回的数据表头: ``['名称', '代码', '时间', '昨收', '成交价', '成交量', '单数']`` 457 | """ 458 | base_info = BASE_INFO_CACHE.get(quote_id, get_base_info(quote_id)) 459 | BASE_INFO_CACHE[quote_id] = base_info 460 | columns = ["名称", "代码", "时间", "昨收", "成交价", "成交量", "单数"] 461 | if str(base_info["代码"]).lower() == "nan": 462 | return pd.DataFrame(columns=columns) 463 | code = base_info["代码"] 464 | name = base_info["名称"] 465 | params = ( 466 | ("secid", quote_id), 467 | ("fields1", "f1,f2,f3,f4,f5"), 468 | ("fields2", "f51,f52,f53,f54,f55"), 469 | ("pos", f"-{int(max_count)}"), 470 | ) 471 | 472 | response = session.get( 473 | "https://push2.eastmoney.com/api/qt/stock/details/get", params=params 474 | ) 475 | 476 | js: dict = response.json() 477 | lines: List[str] = js["data"]["details"] 478 | rows = [line.split(",")[:4] for line in lines] 479 | df = pd.DataFrame(columns=columns, index=range(len(rows))) 480 | df.loc[:, "代码"] = code 481 | df.loc[:, "名称"] = name 482 | detail_df = pd.DataFrame(rows, columns=["时间", "成交价", "成交量", "单数"]) 483 | detail_df.insert(1, "昨收", js["data"]["prePrice"]) 484 | df.loc[:, detail_df.columns] = detail_df.values 485 | return df 486 | 487 | 488 | @to_numeric 489 | def get_latest_quote(quote_id_list: Union[str, List[str]], **kwargs) -> pd.DataFrame: 490 | """ 491 | 获取股票、期货、债券的最新行情 492 | 493 | Parameters 494 | ---------- 495 | quote_id_list : List[str] 496 | 带市场编号的行情ID或者行情ID组成的列表格式如下 497 | - ``'1.600159'`` 498 | - ``['1.600159','0.300750']`` 499 | 500 | 市场编号参见文件 ``efinance/common/config.py`` 中的 ``MARKET_NUMBER_DICT`` 501 | 502 | Returns 503 | ------- 504 | DataFrame 505 | 股票、期货、债券的最新行情 506 | 507 | Notes 508 | ------ 509 | 返回的数据表头: ``['代码', '名称', '涨跌幅', '最新价', '最高', '最低', '今开', '涨跌额', '换手率', '量比', '动态市盈率','成交量', '成交额', '昨日收盘', '总市值', '流通市值', '市场类型', '行情ID']`` 510 | """ 511 | if isinstance(quote_id_list, str): 512 | quote_id_list = [quote_id_list] 513 | secids: List[str] = quote_id_list 514 | 515 | columns = {**EASTMONEY_QUOTE_FIELDS, **kwargs.get(MagicConfig.EXTRA_FIELDS, {})} 516 | fields = ",".join(columns.keys()) 517 | params = ( 518 | ("OSVersion", "14.3"), 519 | ("appVersion", "6.3.8"), 520 | ("fields", fields), 521 | ("fltt", "2"), 522 | ("plat", "Iphone"), 523 | ("product", "EFund"), 524 | ("secids", ",".join(secids)), 525 | ("serverVersion", "6.3.6"), 526 | ("version", "6.3.8"), 527 | ) 528 | url = "https://push2.eastmoney.com/api/qt/ulist.np/get" 529 | json_response = session.get( 530 | url, headers=EASTMONEY_REQUEST_HEADERS, params=params 531 | ).json() 532 | rows = jsonpath(json_response, "$..diff[:]") 533 | if not rows: 534 | df = pd.DataFrame(columns=columns.values()) 535 | else: 536 | df = pd.DataFrame(rows)[list(columns.keys())].rename(columns=columns) 537 | df["市场类型"] = df["市场编号"].apply(lambda x: MARKET_NUMBER_DICT.get(str(x))) 538 | df["行情ID"] = df["市场编号"].astype(str) + "." + df["代码"].astype(str) 539 | del df["市场编号"] 540 | df["更新时间"] = df["更新时间戳"].apply(lambda x: str(datetime.fromtimestamp(x))) 541 | df["最新交易日"] = pd.to_datetime(df["最新交易日"], format="%Y%m%d").astype(str) 542 | tmp = df["最新交易日"] 543 | del df["最新交易日"] 544 | df["最新交易日"] = tmp 545 | del df["更新时间戳"] 546 | return df 547 | 548 | 549 | @to_numeric 550 | def get_latest_ndays_quote(code: str, ndays: int = 1, **kwargs) -> pd.DataFrame: 551 | """ 552 | 获取股票、期货、债券的最近 ``ndays`` 天的1分钟K线行情 553 | 554 | Parameters 555 | ---------- 556 | code : str 557 | 代码、名称或者行情ID 如果是行情ID则需传入 ``quote_id_mode=True`` 558 | ndays : int, optional 559 | 天数 默认为 ``1`` 最大为 ``5`` 560 | 561 | Returns 562 | ------- 563 | DataFrame 564 | 股票、期货、债券的最近 ndays 天的1分钟K线行情 565 | """ 566 | # TODO 考虑如何解决 ndays 不为 1 时,第一天开盘价为 0 的问题 567 | fields = list(EASTMONEY_KLINE_NDAYS_FIELDS.keys()) 568 | columns = list(EASTMONEY_KLINE_NDAYS_FIELDS.values()) 569 | fields2 = ",".join(fields) 570 | if kwargs.get(MagicConfig.QUOTE_ID_MODE): 571 | quote_id = code 572 | else: 573 | quote_id = get_quote_id(code) 574 | params = ( 575 | ("fields1", "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13"), 576 | ("fields2", fields2), 577 | ("ndays", ndays), 578 | ("iscr", "0"), 579 | ("iscca", "0"), 580 | ("secid", quote_id), 581 | ) 582 | 583 | json_response = session.get( 584 | "http://push2his.eastmoney.com/api/qt/stock/trends2/get", params=params 585 | ).json() 586 | 587 | klines: List[str] = jsonpath(json_response, "$..trends[:]") 588 | if not klines: 589 | columns.insert(0, "代码") 590 | columns.insert(0, "名称") 591 | return pd.DataFrame(columns=columns) 592 | 593 | rows = [kline.split(",") for kline in klines] 594 | name = json_response["data"]["name"] 595 | code = quote_id.split(".")[-1] 596 | df = pd.DataFrame(rows, columns=columns) 597 | df.insert(0, "代码", code) 598 | df.insert(0, "名称", name) 599 | 600 | return df 601 | -------------------------------------------------------------------------------- /efinance/config/__init__.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | HERE = Path(__file__).parent 4 | # 数据缓存文件存储目录 5 | DATA_DIR = HERE / "../data" 6 | # 创建数据缓存文件目录 7 | DATA_DIR.mkdir(parents=True, exist_ok=True) 8 | # 搜索词缓存位置 9 | SEARCH_RESULT_CACHE_PATH = str(DATA_DIR / "search-cache.json") 10 | 11 | MAX_CONNECTIONS = 50 12 | -------------------------------------------------------------------------------- /efinance/fund/__init__.py: -------------------------------------------------------------------------------- 1 | from .getter import ( 2 | get_base_info, 3 | get_fund_codes, 4 | get_industry_distribution, 5 | get_invest_position, 6 | get_pdf_reports, 7 | get_period_change, 8 | get_public_dates, 9 | get_quote_history, 10 | get_quote_history_multi, 11 | get_realtime_increase_rate, 12 | get_types_percentage, 13 | get_fund_manager, 14 | ) 15 | 16 | __all__ = [ 17 | "get_base_info", 18 | "get_fund_codes", 19 | "get_realtime_increase_rate", 20 | "get_invest_position", 21 | "get_types_percentage", 22 | "get_period_change", 23 | "get_public_dates", 24 | "get_industry_distribution", 25 | "get_quote_history", 26 | "get_quote_history_multi", 27 | "get_pdf_reports", 28 | "get_fund_manager", 29 | ] 30 | -------------------------------------------------------------------------------- /efinance/fund/config.py: -------------------------------------------------------------------------------- 1 | EastmoneyRank = { 2 | "f12": "代码", 3 | "f14": "名称", 4 | "f3": "涨跌幅", 5 | "f15": "最新价", 6 | "f4": "涨跌额", 7 | "f5": "成交量", 8 | "f6": "成交额", 9 | "f18": "昨日收盘", 10 | } 11 | 12 | EastmoneyHeaders = { 13 | "Host": "19.push2.eastmoney.com", 14 | "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko", 15 | "Accept": "*/*", 16 | "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", 17 | "Referer": "http://quote.eastmoney.com/center/gridlist.html", 18 | } 19 | EastmoneyFundHeaders = { 20 | "User-Agent": "EMProjJijin/6.2.8 (iPhone; iOS 13.6; Scale/2.00)", 21 | "GTOKEN": "98B423068C1F4DEF9842F82ADF08C5db", 22 | "clientInfo": "ttjj-iPhone10,1-iOS-iOS13.6", 23 | "Content-Type": "application/x-www-form-urlencoded", 24 | "Host": "fundmobapi.eastmoney.com", 25 | "Referer": "https://mpservice.com/516939c37bdb4ba2b1138c50cf69a2e1/release/pages/FundHistoryNetWorth", 26 | } 27 | -------------------------------------------------------------------------------- /efinance/fund/getter.py: -------------------------------------------------------------------------------- 1 | import os 2 | import re 3 | import signal 4 | from typing import List, Union, Dict 5 | 6 | import threading 7 | from bs4 import BeautifulSoup 8 | import multitasking 9 | import pandas as pd 10 | import requests 11 | import rich 12 | from jsonpath import jsonpath 13 | from retry import retry 14 | from tqdm.auto import tqdm 15 | import time 16 | 17 | from ..utils import to_numeric 18 | from .config import EastmoneyFundHeaders 19 | from ..common.config import MagicConfig 20 | from ..shared import session, MAX_CONNECTIONS 21 | import warnings 22 | 23 | warnings.filterwarnings("module") 24 | 25 | if threading.current_thread() is threading.main_thread(): 26 | signal.signal(signal.SIGINT, multitasking.killall) 27 | 28 | fund_session = session 29 | 30 | 31 | @retry(tries=3) 32 | @to_numeric 33 | def get_quote_history(fund_code: str, pz: int = 40000) -> pd.DataFrame: 34 | """ 35 | 根据基金代码和要获取的页码抓取基金净值信息 36 | 37 | Parameters 38 | ---------- 39 | fund_code : str 40 | 6 位基金代码 41 | pz : int, optional 42 | 页码, 默认为 40000 以获取全部历史数据 43 | 44 | Returns 45 | ------- 46 | DataFrame 47 | 包含基金历史净值等数据 48 | 49 | Examples 50 | -------- 51 | >>> import efinance as ef 52 | >>> ef.fund.get_quote_history('161725') 53 | 日期 单位净值 累计净值 涨跌幅 54 | 0 2021-06-11 1.5188 3.1499 -3.09 55 | 1 2021-06-10 1.5673 3.1984 1.69 56 | 2 2021-06-09 1.5412 3.1723 0.11 57 | 3 2021-06-08 1.5395 3.1706 -6.5 58 | 4 2021-06-07 1.6466 3.2777 1.61 59 | ... ... ... ... ... 60 | 1469 2015-06-08 1.0380 1.0380 2.5692 61 | 1470 2015-06-05 1.0120 1.0120 1.5045 62 | 1471 2015-06-04 0.9970 0.9970 -- 63 | 1472 2015-05-29 0.9950 0.9950 -- 64 | 1473 2015-05-27 1.0000 1.0000 -- 65 | 66 | """ 67 | 68 | data = { 69 | "FCODE": f"{fund_code}", 70 | "IsShareNet": "true", 71 | "MobileKey": "1", 72 | "appType": "ttjj", 73 | "appVersion": "6.2.8", 74 | "cToken": "1", 75 | "deviceid": "1", 76 | "pageIndex": "1", 77 | "pageSize": f"{pz}", 78 | "plat": "Iphone", 79 | "product": "EFund", 80 | "serverVersion": "6.2.8", 81 | "uToken": "1", 82 | "userId": "1", 83 | "version": "6.2.8", 84 | } 85 | url = "https://fundmobapi.eastmoney.com/FundMNewApi/FundMNHisNetList" 86 | json_response = fund_session.get( 87 | url, headers=EastmoneyFundHeaders, data=data, verify=False 88 | ).json() 89 | rows = [] 90 | columns = ["日期", "单位净值", "累计净值", "涨跌幅"] 91 | if json_response is None: 92 | return pd.DataFrame(rows, columns=columns) 93 | datas = json_response["Datas"] 94 | if len(datas) == 0: 95 | return pd.DataFrame(rows, columns=columns) 96 | rows = [] 97 | for stock in datas: 98 | date = stock["FSRQ"] 99 | rows.append( 100 | { 101 | "日期": date, 102 | "单位净值": stock["DWJZ"], 103 | "累计净值": stock["LJJZ"], 104 | "涨跌幅": stock["JZZZL"], 105 | } 106 | ) 107 | df = pd.DataFrame(rows) 108 | return df 109 | 110 | 111 | def get_quote_history_multi( 112 | fund_codes: List[str], pz: int = 40000, **kwargs 113 | ) -> Dict[str, pd.DataFrame]: 114 | dfs: Dict[str, pd.DataFrame] = {} 115 | pbar = tqdm(total=len(fund_codes)) 116 | 117 | @multitasking.task 118 | @retry(tries=3, delay=1) 119 | def start(fund_code: str): 120 | if len(multitasking.get_active_tasks()) >= MAX_CONNECTIONS: 121 | time.sleep(3) 122 | _df = get_quote_history(fund_code, pz) 123 | dfs[fund_code] = _df 124 | pbar.update(1) 125 | pbar.set_description_str(f"Processing => {fund_code}") 126 | 127 | for f in fund_codes: 128 | start(f) 129 | multitasking.wait_for_tasks() 130 | pbar.close() 131 | if kwargs.get(MagicConfig.RETURN_DF): 132 | return pd.concat(dfs, axis=0, ignore_index=True) 133 | return dfs 134 | 135 | 136 | @retry(tries=3) 137 | @to_numeric 138 | def get_realtime_increase_rate(fund_codes: Union[List[str], str]) -> pd.DataFrame: 139 | """ 140 | 获取基金实时估算涨跌幅度 141 | 142 | Parameters 143 | ---------- 144 | fund_codes : Union[List[str], str] 145 | 6 位基金代码或者 6 位基金代码构成的字符串列表 146 | 147 | Returns 148 | ------- 149 | DataFrame 150 | 单只或者多只基金实时估算涨跌情况 151 | 152 | Examples 153 | -------- 154 | >>> import efinance as ef 155 | >>> # 单只基金 156 | >>> ef.fund.get_realtime_increase_rate('161725') 157 | 基金代码 基金名称 最新净值 最新净值公开日期 估算时间 估算涨跌幅 158 | 0 161725 招商中证白酒指数(LOF)A 2.8856 2021-09-07 2021-09-07 15:00 0.64 159 | 160 | >>> # 多只基金 161 | >>> ef.fund.get_realtime_increase_rate(['161725','005827']) 162 | 基金代码 基金名称 最新净值 最新净值公开日期 估算时间 估算涨跌幅 163 | 0 161725 招商中证白酒指数(LOF)A 2.8856 2021-09-07 2021-09-07 15:00 0.64 164 | 1 005827 易方达蓝筹精选混合 2.5704 2021-09-07 2021-09-07 15:00 0.67 165 | 166 | """ 167 | 168 | if not isinstance(fund_codes, list): 169 | fund_codes = [fund_codes] 170 | data = { 171 | "pageIndex": "1", 172 | "pageSize": "300000", 173 | "Sort": "", 174 | "Fcodes": ",".join(fund_codes), 175 | "SortColumn": "", 176 | "IsShowSE": "false", 177 | "P": "F", 178 | "deviceid": "3EA024C2-7F22-408B-95E4-383D38160FB3", 179 | "plat": "Iphone", 180 | "product": "EFund", 181 | "version": "6.2.8", 182 | } 183 | columns = { 184 | "FCODE": "基金代码", 185 | "SHORTNAME": "基金名称", 186 | "ACCNAV": "最新净值", 187 | "PDATE": "最新净值公开日期", 188 | "GZTIME": "估算时间", 189 | "GSZZL": "估算涨跌幅", 190 | } 191 | url = "https://fundmobapi.eastmoney.com/FundMNewApi/FundMNFInfo" 192 | json_response = fund_session.get( 193 | url, headers=EastmoneyFundHeaders, data=data 194 | ).json() 195 | rows = jsonpath(json_response, "$..Datas[:]") 196 | if not rows: 197 | df = pd.DataFrame(columns=columns.values()) 198 | return df 199 | df = pd.DataFrame(rows).rename(columns=columns)[columns.values()] 200 | return df 201 | 202 | 203 | @retry(tries=3) 204 | def get_fund_codes(ft: str = None) -> pd.DataFrame: 205 | """ 206 | 获取天天基金网公开的全部公墓基金名单 207 | 208 | Parameters 209 | ---------- 210 | ft : str, optional 211 | 基金类型可选示例如下 212 | 213 | - ``'zq'`` : 债券类型基金 214 | - ``'gp'`` : 股票类型基金 215 | - ``'etf'`` : ETF 基金 216 | - ``'hh'`` : 混合型基金 217 | - ``'zs'`` : 指数型基金 218 | - ``'fof'`` : FOF 基金 219 | - ``'qdii'``: QDII 型基金 220 | - ``None`` : 全部 221 | 222 | Returns 223 | ------- 224 | DataFrame 225 | 天天基金网基金名单数据 226 | 227 | Examples 228 | -------- 229 | >>> import efinance as ef 230 | >>> # 全部类型的基金 231 | >>> ef.fund.get_fund_codes() 232 | >>> # 股票型基金 233 | >>> ef.fund.get_fund_codes(ft = 'gp') 234 | 基金代码 基金简称 235 | 0 003834 华夏能源革新股票 236 | 1 005669 前海开源公用事业股票 237 | 2 004040 金鹰医疗健康产业A 238 | 3 517793 1.20% 239 | 4 004041 金鹰医疗健康产业C 240 | ... ... ... 241 | 1981 012503 国泰中证环保产业50ETF联接A 242 | 1982 012517 国泰中证细分机械设备产业主题ETF联接C 243 | 1983 012600 中银内核驱动股票C 244 | 1984 011043 国泰价值先锋股票C 245 | 1985 012516 国泰中证细分机械设备产业主题ETF联接A 246 | 247 | """ 248 | params = [ 249 | ("op", "dy"), 250 | ("dt", "kf"), 251 | ("rs", ""), 252 | ("gs", "0"), 253 | ("sc", "qjzf"), 254 | ("st", "desc"), 255 | ("es", "0"), 256 | ("qdii", ""), 257 | ("pi", "1"), 258 | ("pn", "50000"), 259 | ("dx", "0"), 260 | ] 261 | 262 | headers = { 263 | "Connection": "keep-alive", 264 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 Edg/87.0.664.75", 265 | "Accept": "*/*", 266 | "Referer": "http://fund.eastmoney.com/data/fundranking.html", 267 | "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", 268 | } 269 | if ft is not None: 270 | params.append(("ft", ft)) 271 | 272 | url = "http://fund.eastmoney.com/data/rankhandler.aspx" 273 | response = fund_session.get(url, headers=headers, params=params) 274 | 275 | columns = ["基金代码", "基金简称"] 276 | results = re.findall('"(\d{6}),(.*?),', response.text) 277 | df = pd.DataFrame(results, columns=columns) 278 | return df 279 | 280 | 281 | @retry(tries=3) 282 | def get_fund_manager(ft: str) -> pd.DataFrame: 283 | url = f"http://fundf10.eastmoney.com/jjjl_{ft}.html" 284 | response = fund_session.get(url) 285 | if not response: 286 | return pd.DataFrame() 287 | html = response.text 288 | soup = BeautifulSoup(html, "html.parser") 289 | contents = soup.find("div", class_="bs_gl").find_all("label") 290 | start_date = contents[0].span.text 291 | managers = ";".join([a.text for a in contents[1].find_all("a")]) 292 | type_str = contents[2].span.text 293 | company = contents[3].find("a").text 294 | share = contents[4].span.text.replace("\r", "").replace("\n", "").replace(" ", "") 295 | return pd.DataFrame( 296 | data=[ 297 | [ 298 | ft, 299 | start_date, 300 | company, 301 | managers, 302 | type_str, 303 | share, 304 | str(pd.to_datetime("today").date()), 305 | ] 306 | ], 307 | columns=[ 308 | "基金代码", 309 | "基金经理任职日期", 310 | "基金公司", 311 | "基金经理", 312 | "基金种类", 313 | "基金规模", 314 | "当前日期", 315 | ], 316 | ) 317 | 318 | 319 | @retry(tries=3) 320 | @to_numeric 321 | def get_invest_position( 322 | fund_code: str, dates: Union[str, List[str]] = None 323 | ) -> pd.DataFrame: 324 | """ 325 | 获取基金持仓占比数据 326 | 327 | Parameters 328 | ---------- 329 | fund_code : str 330 | 基金代码 331 | dates : Union[str, List[str]], optional 332 | 日期或者日期构成的列表 333 | 可选示例如下 334 | 335 | - ``None`` : 最新公开日期 336 | - ``'2020-01-01'`` : 一个公开持仓日期 337 | - ``['2020-12-31' ,'2019-12-31']`` : 多个公开持仓日期 338 | 339 | 340 | Returns 341 | ------- 342 | DataFrame 343 | 基金持仓占比数据 344 | 345 | Examples 346 | -------- 347 | >>> import efinance as ef 348 | >>> # 获取最新公开的持仓数据 349 | >>> ef.fund.get_invest_position('161725') 350 | 基金代码 股票代码 股票简称 持仓占比 较上期变化 公开日期 351 | 0 161725 600519 贵州茅台 16.78 1.36 2022-03-31 352 | 1 161725 600809 山西汾酒 15.20 0.52 2022-03-31 353 | 2 161725 000568 泸州老窖 14.57 -0.89 2022-03-31 354 | 3 161725 000858 五粮液 12.83 -1.26 2022-03-31 355 | 4 161725 002304 洋河股份 11.58 0.91 2022-03-31 356 | 5 161725 603369 今世缘 3.75 -0.04 2022-03-31 357 | 6 161725 000799 酒鬼酒 3.40 -0.91 2022-03-31 358 | 7 161725 000596 古井贡酒 3.27 -0.24 2022-03-31 359 | 8 161725 600779 水井坊 2.59 -0.26 2022-03-31 360 | 9 161725 603589 口子窖 2.30 -0.38 2022-03-31 361 | >>> # 获取近 2 个公开持仓日数据 362 | >>> public_dates = ef.fund.get_public_dates('161725') 363 | >>> ef.fund.get_invest_position('161725',public_dates[:2]) 364 | 基金代码 股票代码 股票简称 持仓占比 较上期变化 公开日期 365 | 0 161725 600519 贵州茅台 16.78 1.36 2022-03-31 366 | 1 161725 600809 山西汾酒 15.20 0.52 2022-03-31 367 | 2 161725 000568 泸州老窖 14.57 -0.89 2022-03-31 368 | 3 161725 000858 五粮液 12.83 -1.26 2022-03-31 369 | 4 161725 002304 洋河股份 11.58 0.91 2022-03-31 370 | 5 161725 603369 今世缘 3.75 -0.04 2022-03-31 371 | 6 161725 000799 酒鬼酒 3.40 -0.91 2022-03-31 372 | 7 161725 000596 古井贡酒 3.27 -0.24 2022-03-31 373 | 8 161725 600779 水井坊 2.59 -0.26 2022-03-31 374 | 9 161725 603589 口子窖 2.30 -0.38 2022-03-31 375 | 10 161725 000568 泸州老窖 15.46 0.57 2021-12-31 376 | 11 161725 600519 贵州茅台 15.42 0.63 2021-12-31 377 | 12 161725 600809 山西汾酒 14.68 -1.72 2021-12-31 378 | 13 161725 000858 五粮液 14.09 0.87 2021-12-31 379 | 14 161725 002304 洋河股份 10.67 -1.34 2021-12-31 380 | 15 161725 000799 酒鬼酒 4.31 0.09 2021-12-31 381 | 16 161725 603369 今世缘 3.79 0.81 2021-12-31 382 | 17 161725 000596 古井贡酒 3.51 -0.69 2021-12-31 383 | 18 161725 600779 水井坊 2.85 -0.41 2021-12-31 384 | 19 161725 603589 口子窖 2.68 2.68 2021-12-31 385 | 386 | """ 387 | 388 | columns = { 389 | "GPDM": "股票代码", 390 | "GPJC": "股票简称", 391 | "JZBL": "持仓占比", 392 | "PCTNVCHG": "较上期变化", 393 | } 394 | df = pd.DataFrame(columns=columns.values()) 395 | if not isinstance(dates, List): 396 | dates = [dates] 397 | if dates is None: 398 | dates = [None] 399 | dfs: List[pd.DataFrame] = [] 400 | for date in dates: 401 | params = [ 402 | ("FCODE", fund_code), 403 | ("appType", "ttjj"), 404 | ("deviceid", "3EA024C2-7F22-408B-95E4-383D38160FB3"), 405 | ("plat", "Iphone"), 406 | ("product", "EFund"), 407 | ("serverVersion", "6.2.8"), 408 | ("version", "6.2.8"), 409 | ] 410 | if date is not None: 411 | params.append(("DATE", date)) 412 | url = "https://fundmobapi.eastmoney.com/FundMNewApi/FundMNInverstPosition" 413 | json_response = fund_session.get( 414 | url, headers=EastmoneyFundHeaders, params=params 415 | ).json() 416 | stocks = jsonpath(json_response, "$..fundStocks[:]") 417 | if not stocks: 418 | continue 419 | date = json_response["Expansion"] 420 | _df = pd.DataFrame(stocks) 421 | _df["公开日期"] = date 422 | _df.insert(0, "基金代码", fund_code) 423 | dfs.append(_df) 424 | fields = ["基金代码"] + list(columns.values()) + ["公开日期"] 425 | if not dfs: 426 | return pd.DataFrame(columns=fields) 427 | df = pd.concat(dfs, axis=0, ignore_index=True).rename(columns=columns)[fields] 428 | return df 429 | 430 | 431 | @retry(tries=3) 432 | @to_numeric 433 | def get_period_change(fund_code: str) -> pd.DataFrame: 434 | """ 435 | 获取基金阶段涨跌幅度 436 | 437 | Parameters 438 | ---------- 439 | fund_code : str 440 | 6 位基金代码 441 | 442 | Returns 443 | ------- 444 | DataFrame 445 | 指定基金的阶段涨跌数据 446 | 447 | Examples 448 | -------- 449 | >>> import efinance as ef 450 | >>> ef.fund.get_period_change('161725') 451 | 基金代码 收益率 同类平均 同类排行 同类总数 时间段 452 | 0 161725 -6.28 0.07 1408 1409 近一周 453 | 1 161725 10.85 5.82 178 1382 近一月 454 | 2 161725 25.32 7.10 20 1332 近三月 455 | 3 161725 22.93 10.39 79 1223 近六月 456 | 4 161725 103.76 33.58 7 1118 近一年 457 | 5 161725 166.59 55.42 9 796 近两年 458 | 6 161725 187.50 48.17 2 611 近三年 459 | 7 161725 519.44 61.62 1 389 近五年 460 | 8 161725 6.46 5.03 423 1243 今年以来 461 | 9 161725 477.00 成立以来 462 | """ 463 | 464 | params = ( 465 | ("AppVersion", "6.3.8"), 466 | ("FCODE", fund_code), 467 | ("MobileKey", "3EA024C2-7F22-408B-95E4-383D38160FB3"), 468 | ("OSVersion", "14.3"), 469 | ("deviceid", "3EA024C2-7F22-408B-95E4-383D38160FB3"), 470 | ("passportid", "3061335960830820"), 471 | ("plat", "Iphone"), 472 | ("product", "EFund"), 473 | ("version", "6.3.6"), 474 | ) 475 | url = "https://fundmobapi.eastmoney.com/FundMNewApi/FundMNPeriodIncrease" 476 | json_response = fund_session.get( 477 | url, headers=EastmoneyFundHeaders, params=params 478 | ).json() 479 | columns = { 480 | "syl": "收益率", 481 | "avg": "同类平均", 482 | "rank": "同类排行", 483 | "sc": "同类总数", 484 | "title": "时间段", 485 | } 486 | titles = { 487 | "Z": "近一周", 488 | "Y": "近一月", 489 | "3Y": "近三月", 490 | "6Y": "近六月", 491 | "1N": "近一年", 492 | "2Y": "近两年", 493 | "3N": "近三年", 494 | "5N": "近五年", 495 | "JN": "今年以来", 496 | "LN": "成立以来", 497 | } 498 | # 发行时间 499 | ESTABDATE = json_response["Expansion"]["ESTABDATE"] 500 | df = pd.DataFrame(json_response["Datas"]) 501 | 502 | df = df[list(columns.keys())].rename(columns=columns) 503 | df["时间段"] = titles.values() 504 | df.insert(0, "基金代码", fund_code) 505 | return df 506 | 507 | 508 | def get_public_dates(fund_code: str) -> List[str]: 509 | """ 510 | 获取历史上更新持仓情况的日期列表 511 | 512 | Parameters 513 | ---------- 514 | fund_code : str 515 | 6 位基金代码 516 | 517 | Returns 518 | ------- 519 | List[str] 520 | 指定基金公开持仓的日期列表 521 | 522 | Examples 523 | -------- 524 | >>> import efinance as ef 525 | >>> public_dates = ef.fund.get_public_dates('161725') 526 | >>> # 展示前 5 个 527 | >>> public_dates[:5] 528 | ['2021-03-31', '2021-01-08', '2020-12-31', '2020-09-30', '2020-06-30'] 529 | 530 | """ 531 | 532 | params = ( 533 | ("FCODE", fund_code), 534 | ("appVersion", "6.3.8"), 535 | ("deviceid", "3EA024C2-7F22-408B-95E4-383D38160FB3"), 536 | ("plat", "Iphone"), 537 | ("product", "EFund"), 538 | ("serverVersion", "6.3.6"), 539 | ("version", "6.3.8"), 540 | ) 541 | url = "https://fundmobapi.eastmoney.com/FundMNewApi/FundMNIVInfoMultiple" 542 | json_response = fund_session.get( 543 | url, headers=EastmoneyFundHeaders, params=params 544 | ).json() 545 | if json_response["Datas"] is None: 546 | return [] 547 | return json_response["Datas"] 548 | 549 | 550 | @retry(tries=3) 551 | @to_numeric 552 | def get_types_percentage( 553 | fund_code: str, dates: Union[List[str], str, None] = None 554 | ) -> pd.DataFrame: 555 | """ 556 | 获取指定基金不同类型占比信息 557 | 558 | Parameters 559 | ---------- 560 | fund_code : str 561 | 6 位基金代码 562 | dates : Union[List[str], str, None] 563 | 可选值类型示例如下(后面有获取 dates 的例子) 564 | 565 | - ``None`` : 最新公开日期 566 | - ``'2020-01-01'`` : 一个公开持仓日期 567 | - ``['2020-12-31' ,'2019-12-31']`` : 多个公开持仓日期 568 | 569 | 570 | Returns 571 | ------- 572 | DataFrame 573 | 指定基金的在不同日期的不同类型持仓占比信息 574 | 575 | Examples 576 | -------- 577 | >>> import efinance as ef 578 | >>> # 获取持仓公开日期 579 | >>> public_dates = ef.fund.get_public_dates('005827') 580 | >>> # 取前两个公开持仓日期 581 | >>> dates = public_dates[:2] 582 | >>> ef.fund.get_types_percentage('005827',dates) 583 | 基金代码 股票比重 债券比重 现金比重 总规模(亿元) 其他比重 584 | 0 005827 94.4 -- 6.06 880.1570625231 0 585 | 0 005827 94.09 -- 7.63 677.007455712 0 586 | 587 | """ 588 | 589 | columns = { 590 | "GP": "股票比重", 591 | "ZQ": "债券比重", 592 | "HB": "现金比重", 593 | "JZC": "总规模(亿元)", 594 | "QT": "其他比重", 595 | } 596 | df = pd.DataFrame(columns=columns.values()) 597 | if not isinstance(dates, List): 598 | dates = [dates] 599 | elif dates is None: 600 | dates = [None] 601 | for date in dates: 602 | params = [ 603 | ("FCODE", fund_code), 604 | ("OSVersion", "14.3"), 605 | ("appVersion", "6.3.8"), 606 | ("deviceid", "3EA024C2-7F21-408B-95E4-383D38160FB3"), 607 | ("plat", "Iphone"), 608 | ("product", "EFund"), 609 | ("serverVersion", "6.3.6"), 610 | ("version", "6.3.8"), 611 | ] 612 | if date is not None: 613 | params.append(("DATE", date)) 614 | params = tuple(params) 615 | url = "https://fundmobapi.eastmoney.com/FundMNewApi/FundMNAssetAllocationNew" 616 | json_response = fund_session.get( 617 | url, params=params, headers=EastmoneyFundHeaders 618 | ).json() 619 | 620 | if len(json_response["Datas"]) == 0: 621 | continue 622 | _df = pd.DataFrame(json_response["Datas"])[columns.keys()] 623 | _df = _df.rename(columns=columns) 624 | df = pd.concat([df, _df], axis=0, ignore_index=True) 625 | df.insert(0, "基金代码", fund_code) 626 | return df 627 | 628 | 629 | @retry(tries=3) 630 | @to_numeric 631 | def get_base_info_single(fund_code: str) -> pd.Series: 632 | """ 633 | 获取基金的一些基本信息 634 | 635 | Parameters 636 | ---------- 637 | fund_code : str 638 | 6 位基金代码 639 | 640 | Returns 641 | ------- 642 | Series 643 | 基金的一些基本信息 644 | """ 645 | 646 | params = ( 647 | ("FCODE", fund_code), 648 | ("deviceid", "3EA024C2-7F22-408B-95E4-383D38160FB3"), 649 | ("plat", "Iphone"), 650 | ("product", "EFund"), 651 | ("version", "6.3.8"), 652 | ) 653 | url = "https://fundmobapi.eastmoney.com/FundMNewApi/FundMNNBasicInformation" 654 | json_response = fund_session.get( 655 | url, headers=EastmoneyFundHeaders, params=params 656 | ).json() 657 | columns = { 658 | "FCODE": "基金代码", 659 | "SHORTNAME": "基金简称", 660 | "ESTABDATE": "成立日期", 661 | "RZDF": "涨跌幅", 662 | "DWJZ": "最新净值", 663 | "JJGS": "基金公司", 664 | "FSRQ": "净值更新日期", 665 | "COMMENTS": "简介", 666 | } 667 | items = json_response["Datas"] 668 | if not items: 669 | rich.print("基金代码", fund_code, "可能有误") 670 | return pd.Series(index=columns.values()) 671 | 672 | s = pd.Series(json_response["Datas"]).rename(index=columns)[columns.values()] 673 | 674 | s = s.apply(lambda x: x.replace("\n", " ").strip() if isinstance(x, str) else x) 675 | return s 676 | 677 | 678 | def get_base_info_muliti(fund_codes: List[str]) -> pd.Series: 679 | """ 680 | 获取多只基金基本信息 681 | 682 | Parameters 683 | ---------- 684 | fund_codes : List[str] 685 | 6 位基金代码列表 686 | 687 | Returns 688 | ------- 689 | Series 690 | 多只基金基本信息 691 | """ 692 | 693 | ss = [] 694 | 695 | @multitasking.task 696 | @retry(tries=3, delay=1) 697 | def start(fund_code: str) -> None: 698 | s = get_base_info_single(fund_code) 699 | ss.append(s) 700 | pbar.update() 701 | pbar.set_description(f"Processing => {fund_code}") 702 | 703 | pbar = tqdm(total=len(fund_codes)) 704 | for fund_code in fund_codes: 705 | start(fund_code) 706 | multitasking.wait_for_tasks() 707 | df = pd.DataFrame(ss) 708 | return df 709 | 710 | 711 | def get_base_info(fund_codes: Union[str, List[str]]) -> Union[pd.Series, pd.DataFrame]: 712 | """ 713 | 获取基金的一些基本信息 714 | 715 | Parameters 716 | ---------- 717 | fund_codes : Union[str, List[str]] 718 | 6 位基金代码 或多个 6 位 基金代码构成的列表 719 | 720 | Returns 721 | ------- 722 | Union[Series, DataFrame] 723 | 基金的一些基本信息 724 | 725 | - ``Series`` : 包含单只基金基本信息(当 ``fund_codes`` 是字符串时) 726 | - ``DataFrane`` : 包含多只股票基本信息(当 ``fund_codes`` 是字符串列表时) 727 | 728 | Raises 729 | ------ 730 | TypeError 731 | 当 fund_codes 类型不符合要求时 732 | 733 | Examples 734 | -------- 735 | >>> import efinance as ef 736 | >>> ef.fund.get_base_info('161725') 737 | 基金代码 161725 738 | 基金简称 招商中证白酒指数(LOF)A 739 | 成立日期 2015-05-27 740 | 涨跌幅 -6.03 741 | 最新净值 1.1959 742 | 基金公司 招商基金 743 | 净值更新日期 2021-07-30 744 | 简介 产品特色:布局白酒领域的指数基金,历史业绩优秀,外资偏爱白酒板块。 745 | dtype: object 746 | 747 | >>> # 获取多只基金基本信息 748 | >>> ef.fund.get_base_info(['161725','005827']) 749 | 基金代码 基金简称 成立日期 涨跌幅 最新净值 基金公司 净值更新日期 简介00:00, 6.38it/s] 750 | 0 005827 易方达蓝筹精选混合 2018-09-05 -2.98 2.4967 易方达基金 2021-07-30 明星消费基金经理另一力作,A+H股同步布局,价值投资典范,适合长期持有。 751 | 1 161725 招商中证白酒指数(LOF)A 2015-05-27 -6.03 1.1959 招商基金 2021-07-30 产品特色:布局白酒领域的指数基金,历史业绩优秀,外资偏爱白酒板块。 752 | 753 | """ 754 | 755 | if isinstance(fund_codes, str): 756 | return get_base_info_single(fund_codes) 757 | elif hasattr(fund_codes, "__iter__"): 758 | return get_base_info_muliti(fund_codes) 759 | raise TypeError(f"所给的 {fund_codes} 不符合参数要求") 760 | 761 | 762 | @to_numeric 763 | def get_industry_distribution( 764 | fund_code: str, dates: Union[str, List[str]] = None 765 | ) -> pd.DataFrame: 766 | """ 767 | 获取指定基金行业分布信息 768 | 769 | Parameters 770 | ---------- 771 | fund_code : str 772 | 6 位基金代码 773 | dates : Union[str, List[str]], optional 774 | 日期 775 | 可选示例如下 776 | 777 | - ``None`` : 最新公开日期 778 | - ``'2020-01-01'`` : 一个公开持仓日期 779 | - ``['2020-12-31' ,'2019-12-31']`` : 多个公开持仓日期 780 | 781 | Returns 782 | ------- 783 | DataFrame 784 | 指定基金行业持仓信息 785 | 786 | Examples 787 | -------- 788 | >>> import efinance as ef 789 | >>> # 获取持仓公开日期 790 | >>> public_dates = ef.fund.get_public_dates('161725') 791 | >>> # 取前一个公开持仓日期 792 | >>> dates = public_dates[:1] 793 | >>> ef.fund.get_industry_distribution('161725',dates) 794 | 0 161725 制造业 93.07 2021-06-30 6492580.019556 795 | 1 161725 金融业 0.01 2021-06-30 485.060688 796 | 2 161725 农、林、牧、渔业 0 2021-06-30 0.585078 797 | 3 161725 电力、热力、燃气及水生产和供应业 0 2021-06-30 1.302039 798 | 4 161725 建筑业 0 2021-06-30 2.537137 799 | 5 161725 批发和零售业 0 2021-06-30 5.888394 800 | 6 161725 信息传输、软件和信息技术服务业 0 2021-06-30 157.037536 801 | 7 161725 水利、环境和公共设施管理业 0 2021-06-30 4.443833 802 | 8 161725 教育 0 2021-06-30 1.626203 803 | 9 161725 科学研究和技术服务业 0 2021-06-30 48.30805 804 | 10 161725 采矿业 -- 2021-06-30 -- 805 | 11 161725 交通运输、仓储和邮政业 -- 2021-06-30 -- 806 | 12 161725 租赁和商务服务业 -- 2021-06-30 -- 807 | 13 161725 住宿和餐饮业 -- 2021-06-30 -- 808 | 14 161725 房地产业 -- 2021-06-30 -- 809 | 15 161725 居民服务、修理和其他服务业 -- 2021-06-30 -- 810 | 16 161725 卫生和社会工作 -- 2021-06-30 -- 811 | 17 161725 文化、体育和娱乐业 -- 2021-06-30 -- 812 | 18 161725 综合 -- 2021-06-30 -- 813 | 19 161725 合计 93.08 2021-06-30 6493286.808514 814 | 815 | """ 816 | 817 | columns = { 818 | "HYMC": "行业名称", 819 | "ZJZBL": "持仓比例", 820 | "FSRQ": "公布日期", 821 | "SZ": "市值", 822 | } 823 | df = pd.DataFrame(columns=columns.values()) 824 | if isinstance(dates, str): 825 | dates = [dates] 826 | elif dates is None: 827 | dates = [None] 828 | for date in dates: 829 | 830 | params = [ 831 | ("FCODE", fund_code), 832 | ("OSVersion", "14.4"), 833 | ("appVersion", "6.3.8"), 834 | ("deviceid", "3EA024C2-7F22-408B-95E4-383D38160FB3"), 835 | ("plat", "Iphone"), 836 | ("product", "EFund"), 837 | ("serverVersion", "6.3.6"), 838 | ("version", "6.3.8"), 839 | ] 840 | if date is not None: 841 | params.append(("DATE", date)) 842 | url = "https://fundmobapi.eastmoney.com/FundMNewApi/FundMNSectorAllocation" 843 | response = fund_session.get(url, headers=EastmoneyFundHeaders, params=params) 844 | datas = response.json()["Datas"] 845 | 846 | _df = pd.DataFrame(datas) 847 | _df = _df.rename(columns=columns) 848 | df = pd.concat([df, _df], axis=0, ignore_index=True) 849 | df.insert(0, "基金代码", fund_code) 850 | df = df.drop_duplicates() 851 | return df 852 | 853 | 854 | def get_pdf_reports(fund_code: str, max_count: int = 12, save_dir: str = "pdf") -> None: 855 | """ 856 | 根据基金代码获取其全部 pdf 报告 857 | 858 | Parameters 859 | ---------- 860 | fund_code : str 861 | 6 位基金代码 862 | max_count : int, optional 863 | 要获取的最大个数个 pdf (从最新的的开始数), 默认为 ``12`` 864 | save_dir : str, optional 865 | pdf 保存的文件夹路径, 默认为 ``'pdf'`` 866 | 867 | Examples 868 | -------- 869 | >>> import efinance as ef 870 | >>> # 获取基金代码为 161725 的基金最新的两个 pdf 报道文件 871 | >>> ef.fund.get_pdf_reports('161725',max_count = 2) 872 | 161725 的 pdf 文件已存储到文件夹 pdf/161725 中 873 | """ 874 | 875 | headers = { 876 | "Connection": "keep-alive", 877 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36 Edg/89.0.774.77", 878 | "Accept": "*/*", 879 | "Referer": "http://fundf10.eastmoney.com/", 880 | "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", 881 | } 882 | 883 | @multitasking.task 884 | @retry(tries=3, delay=1) 885 | def download_file( 886 | fund_code: str, url: str, filename: str, file_type=".pdf" 887 | ) -> None: 888 | """ 889 | 根据文件名、文件直链等参数下载文件 890 | 891 | Parameters 892 | ---------- 893 | fund_code : str 894 | 6 位基金代码 895 | url : str 896 | 下载连接 897 | filename : str 898 | 文件后缀名 899 | file_type : str, optional 900 | 文件类型, 默认为 '.pdf' 901 | """ 902 | 903 | pbar.set_description(f"Processing => {fund_code}") 904 | fund_code = str(fund_code) 905 | if not os.path.exists(save_dir + "/" + fund_code): 906 | os.mkdir(save_dir + "/" + fund_code) 907 | response = fund_session.get(url, headers=headers) 908 | path = f"{save_dir}/{fund_code}/{filename}{file_type}" 909 | with open(path, "wb") as f: 910 | f.write(response.content) 911 | if os.path.getsize(path) == 0: 912 | os.remove(path) 913 | return 914 | pbar.update(1) 915 | 916 | params = ( 917 | ("fundcode", fund_code), 918 | ("pageIndex", "1"), 919 | ("pageSize", "200000"), 920 | ("type", "3"), 921 | ) 922 | 923 | json_response = fund_session.get( 924 | "http://api.fund.eastmoney.com/f10/JJGG", headers=headers, params=params 925 | ).json() 926 | 927 | base_link = "http://pdf.dfcfw.com/pdf/H2_{}_1.pdf" 928 | 929 | pbar = tqdm(total=min(max_count, len(json_response["Data"]))) 930 | if not os.path.exists(save_dir): 931 | os.mkdir(save_dir) 932 | for item in json_response["Data"][-max_count:]: 933 | 934 | title = item["TITLE"] 935 | download_url = base_link.format(item["ID"]) 936 | download_file(fund_code, download_url, title) 937 | multitasking.wait_for_tasks() 938 | pbar.close() 939 | print(f"{fund_code} 的 pdf 文件已存储到文件夹 {save_dir}/{fund_code} 中") 940 | -------------------------------------------------------------------------------- /efinance/fund/utils.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Micro-sheep/efinance/495f76f6a68ffb35cc0927406db159d4224e89ba/efinance/fund/utils.py -------------------------------------------------------------------------------- /efinance/futures/__init__.py: -------------------------------------------------------------------------------- 1 | from .getter import ( 2 | get_deal_detail, 3 | get_futures_base_info, 4 | get_quote_history, 5 | get_realtime_quotes, 6 | ) 7 | 8 | __all__ = [ 9 | "get_futures_base_info", 10 | "get_quote_history", 11 | "get_realtime_quotes", 12 | "get_deal_detail", 13 | ] 14 | -------------------------------------------------------------------------------- /efinance/futures/config.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | HERE = Path(__file__).parent 4 | FUTURES_BASE_INFO_SAVE_PATH = HERE / "futures_info.csv" 5 | # K 线表头映射 6 | EASTMONEY_KLINE_FIELDS = { 7 | "f51": "日期", 8 | "f52": "开盘", 9 | "f53": "收盘", 10 | "f54": "最高", 11 | "f55": "最低", 12 | "f56": "成交量", 13 | "f57": "成交额", 14 | "f58": "振幅", 15 | "f59": "涨跌幅", 16 | "f60": "涨跌额", 17 | "f61": "换手率", 18 | } 19 | 20 | EASTMONEY_REQUEST_HEADERS = { 21 | "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko", 22 | "Accept": "*/*", 23 | "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", 24 | "Referer": "http://quote.eastmoney.com/center/gridlist.html", 25 | } 26 | -------------------------------------------------------------------------------- /efinance/futures/getter.py: -------------------------------------------------------------------------------- 1 | from typing import List, Union 2 | 3 | import pandas as pd 4 | 5 | from ..common import get_deal_detail as get_deal_detail_for_futures 6 | from ..common import get_quote_history as get_quote_history_for_futures 7 | from ..common import get_realtime_quotes_by_fs 8 | from ..common.config import FS_DICT 9 | from ..utils import process_dataframe_and_series 10 | 11 | 12 | def get_futures_base_info() -> pd.DataFrame: 13 | """ 14 | 获取四个交易所全部期货基本信息 15 | 16 | Returns 17 | ------- 18 | DataFrame 19 | 四个交易所全部期货一些基本信息 20 | 21 | Examples 22 | -------- 23 | >>> import efinance as ef 24 | >>> ef.futures.get_futures_base_info() 25 | 期货代码 期货名称 行情ID 市场类型 26 | 0 ZCM 动力煤主力 115.ZCM 郑商所 27 | 1 ZC201 动力煤201 115.ZC201 郑商所 28 | 2 jm 焦炭主力 114.jm 大商所 29 | 3 j2201 焦炭2201 114.j2201 大商所 30 | 4 jmm 焦煤主力 114.jmm 大商所 31 | .. ... ... ... ... 32 | 846 jm2109 焦煤2109 114.jm2109 大商所 33 | 847 071108 IH2108 8.071108 中金所 34 | 848 070131 IH次主力合约 8.070131 中金所 35 | 849 070120 IH当月连续 8.07012 中金所 36 | 850 lu2109 低硫燃油2109 142.lu2109 上海能源期货交易所 37 | 38 | Notes 39 | ----- 40 | 这里的 行情ID 主要作用是为使用函数 ``efinance.futures.get_quote_history`` 41 | 获取期货行情信息提供参数 42 | """ 43 | columns = ["期货代码", "期货名称", "行情ID", "市场类型"] 44 | df = get_realtime_quotes() 45 | df = df[columns] 46 | return df 47 | 48 | 49 | def get_quote_history( 50 | quote_ids: Union[str, List[str]], 51 | beg: str = "19000101", 52 | end: str = "20500101", 53 | klt: int = 101, 54 | fqt: int = 1, 55 | **kwargs 56 | ) -> pd.DataFrame: 57 | """ 58 | 获取期货历史行情信息 59 | 60 | Parameters 61 | ---------- 62 | quote_ids : Union[str, List[str]] 63 | 一个期货 或者多个期货 行情ID 构成的列表 64 | beg : str, optional 65 | 开始日期,默认为 ``'19000101'`` ,表示 1900年1月1日 66 | end : str, optional 67 | 结束日期,默认为 ``'20500101'`` ,表示 2050年1月1日 68 | klt : int, optional 69 | 行情之间的时间间隔,默认为 ``101`` ,可选示例如下 70 | 71 | - ``1`` : 分钟 72 | - ``5`` : 5 分钟 73 | - ``15`` : 15 分钟 74 | - ``30`` : 30 分钟 75 | - ``60`` : 60 分钟 76 | - ``101`` : 日 77 | - ``102`` : 周 78 | - ``103`` : 月 79 | 80 | fqt : int, optional 81 | 复权方式,默认为 ``1`` ,可选示例如下 82 | 83 | - ``0`` : 不复权 84 | - ``1`` : 前复权 85 | - ``2`` : 后复权 86 | 87 | Returns 88 | ------- 89 | Union[DataFrame, Dict[str, DataFrame]] 90 | 期货的 K 线数据 91 | 92 | - ``DataFrame`` : 当 ``secids`` 是 ``str`` 时 93 | - ``Dict[str, DataFrame]`` : 当 ``quote_ids`` 是 ``List[str]`` 时 94 | 95 | Examples 96 | -------- 97 | >>> import efinance as ef 98 | >>> # 获取全部期货行情ID列表 99 | >>> quote_ids = ef.futures.get_realtime_quotes()['行情ID'] 100 | >>> # 指定单个期货的行情ID(以上面获得到的行情ID列表为例) 101 | >>> quote_id = quote_ids[0] 102 | >>> # 查看第一个行情ID 103 | >>> quote_ids[0] 104 | '115.ZCM' 105 | >>> # 获取第行情ID为第一个的期货日 K 线数据 106 | >>> ef.futures.get_quote_history(quote_id) 107 | 期货代码 期货名称 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 108 | 0 ZCM 动力煤主力 2015-05-18 440.0 437.6 440.2 437.6 64 2.806300e+06 0.00 0.00 0.0 0.0 109 | 1 ZCM 动力煤主力 2015-05-19 436.0 437.0 437.6 436.0 6 2.621000e+05 0.36 -0.32 -1.4 0.0 110 | 2 ZCM 动力煤主力 2015-05-20 436.8 435.8 437.0 434.8 8 3.487500e+05 0.50 -0.23 -1.0 0.0 111 | 3 ZCM 动力煤主力 2015-05-21 438.0 443.2 446.8 437.8 37 1.631850e+06 2.06 1.65 7.2 0.0 112 | 4 ZCM 动力煤主力 2015-05-22 439.2 441.4 443.8 439.2 34 1.502500e+06 1.04 0.09 0.4 0.0 113 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... 114 | 1524 ZCM 动力煤主力 2021-08-17 755.0 770.8 776.0 750.6 82373 6.288355e+09 3.25 -1.26 -9.8 0.0 115 | 1525 ZCM 动力煤主力 2021-08-18 770.8 776.8 785.8 766.0 77392 6.016454e+09 2.59 1.76 13.4 0.0 116 | 1526 ZCM 动力煤主力 2021-08-19 776.8 777.6 798.0 764.6 97229 7.597474e+09 4.30 0.03 0.2 0.0 117 | 1527 ZCM 动力煤主力 2021-08-20 778.0 793.0 795.0 775.2 70549 5.553617e+09 2.53 1.48 11.6 0.0 118 | 1528 ZCM 动力煤主力 2021-08-23 796.8 836.6 843.8 796.8 82954 6.850341e+09 5.97 6.28 49.4 0.0 119 | 120 | >>> # 指定多个期货的 行情ID 121 | >>> quote_ids = ['115.ZCM','115.ZC109'] 122 | >>> futures_df = ef.futures.get_quote_history(quote_ids) 123 | >>> type(futures_df) 124 | 125 | >>> futures_df.keys() 126 | dict_keys(['115.ZC109', '115.ZCM']) 127 | >>> futures_df['115.ZCM'] 128 | 期货名称 期货代码 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 129 | 0 动力煤主力 ZCM 2015-05-18 440.0 437.6 440.2 437.6 64 2.806300e+06 0.00 0.00 0.0 0.0 130 | 1 动力煤主力 ZCM 2015-05-19 436.0 437.0 437.6 436.0 6 2.621000e+05 0.36 -0.32 -1.4 0.0 131 | 2 动力煤主力 ZCM 2015-05-20 436.8 435.8 437.0 434.8 8 3.487500e+05 0.50 -0.23 -1.0 0.0 132 | 3 动力煤主力 ZCM 2015-05-21 438.0 443.2 446.8 437.8 37 1.631850e+06 2.06 1.65 7.2 0.0 133 | 4 动力煤主力 ZCM 2015-05-22 439.2 441.4 443.8 439.2 34 1.502500e+06 1.04 0.09 0.4 0.0 134 | ... ... ... ... ... ... ... ... ... ... ... ... ... ... 135 | 1524 动力煤主力 ZCM 2021-08-17 755.0 770.8 776.0 750.6 82373 6.288355e+09 3.25 -1.26 -9.8 0.0 136 | 1525 动力煤主力 ZCM 2021-08-18 770.8 776.8 785.8 766.0 77392 6.016454e+09 2.59 1.76 13.4 0.0 137 | 1526 动力煤主力 ZCM 2021-08-19 776.8 777.6 798.0 764.6 97229 7.597474e+09 4.30 0.03 0.2 0.0 138 | 1527 动力煤主力 ZCM 2021-08-20 778.0 793.0 795.0 775.2 70549 5.553617e+09 2.53 1.48 11.6 0.0 139 | 1528 动力煤主力 ZCM 2021-08-23 796.8 836.6 843.8 796.8 82954 6.850341e+09 5.97 6.28 49.4 0.0 140 | 141 | """ 142 | df = get_quote_history_for_futures( 143 | quote_ids, beg=beg, end=end, klt=klt, fqt=fqt, quote_id_mode=True 144 | ) 145 | if isinstance(df, pd.DataFrame): 146 | 147 | df.rename(columns={"代码": "期货代码", "名称": "期货名称"}, inplace=True) 148 | elif isinstance(df, dict): 149 | for stock_code in df.keys(): 150 | df[stock_code].rename( 151 | columns={"代码": "期货代码", "名称": "期货名称"}, inplace=True 152 | ) 153 | # NOTE 扩展接口 设定此关键词即返回 DataFrame 而不是 dict 154 | if kwargs.get("return_df"): 155 | df: pd.DataFrame = pd.concat(df, axis=0, ignore_index=True) 156 | return df 157 | 158 | 159 | @process_dataframe_and_series(remove_columns_and_indexes=["市场编号"]) 160 | def get_realtime_quotes() -> pd.DataFrame: 161 | """ 162 | 获取期货最新行情总体情况 163 | 164 | Returns 165 | ------- 166 | DataFrame 167 | 期货市场的最新行情信息(涨跌幅、换手率等信息) 168 | 169 | Examples 170 | -------- 171 | >>> import efinance as ef 172 | >>> ef.futures.get_realtime_quotes() 173 | 期货代码 期货名称 涨跌幅 最新价 最高 最低 今开 涨跌额 换手率 量比 动态市盈率 成交量 成交额 昨日收盘 总市值 流通市值 行情ID 市场类型 174 | 0 ZCM 动力煤主力 6.28 836.6 843.8 796.8 796.8 49.4 - 2.82 - 82954 6850341376.0 793.0 - - 115.ZCM 郑商所 175 | 1 ZC201 动力煤201 6.28 836.6 843.8 796.8 796.8 49.4 - 2.82 - 82954 6850341376.0 793.0 - - 115.ZC201 郑商所 176 | 2 jm 焦炭主力 5.39 2980.0 2982.0 2833.0 2834.0 152.5 - 1.4 - 166433 48567923456.0 2830.5 - - 114.jm 大商所 177 | 3 j2201 焦炭2201 5.39 2980.0 2982.0 2833.0 2834.0 152.5 - 1.4 - 166433 48567923456.0 2830.5 - - 114.j2201 大商所 178 | 4 jmm 焦煤主力 5.0 2354.0 2360.0 2221.0 2221.0 112.0 - 1.42 - 238671 32924591872.0 2238.0 - - 114.jmm 大商所 179 | .. ... ... ... ... ... ... ... ... .. ... ... ... ... ... ... ... ... ... 180 | 846 jm2109 焦煤2109 -2.28 2748.0 2882.5 2688.0 2845.0 -64.0 - 1.85 - 34029 5656982528.0 2866.0 - - 114.jm2109 大商所 181 | 847 071108 IH2108 -2.52 3060.0 3130.0 3043.0 3111.2 -79.0 - 0.39 - 14384 13315567616.0 3139.2 918000 - 8.071108 中金所 182 | 848 070131 IH次主力合约 -2.52 3060.0 3130.0 3043.0 3111.2 -79.0 - 0.57 - 14384 13315567616.0 3139.2 918000 - 8.070131 中金所 183 | 849 070120 IH当月连续 -2.52 3060.0 3130.0 3043.0 3111.2 -79.0 - 0.39 - 14384 13315567616.0 3139.2 918000 - 8.070120 中金所 184 | 850 lu2109 低硫燃油2109 -3.79 3123.0 3127.0 3121.0 3121.0 -123.0 - - - 22 687420.0 3143.0 - - 142.lu2109 上海能源期货交易所 185 | 186 | Notes 187 | ----- 188 | 如果不记得行情ID,则可以调用函数 ``efinance.futures.get_realtime_quotes`` 获取 189 | 接着便可以使用函数 ``efinance.futures.get_quote_history`` 190 | 来获取期货 K 线数据 191 | 192 | """ 193 | fs = FS_DICT["futures"] 194 | df = get_realtime_quotes_by_fs(fs) 195 | df = df.rename(columns={"代码": "期货代码", "名称": "期货名称"}) 196 | return df 197 | 198 | 199 | def get_deal_detail(quote_id: str, max_count: int = 1000000) -> pd.DataFrame: 200 | """ 201 | 获取期货最新交易日成交明细 202 | 203 | Parameters 204 | ---------- 205 | quote_id : str 206 | 期货行情ID 207 | max_count : int, optional 208 | 最大返回条数, 默认为 ``1000000`` 209 | 210 | Returns 211 | ------- 212 | DataFrame 213 | 期货最新交易日成交明细 214 | 215 | Notes 216 | ----- 217 | 行情ID 格式参考 ``efinance.futures.get_futures_base_info`` 中得到的数据 218 | 219 | Examples 220 | -------- 221 | >>> import efinance as ef 222 | >>> ef.futures.get_deal_detail('115.ZCM',3) 223 | 期货名称 期货代码 时间 昨收 成交价 成交量 单数 224 | 0 动力煤主力 ZCM 21:00:00 0.0 879.0 23 0.0 225 | 1 动力煤主力 ZCM 21:00:00 0.0 879.0 0 -373.0 226 | 2 动力煤主力 ZCM 21:00:00 0.0 879.0 0 0.0 227 | 228 | """ 229 | df = get_deal_detail_for_futures(quote_id, max_count=max_count) 230 | df.rename(columns={"代码": "期货代码", "名称": "期货名称"}, inplace=True) 231 | return df 232 | -------------------------------------------------------------------------------- /efinance/futures/utils.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Micro-sheep/efinance/495f76f6a68ffb35cc0927406db159d4224e89ba/efinance/futures/utils.py -------------------------------------------------------------------------------- /efinance/shared/__init__.py: -------------------------------------------------------------------------------- 1 | import json 2 | from pathlib import Path 3 | from typing import Dict 4 | 5 | import pandas as pd 6 | import requests 7 | 8 | from ..config import SEARCH_RESULT_CACHE_PATH, MAX_CONNECTIONS 9 | 10 | 11 | class CustomedSession(requests.Session): 12 | def request(self, *args, **kwargs): 13 | kwargs.setdefault("timeout", 180) # 3min 14 | return super(CustomedSession, self).request(*args, **kwargs) 15 | 16 | 17 | session = CustomedSession() 18 | adapter = requests.adapters.HTTPAdapter( 19 | pool_connections=MAX_CONNECTIONS, pool_maxsize=MAX_CONNECTIONS, max_retries=5 20 | ) 21 | session.mount("http://", adapter) 22 | session.mount("https://", adapter) 23 | 24 | # 关键词搜索缓存 25 | SEARCH_RESULT_DICT: Dict[str, dict] = dict() 26 | # 行情ID搜索缓存 27 | BASE_INFO_CACHE: Dict[str, pd.Series] = dict() 28 | path = Path(SEARCH_RESULT_CACHE_PATH) 29 | if path.exists(): 30 | load_success = False 31 | with path.open("r", encoding="utf-8") as f: 32 | try: 33 | SEARCH_RESULT_DICT = json.load(f) 34 | load_success = True 35 | except: 36 | pass 37 | if not load_success: 38 | path.open("w").close() 39 | -------------------------------------------------------------------------------- /efinance/stock/__init__.py: -------------------------------------------------------------------------------- 1 | from .getter import ( 2 | get_all_company_performance, 3 | get_all_report_dates, 4 | get_base_info, 5 | get_belong_board, 6 | get_daily_billboard, 7 | get_deal_detail, 8 | get_history_bill, 9 | get_latest_holder_number, 10 | get_latest_ipo_info, 11 | get_latest_quote, 12 | get_members, 13 | get_quote_history, 14 | get_quote_snapshot, 15 | get_realtime_quotes, 16 | get_today_bill, 17 | get_top10_stock_holder_info, 18 | ) 19 | 20 | __all__ = [ 21 | "get_history_bill", 22 | "get_today_bill", 23 | "get_latest_quote", 24 | "get_quote_history", 25 | "get_realtime_quotes", 26 | "get_top10_stock_holder_info", 27 | "get_base_info", 28 | "get_all_report_dates", 29 | "get_all_company_performance", 30 | "get_latest_holder_number", 31 | "get_daily_billboard", 32 | "get_members", 33 | "get_latest_ipo_info", 34 | "get_quote_snapshot", 35 | "get_deal_detail", 36 | "get_belong_board", 37 | ] 38 | -------------------------------------------------------------------------------- /efinance/stock/config.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | HERE = Path(__file__).parent 4 | 5 | # 股票基本信息表头 6 | EASTMONEY_STOCK_BASE_INFO_FIELDS = { 7 | "f57": "股票代码", 8 | "f58": "股票名称", 9 | "f162": "市盈率(动)", 10 | "f167": "市净率", 11 | "f127": "所处行业", 12 | "f116": "总市值", 13 | "f117": "流通市值", 14 | "f198": "板块编号", 15 | "f173": "ROE", 16 | "f187": "净利率", 17 | "f105": "净利润", 18 | "f186": "毛利率", 19 | } 20 | 21 | EASTMONEY_STOCK_DAILY_BILL_BOARD_FIELDS = { 22 | "SECURITY_CODE": "股票代码", 23 | "SECURITY_NAME_ABBR": "股票名称", 24 | "TRADE_DATE": "上榜日期", 25 | "EXPLAIN": "解读", 26 | "CLOSE_PRICE": "收盘价", 27 | "CHANGE_RATE": "涨跌幅", 28 | "TURNOVERRATE": "换手率", 29 | "BILLBOARD_NET_AMT": "龙虎榜净买额", 30 | "BILLBOARD_BUY_AMT": "龙虎榜买入额", 31 | "BILLBOARD_SELL_AMT": "龙虎榜卖出额", 32 | "BILLBOARD_DEAL_AMT": "龙虎榜成交额", 33 | "ACCUM_AMOUNT": "市场总成交额", 34 | "DEAL_NET_RATIO": "净买额占总成交比", 35 | "DEAL_AMOUNT_RATIO": "成交额占总成交比", 36 | "FREE_MARKET_CAP": "流通市值", 37 | "EXPLANATION": "上榜原因", 38 | } 39 | -------------------------------------------------------------------------------- /efinance/stock/utils.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Micro-sheep/efinance/495f76f6a68ffb35cc0927406db159d4224e89ba/efinance/stock/utils.py -------------------------------------------------------------------------------- /efinance/utils/__init__.py: -------------------------------------------------------------------------------- 1 | import json 2 | import re 3 | import time 4 | from collections import OrderedDict, namedtuple 5 | from functools import wraps 6 | from typing import Any, Callable, Dict, List, TypeVar, Union 7 | 8 | import pandas as pd 9 | import rich 10 | from retry.api import retry 11 | 12 | from ..common.config import FS_DICT, MARKET_NUMBER_DICT, MagicConfig, MarketType 13 | from ..config import SEARCH_RESULT_CACHE_PATH 14 | from ..shared import SEARCH_RESULT_DICT, session 15 | 16 | # 函数变量 17 | F = TypeVar("F") 18 | 19 | 20 | def to_numeric(func: F) -> F: 21 | """ 22 | 将 DataFrame 或者 Series 尽可能地转为数字的装饰器 23 | 24 | Parameters 25 | ---------- 26 | func : Callable 27 | 返回结果为 DataFrame 或者 Series 的函数 28 | 29 | Returns 30 | ------- 31 | Union[DataFrame, Series] 32 | 33 | """ 34 | 35 | ignore = [ 36 | "股票代码", 37 | "基金代码", 38 | "代码", 39 | "市场类型", 40 | "市场编号", 41 | "债券代码", 42 | "行情ID", 43 | "正股代码", 44 | ] 45 | 46 | @wraps(func) 47 | def run(*args, **kwargs): 48 | values = func(*args, **kwargs) 49 | if isinstance(values, pd.DataFrame): 50 | for column in values.columns: 51 | if column not in ignore: 52 | 53 | values[column] = values[column].apply(convert) 54 | elif isinstance(values, pd.Series): 55 | for index in values.index: 56 | if index not in ignore: 57 | 58 | values[index] = convert(values[index]) 59 | return values 60 | 61 | def convert(o: Union[str, int, float]) -> Union[str, float, int]: 62 | if not re.findall("\d", str(o)): 63 | return o 64 | try: 65 | if str(o).isalnum(): 66 | o = int(o) 67 | else: 68 | o = float(o) 69 | except: 70 | pass 71 | return o 72 | 73 | return run 74 | 75 | 76 | # 存储证券代码的实体 77 | Quote = namedtuple( 78 | "Quote", 79 | [ 80 | "code", 81 | "name", 82 | "pinyin", 83 | "id", 84 | "jys", 85 | "classify", 86 | "market_type", 87 | "security_typeName", 88 | "security_type", 89 | "mkt_num", 90 | "type_us", 91 | "quote_id", 92 | "unified_code", 93 | "inner_code", 94 | ], 95 | ) 96 | 97 | 98 | @retry(tries=3, delay=1) 99 | def get_quote_id( 100 | stock_code: str, 101 | market_type: Union[MarketType, None] = None, 102 | use_local=True, 103 | suppress_error=False, 104 | **kwargs, 105 | ) -> str: 106 | """ 107 | 生成东方财富股票专用的行情ID 108 | 109 | Parameters 110 | ---------- 111 | stock_code : str 112 | 证券代码或者证券名称 113 | market_type : MarketType, optional 114 | 市场类型,目前可筛选A股,港股,美股和英股。默认不筛选 115 | use_local : bool, optional 116 | 是否使用本地缓存 117 | suppress_error : bool, optional 118 | 遇到错误的股票代码,是否不报错,返回空字符串 119 | 120 | Returns 121 | ------- 122 | str 123 | 东方财富股票专用的 secid 124 | """ 125 | if len(str(stock_code).strip()) == 0: 126 | if suppress_error: 127 | return "" 128 | raise Exception("证券代码应为长度不应为 0") 129 | quote = search_quote( 130 | stock_code, market_type=market_type, use_local=use_local, **kwargs 131 | ) 132 | if isinstance(quote, Quote): 133 | return quote.quote_id 134 | if quote is None: 135 | if not suppress_error: 136 | rich.print(f'证券代码 "{stock_code}" 可能有误') 137 | return "" 138 | 139 | 140 | def search_quote( 141 | keyword: str, 142 | market_type: Union[MarketType, None] = None, 143 | count: int = 1, 144 | use_local: bool = True, 145 | **kwargs, 146 | ) -> Union[Quote, None, List[Quote]]: 147 | """ 148 | 根据关键词搜索以获取证券信息 149 | 150 | Parameters 151 | ---------- 152 | keyword : str 153 | 搜索词(股票代码、债券代码甚至证券名称都可以) 154 | market_type : MarketType, optional 155 | 市场类型,目前可筛选A股,港股,美股和英股。默认不筛选 156 | count : int, optional 157 | 最多搜索结果数, 默认为 `1` 158 | use_local : bool, optional 159 | 是否使用本地缓存 160 | 161 | Returns 162 | ------- 163 | Union[Quote, None, List[Quote]] 164 | 165 | """ 166 | # NOTE 本地仅存储第一个搜索结果 167 | if use_local and count == 1: 168 | quote = search_quote_locally(keyword, market_type=market_type) 169 | if quote: 170 | return quote 171 | url = "https://searchapi.eastmoney.com/api/suggest/get" 172 | params = ( 173 | ("input", f"{keyword}"), 174 | ("type", "14"), 175 | ("token", "D43BF722C8E33BDC906FB84D85E326E8"), 176 | ("count", f"{max(count, 5)}"), 177 | ) 178 | try: 179 | json_response = session.get(url, params=params).json() 180 | items = json_response["QuotationCodeTable"]["Data"] 181 | except json.JSONDecodeError: 182 | RuntimeWarning( 183 | "unable to parse search quote result, consider if you are blocked" 184 | ) 185 | return None 186 | 187 | if items is not None and items: 188 | quotes = [ 189 | Quote(*item.values()) 190 | for item in items 191 | # 支持精确查找股票代码 192 | if ( 193 | not kwargs.get(MagicConfig.QUOTE_SYMBOL_MODE, False) 194 | or (keyword == item["Code"]) 195 | ) 196 | # 支持筛选股票市场 197 | and (market_type is None or (market_type.value == item["Classify"])) 198 | ] 199 | # NOTE 暂时仅存储第一个搜索结果 200 | save_search_result(keyword, quotes[:1]) 201 | if count == 1: 202 | return quotes[0] if len(quotes) >= 1 else None 203 | 204 | return quotes[:count] 205 | 206 | return None 207 | 208 | 209 | def search_quote_locally( 210 | keyword: str, market_type: Union[MarketType, None] = None 211 | ) -> Union[Quote, None]: 212 | """ 213 | 在本地里面使用搜索记录进行关键词搜索 214 | 215 | Parameters 216 | ---------- 217 | keyword : str 218 | 搜索词 219 | market_type : MarketType, optional 220 | 市场类型,目前可筛选A股,港股,美股和英股。默认不筛选 221 | 222 | Returns 223 | ------- 224 | Union[Quote,None] 225 | 226 | """ 227 | q = SEARCH_RESULT_DICT.get(keyword) 228 | # NOTE 兼容旧版本 给缓存加上最后修改时间 229 | if ( 230 | q is None 231 | or not q.get("last_time") 232 | or ( 233 | isinstance(market_type, MarketType) 234 | and (q.get("classify")) != (market_type.value) 235 | ) 236 | ): 237 | return None 238 | 239 | last_time: float = q["last_time"] 240 | # 缓存过期秒数 241 | max_ts = 3600 * 24 * 3 242 | now = time.time() 243 | # 缓存过期,在线搜索 244 | if (now - last_time) > max_ts: 245 | return None 246 | # NOTE 一定要拷贝 否则改变源对象 247 | _q = q.copy() 248 | # NOTE 一定要删除它 否则会构造错误 249 | del _q["last_time"] 250 | quote = Quote(**_q) 251 | return quote 252 | 253 | 254 | def save_search_result(keyword: str, quotes: List[Quote]): 255 | """ 256 | 存储搜索结果到文件中 257 | 258 | Parameters 259 | ---------- 260 | keyword : str 261 | 搜索词 262 | quotes : List[Quote] 263 | 搜索结果 264 | """ 265 | with open(SEARCH_RESULT_CACHE_PATH, "w", encoding="utf-8") as f: 266 | # TODO考虑如何存储多个搜索结果 267 | for quote in quotes: 268 | now = time.time() 269 | d = dict(quote._asdict()) 270 | d["last_time"] = now 271 | SEARCH_RESULT_DICT[keyword] = d 272 | break 273 | json.dump(SEARCH_RESULT_DICT.copy(), f) 274 | 275 | 276 | def rename_dataframe_and_series( 277 | fields: dict, to_be_removed: List[str] = [], keep_all: bool = True 278 | ): 279 | """ 280 | 重命名 DataFrame 和 Series 的列名的装饰器 281 | 282 | Parameters 283 | ---------- 284 | fields : dict 285 | 新的表头 286 | to_be_removed : List[str], optional 287 | 要移除的列, by default [] 288 | keep_all : bool, optional 289 | 是否保存全部列(包含未重命名的列), by default True 290 | """ 291 | 292 | def decorator(func): 293 | @wraps(func) 294 | def wrapper(*args, **kwargs): 295 | values = func(*args, **kwargs) 296 | if isinstance(values, pd.DataFrame): 297 | columns = list(fields.values()) 298 | if keep_all: 299 | for column in values.columns: 300 | if column not in columns: 301 | columns.append(column) 302 | values = values.rename(columns=fields)[columns] 303 | else: 304 | values = values.rename(columns=fields)[columns] 305 | for column in values: 306 | if column in to_be_removed: 307 | del values[column] 308 | elif isinstance(values, pd.Series): 309 | values = values.rename(fields) 310 | 311 | return values 312 | 313 | return wrapper 314 | 315 | return decorator 316 | 317 | 318 | def process_dataframe_and_series( 319 | function_fields: Dict[str, Callable] = dict(), 320 | remove_columns_and_indexes: List[str] = list(), 321 | ): 322 | """ 323 | 对 DataFrame 和 Series 进一步操作 324 | 325 | Parameters 326 | ---------- 327 | function_fields : Dict[str, Callable], optional 328 | 函数字典 329 | remove_columns_and_indexes : List[str], optional 330 | 需要删除的行或者列, by default list() 331 | """ 332 | 333 | def decorator(func): 334 | @wraps(func) 335 | def wrapper(*args, **kwargs): 336 | values = func(*args, **kwargs) 337 | if isinstance(values, pd.DataFrame): 338 | for column, function_name in function_fields.items(): 339 | if column not in values.columns: 340 | continue 341 | values[column] = values[column].apply(function_name) 342 | for column in remove_columns_and_indexes: 343 | if column in values.columns: 344 | del values[column] 345 | elif isinstance(values, pd.Series): 346 | for index in remove_columns_and_indexes: 347 | values = values.drop(index) 348 | return values 349 | 350 | return wrapper 351 | 352 | return decorator 353 | 354 | 355 | T = TypeVar("T") 356 | 357 | 358 | def to_type(f: Callable[[str], T], value: Any, default: T = None) -> T: 359 | """ 360 | 类型转换 361 | 362 | Parameters 363 | ---------- 364 | f : Callable[[str], T] 365 | 转换函数 366 | value : Any 367 | 待转换的值 368 | 369 | default : T, optional 370 | 转换失败时的返回值, 默认为 ``None`` 表示原样返回 371 | 372 | Returns 373 | ------- 374 | T 375 | 转换结果 376 | """ 377 | try: 378 | value = f(value) 379 | return value 380 | except: 381 | if default is None: 382 | return value 383 | return default 384 | 385 | 386 | def add_market( 387 | category: str, market_number: str, market_name: str, drop_duplicate: bool = True 388 | ) -> None: 389 | """ 390 | 添加市场 391 | 392 | Parameters 393 | ---------- 394 | category : str 395 | 市场类别 396 | market_number : str 397 | 市场编号 398 | market_name : str 399 | 市场名称 400 | drop_duplicate : bool, optional 401 | 是否去重, 默认为 ``True`` 402 | """ 403 | MARKET_NUMBER_DICT[market_number] = market_name 404 | old = FS_DICT.get(category, "") 405 | new = f"{old},m:{market_number}" 406 | if drop_duplicate: 407 | FS_DICT[category] = ",".join(OrderedDict.fromkeys(new.split(","))) 408 | else: 409 | FS_DICT[category] = new 410 | 411 | 412 | __all__ = [] 413 | -------------------------------------------------------------------------------- /examples/fund.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 导入库" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 3, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import efinance as ef" 17 | ] 18 | }, 19 | { 20 | "cell_type": "markdown", 21 | "metadata": {}, 22 | "source": [ 23 | "# 使用例子" 24 | ] 25 | }, 26 | { 27 | "cell_type": "markdown", 28 | "metadata": {}, 29 | "source": [ 30 | "### 获取单只基金基本信息" 31 | ] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": 2, 36 | "metadata": {}, 37 | "outputs": [ 38 | { 39 | "data": { 40 | "text/plain": [ 41 | "基金代码 161725\n", 42 | "基金简称 招商中证白酒指数(LOF)A\n", 43 | "成立日期 2015-05-27\n", 44 | "涨跌幅 0.8\n", 45 | "最新净值 1.2914\n", 46 | "基金公司 招商基金\n", 47 | "净值更新日期 2021-08-13\n", 48 | "简介 产品特色:布局白酒领域的指数基金,历史业绩优秀,外资偏爱白酒板块。\n", 49 | "dtype: object" 50 | ] 51 | }, 52 | "execution_count": 2, 53 | "metadata": {}, 54 | "output_type": "execute_result" 55 | } 56 | ], 57 | "source": [ 58 | "ef.fund.get_base_info('161725')" 59 | ] 60 | }, 61 | { 62 | "cell_type": "markdown", 63 | "metadata": {}, 64 | "source": [ 65 | "### 获取多只基金基本信息" 66 | ] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "execution_count": 3, 71 | "metadata": {}, 72 | "outputs": [ 73 | { 74 | "name": "stderr", 75 | "output_type": "stream", 76 | "text": [ 77 | "processing 161725: 100%|██████████| 2/2 [00:00<00:00, 7.45it/s]" 78 | ] 79 | }, 80 | { 81 | "data": { 82 | "text/html": [ 83 | "
\n", 84 | "\n", 97 | "\n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | "
基金代码基金简称成立日期涨跌幅最新净值基金公司净值更新日期简介
0005827易方达蓝筹精选混合2018-09-05-0.042.5887易方达基金2021-08-13明星消费基金经理另一力作,A+H股同步布局,价值投资典范,适合长期持有。
1161725招商中证白酒指数(LOF)A2015-05-270.801.2914招商基金2021-08-13产品特色:布局白酒领域的指数基金,历史业绩优秀,外资偏爱白酒板块。
\n", 136 | "
" 137 | ], 138 | "text/plain": [ 139 | " 基金代码 基金简称 成立日期 涨跌幅 最新净值 基金公司 净值更新日期 \\\n", 140 | "0 005827 易方达蓝筹精选混合 2018-09-05 -0.04 2.5887 易方达基金 2021-08-13 \n", 141 | "1 161725 招商中证白酒指数(LOF)A 2015-05-27 0.80 1.2914 招商基金 2021-08-13 \n", 142 | "\n", 143 | " 简介 \n", 144 | "0 明星消费基金经理另一力作,A+H股同步布局,价值投资典范,适合长期持有。 \n", 145 | "1 产品特色:布局白酒领域的指数基金,历史业绩优秀,外资偏爱白酒板块。 " 146 | ] 147 | }, 148 | "execution_count": 3, 149 | "metadata": {}, 150 | "output_type": "execute_result" 151 | } 152 | ], 153 | "source": [ 154 | "ef.fund.get_base_info(['161725','005827'])" 155 | ] 156 | }, 157 | { 158 | "cell_type": "markdown", 159 | "metadata": {}, 160 | "source": [ 161 | "### 获取基金历史净值信息" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": 4, 167 | "metadata": {}, 168 | "outputs": [ 169 | { 170 | "data": { 171 | "text/html": [ 172 | "
\n", 173 | "\n", 186 | "\n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | "
日期单位净值累计净值涨跌幅
02021-08-131.29142.92250.8
12021-08-121.28122.9123-1.73
22021-08-111.30382.9349-1.61
32021-08-101.32512.95626.48
42021-08-091.24452.87561.06
...............
15132015-06-081.03801.03802.5692
15142015-06-051.01201.01201.5045
15152015-06-040.99700.9970--
15162015-05-290.99500.9950--
15172015-05-271.00001.0000--
\n", 276 | "

1518 rows × 4 columns

\n", 277 | "
" 278 | ], 279 | "text/plain": [ 280 | " 日期 单位净值 累计净值 涨跌幅\n", 281 | "0 2021-08-13 1.2914 2.9225 0.8\n", 282 | "1 2021-08-12 1.2812 2.9123 -1.73\n", 283 | "2 2021-08-11 1.3038 2.9349 -1.61\n", 284 | "3 2021-08-10 1.3251 2.9562 6.48\n", 285 | "4 2021-08-09 1.2445 2.8756 1.06\n", 286 | "... ... ... ... ...\n", 287 | "1513 2015-06-08 1.0380 1.0380 2.5692\n", 288 | "1514 2015-06-05 1.0120 1.0120 1.5045\n", 289 | "1515 2015-06-04 0.9970 0.9970 --\n", 290 | "1516 2015-05-29 0.9950 0.9950 --\n", 291 | "1517 2015-05-27 1.0000 1.0000 --\n", 292 | "\n", 293 | "[1518 rows x 4 columns]" 294 | ] 295 | }, 296 | "execution_count": 4, 297 | "metadata": {}, 298 | "output_type": "execute_result" 299 | } 300 | ], 301 | "source": [ 302 | "ef.fund.get_quote_history('161725')" 303 | ] 304 | }, 305 | { 306 | "cell_type": "markdown", 307 | "metadata": {}, 308 | "source": [ 309 | "### 获取多只基金净值估算信息" 310 | ] 311 | }, 312 | { 313 | "cell_type": "code", 314 | "execution_count": 5, 315 | "metadata": {}, 316 | "outputs": [ 317 | { 318 | "data": { 319 | "text/html": [ 320 | "
\n", 321 | "\n", 334 | "\n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | "
基金代码基金名称PDATENAVACCNAVNAVCHGRTGSZ估算涨跌幅估算时间NEWPRICECHANGERATIOZJLHQDATEISHAVEREDPACKET
0161725招商中证白酒指数(LOF)A2021-08-131.29142.92250.801.29110.772021-08-13 15:001.2930.47-0.12392021-08-13 15:34:03False
1005827易方达蓝筹精选混合2021-08-132.58872.5887-0.042.5846-0.202021-08-13 15:00--------False
\n", 391 | "
" 392 | ], 393 | "text/plain": [ 394 | " 基金代码 基金名称 PDATE NAV ACCNAV NAVCHGRT GSZ \\\n", 395 | "0 161725 招商中证白酒指数(LOF)A 2021-08-13 1.2914 2.9225 0.80 1.2911 \n", 396 | "1 005827 易方达蓝筹精选混合 2021-08-13 2.5887 2.5887 -0.04 2.5846 \n", 397 | "\n", 398 | " 估算涨跌幅 估算时间 NEWPRICE CHANGERATIO ZJL HQDATE \\\n", 399 | "0 0.77 2021-08-13 15:00 1.293 0.47 -0.1239 2021-08-13 15:34:03 \n", 400 | "1 -0.20 2021-08-13 15:00 -- -- -- -- \n", 401 | "\n", 402 | " ISHAVEREDPACKET \n", 403 | "0 False \n", 404 | "1 False " 405 | ] 406 | }, 407 | "execution_count": 5, 408 | "metadata": {}, 409 | "output_type": "execute_result" 410 | } 411 | ], 412 | "source": [ 413 | "ef.fund.get_realtime_increase_rate(['161725','005827'])" 414 | ] 415 | }, 416 | { 417 | "cell_type": "markdown", 418 | "metadata": {}, 419 | "source": [ 420 | "### 获取单只基金最新季度公开持仓股票行业分布信息" 421 | ] 422 | }, 423 | { 424 | "cell_type": "code", 425 | "execution_count": 6, 426 | "metadata": {}, 427 | "outputs": [ 428 | { 429 | "data": { 430 | "text/html": [ 431 | "
\n", 432 | "\n", 445 | "\n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | " \n", 603 | " \n", 604 | " \n", 605 | " \n", 606 | " \n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | "
基金代码行业名称持仓比例公布日期市值
0161725制造业93.072021-06-306492580.019556
1161725金融业0.012021-06-30485.060688
2161725农、林、牧、渔业02021-06-300.585078
3161725电力、热力、燃气及水生产和供应业02021-06-301.302039
4161725建筑业02021-06-302.537137
5161725批发和零售业02021-06-305.888394
6161725信息传输、软件和信息技术服务业02021-06-30157.037536
7161725水利、环境和公共设施管理业02021-06-304.443833
8161725教育02021-06-301.626203
9161725科学研究和技术服务业02021-06-3048.30805
10161725采矿业--2021-06-30--
11161725交通运输、仓储和邮政业--2021-06-30--
12161725租赁和商务服务业--2021-06-30--
13161725住宿和餐饮业--2021-06-30--
14161725房地产业--2021-06-30--
15161725居民服务、修理和其他服务业--2021-06-30--
16161725卫生和社会工作--2021-06-30--
17161725文化、体育和娱乐业--2021-06-30--
18161725综合--2021-06-30--
19161725合计93.082021-06-306493286.808514
\n", 619 | "
" 620 | ], 621 | "text/plain": [ 622 | " 基金代码 行业名称 持仓比例 公布日期 市值\n", 623 | "0 161725 制造业 93.07 2021-06-30 6492580.019556\n", 624 | "1 161725 金融业 0.01 2021-06-30 485.060688\n", 625 | "2 161725 农、林、牧、渔业 0 2021-06-30 0.585078\n", 626 | "3 161725 电力、热力、燃气及水生产和供应业 0 2021-06-30 1.302039\n", 627 | "4 161725 建筑业 0 2021-06-30 2.537137\n", 628 | "5 161725 批发和零售业 0 2021-06-30 5.888394\n", 629 | "6 161725 信息传输、软件和信息技术服务业 0 2021-06-30 157.037536\n", 630 | "7 161725 水利、环境和公共设施管理业 0 2021-06-30 4.443833\n", 631 | "8 161725 教育 0 2021-06-30 1.626203\n", 632 | "9 161725 科学研究和技术服务业 0 2021-06-30 48.30805\n", 633 | "10 161725 采矿业 -- 2021-06-30 --\n", 634 | "11 161725 交通运输、仓储和邮政业 -- 2021-06-30 --\n", 635 | "12 161725 租赁和商务服务业 -- 2021-06-30 --\n", 636 | "13 161725 住宿和餐饮业 -- 2021-06-30 --\n", 637 | "14 161725 房地产业 -- 2021-06-30 --\n", 638 | "15 161725 居民服务、修理和其他服务业 -- 2021-06-30 --\n", 639 | "16 161725 卫生和社会工作 -- 2021-06-30 --\n", 640 | "17 161725 文化、体育和娱乐业 -- 2021-06-30 --\n", 641 | "18 161725 综合 -- 2021-06-30 --\n", 642 | "19 161725 合计 93.08 2021-06-30 6493286.808514" 643 | ] 644 | }, 645 | "execution_count": 6, 646 | "metadata": {}, 647 | "output_type": "execute_result" 648 | } 649 | ], 650 | "source": [ 651 | "\n", 652 | "ef.fund.get_industry_distribution('161725')" 653 | ] 654 | }, 655 | { 656 | "attachments": {}, 657 | "cell_type": "markdown", 658 | "metadata": {}, 659 | "source": [ 660 | "### 获取单只基金最近管理人及规模" 661 | ] 662 | }, 663 | { 664 | "cell_type": "code", 665 | "execution_count": 4, 666 | "metadata": {}, 667 | "outputs": [ 668 | { 669 | "data": { 670 | "text/html": [ 671 | "
\n", 672 | "\n", 685 | "\n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | "
基金代码基金经理任职日期基金公司基金经理基金种类基金规模当前日期
01617252015-05-27招商基金侯昊指数型-股票481.90亿元(截止至:2023-03-31)2023-04-22
\n", 711 | "
" 712 | ], 713 | "text/plain": [ 714 | " 基金代码 基金经理任职日期 基金公司 基金经理 基金种类 基金规模 当前日期\n", 715 | "0 161725 2015-05-27 招商基金 侯昊 指数型-股票 481.90亿元(截止至:2023-03-31) 2023-04-22" 716 | ] 717 | }, 718 | "execution_count": 4, 719 | "metadata": {}, 720 | "output_type": "execute_result" 721 | } 722 | ], 723 | "source": [ 724 | "ef.fund.get_fund_manager('161725')" 725 | ] 726 | }, 727 | { 728 | "cell_type": "markdown", 729 | "metadata": {}, 730 | "source": [ 731 | "# 更多使用例子详见文档 [efinance-docs](https://efinance.readthedocs.io/)\n" 732 | ] 733 | } 734 | ], 735 | "metadata": { 736 | "interpreter": { 737 | "hash": "e79309c8f6622ce988b04c24bb6d5b54a89cf65be865511eaf3b861e4b3f791f" 738 | }, 739 | "kernelspec": { 740 | "display_name": "Python 3.7.9 64-bit (system)", 741 | "name": "python3" 742 | }, 743 | "language_info": { 744 | "codemirror_mode": { 745 | "name": "ipython", 746 | "version": 3 747 | }, 748 | "file_extension": ".py", 749 | "mimetype": "text/x-python", 750 | "name": "python", 751 | "nbconvert_exporter": "python", 752 | "pygments_lexer": "ipython3", 753 | "version": "3.9.16" 754 | }, 755 | "metadata": { 756 | "interpreter": { 757 | "hash": "e79309c8f6622ce988b04c24bb6d5b54a89cf65be865511eaf3b861e4b3f791f" 758 | } 759 | }, 760 | "orig_nbformat": 2 761 | }, 762 | "nbformat": 4, 763 | "nbformat_minor": 2 764 | } 765 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["setuptools>=42", "wheel"] 3 | build-backend = "setuptools.build_meta" 4 | 5 | [project] 6 | name = "efinance" 7 | version = "0.5.5.2" 8 | description = "A finance tool to get stock,fund and futures data base on eastmoney" 9 | readme = "README.md" 10 | authors = [{ name = "micro sheep", email = "micro-sheep@outlook.com" }] 11 | license = { text = "MIT" } 12 | classifiers = [ 13 | "License :: OSI Approved :: MIT License", 14 | "Programming Language :: Python :: 3.6", 15 | "Programming Language :: Python :: 3.7", 16 | "Programming Language :: Python :: 3.8", 17 | "Programming Language :: Python :: 3.9", 18 | "Programming Language :: Python :: 3.10", 19 | "Programming Language :: Python :: 3.11", 20 | "Programming Language :: Python :: 3.12", 21 | ] 22 | keywords = ["finance", "quant", "stock", "fund", "futures"] 23 | dynamic = ["dependencies"] 24 | 25 | [project.urls] 26 | Homepage = "https://github.com/Micro-sheep/efinance" 27 | Documentation = "https://efinance.readthedocs.io" 28 | Source = "https://github.com/Micro-sheep/efinance" 29 | 30 | [tool.setuptools] 31 | packages = ["efinance"] 32 | 33 | [tool.setuptools.dynamic] 34 | dependencies = { file = ["requirements.txt"] } 35 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests 2 | tqdm 3 | pandas 4 | retry 5 | multitasking 6 | jsonpath 7 | rich 8 | beautifulsoup4 9 | -------------------------------------------------------------------------------- /tea.yaml: -------------------------------------------------------------------------------- 1 | # https://tea.xyz/what-is-this-file 2 | --- 3 | version: 1.0.1 4 | codeOwners: 5 | - '0x6A9695a318514529397d53f3C4cFeA6127568F43' 6 | - '0xA584AfdF834cBc22630a571e617248e1115073b3' 7 | quorum: 1 8 | -------------------------------------------------------------------------------- /tox.ini: -------------------------------------------------------------------------------- 1 | [tox] 2 | envlist = 3 | format 4 | ignore_basepython_conflict = true 5 | skipsdist = true 6 | 7 | [testenv] 8 | basepython = python3 9 | usedevelop = true 10 | deps = 11 | -r{toxinidir}/requirements.txt 12 | -r{toxinidir}/docs/requirements.txt 13 | 14 | [testenv:format] 15 | description = format the code with black and isort 16 | deps = 17 | black 18 | isort 19 | commands = 20 | black -S . 21 | isort . 22 | 23 | [isort] 24 | profile = black --------------------------------------------------------------------------------