databull 0.1.2__tar.gz → 0.1.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: databull
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: DataBull 中国 A 股市场数据 API 的 Python SDK(行情、财务、ETF、指数、板块、快讯)
5
5
  Author-email: Yc <yccheni@163.com>
6
6
  Project-URL: Homepage, https://www.databull.cn
@@ -42,7 +42,7 @@ pip install "databull[pandas]" # 需要 *_history / fear_greed 返回 DataFra
42
42
  国内直连 PyPI 慢时,可从官网下载 wheel 安装:
43
43
 
44
44
  ```bash
45
- pip install https://www.databull.cn/sdk/files/databull-0.1.2-py3-none-any.whl
45
+ pip install https://www.databull.cn/sdk/files/databull-0.1.4-py3-none-any.whl
46
46
  ```
47
47
 
48
48
  ## 快速开始
@@ -125,6 +125,9 @@ if not data["data"]["items"]:
125
125
  | 指数清单(分页/过滤) | `get_index_list` | `GET /cn/index/list` |
126
126
  | 指数搜索(相关度排序) | `search_index` | `GET /cn/index/search` |
127
127
  | 指数成分股与权重 | `get_index_constituents` | `GET /cn/index/constituents` |
128
+ | 美股指数历史行情(日/周/月线) | `get_us_index_history` | `GET /us/index/history` |
129
+ | 美股指数清单(分页/过滤) | `get_us_index_list` | `GET /us/index/list` |
130
+ | 美股指数搜索(相关度排序) | `search_us_index` | `GET /us/index/search` |
128
131
  | A股/ETF/指数标的清单 | `get_stock_list` | `GET /cn/stocks` |
129
132
  | 个股基本信息 | `get_stock_info` | `GET /cn/stock/info` |
130
133
  | 公司简介 | `get_company_profile` | `GET /cn/stock/profile` |
@@ -144,7 +147,6 @@ if not data["data"]["items"]:
144
147
  | 申万板块涨跌幅 | `get_sector_data` | `GET /cn/market/sector_data/{sw1,sw2,sw3}` |
145
148
  | 申万行业清单 | `get_sector_catalog` | `GET /cn/market/sector_catalog/{sw1,sw2,sw3}` |
146
149
  | 个股实时 Tick | `get_realtime` | `GET /cn/stock/tick` |
147
- | 全量 Tick 快照 | `get_tick_all` | `GET /cn/tick/tickall` |
148
150
  | 交易日历 | `get_trading_calendar` | `GET /cn/tick/trading_calendar` |
149
151
  | MCP 工具调用 | `call_mcp_tool` | `POST /mcp/call` |
150
152
 
@@ -17,7 +17,7 @@ pip install "databull[pandas]" # 需要 *_history / fear_greed 返回 DataFra
17
17
  国内直连 PyPI 慢时,可从官网下载 wheel 安装:
18
18
 
19
19
  ```bash
20
- pip install https://www.databull.cn/sdk/files/databull-0.1.2-py3-none-any.whl
20
+ pip install https://www.databull.cn/sdk/files/databull-0.1.4-py3-none-any.whl
21
21
  ```
22
22
 
23
23
  ## 快速开始
@@ -100,6 +100,9 @@ if not data["data"]["items"]:
100
100
  | 指数清单(分页/过滤) | `get_index_list` | `GET /cn/index/list` |
101
101
  | 指数搜索(相关度排序) | `search_index` | `GET /cn/index/search` |
102
102
  | 指数成分股与权重 | `get_index_constituents` | `GET /cn/index/constituents` |
103
+ | 美股指数历史行情(日/周/月线) | `get_us_index_history` | `GET /us/index/history` |
104
+ | 美股指数清单(分页/过滤) | `get_us_index_list` | `GET /us/index/list` |
105
+ | 美股指数搜索(相关度排序) | `search_us_index` | `GET /us/index/search` |
103
106
  | A股/ETF/指数标的清单 | `get_stock_list` | `GET /cn/stocks` |
104
107
  | 个股基本信息 | `get_stock_info` | `GET /cn/stock/info` |
105
108
  | 公司简介 | `get_company_profile` | `GET /cn/stock/profile` |
@@ -119,7 +122,6 @@ if not data["data"]["items"]:
119
122
  | 申万板块涨跌幅 | `get_sector_data` | `GET /cn/market/sector_data/{sw1,sw2,sw3}` |
120
123
  | 申万行业清单 | `get_sector_catalog` | `GET /cn/market/sector_catalog/{sw1,sw2,sw3}` |
121
124
  | 个股实时 Tick | `get_realtime` | `GET /cn/stock/tick` |
122
- | 全量 Tick 快照 | `get_tick_all` | `GET /cn/tick/tickall` |
123
125
  | 交易日历 | `get_trading_calendar` | `GET /cn/tick/trading_calendar` |
124
126
  | MCP 工具调用 | `call_mcp_tool` | `POST /mcp/call` |
125
127
 
@@ -44,7 +44,7 @@ from urllib3.util.retry import Retry
44
44
 
45
45
  #: SDK 版本。**唯一源**:pyproject.toml 通过 dynamic 从本属性读取,
46
46
  #: 不要再在别处硬编码版本号(testcase/test_databull_sdk.py 会校验一致性)。
47
- __version__ = "0.1.2"
47
+ __version__ = "0.1.4"
48
48
 
49
49
  __all__ = ["DataBull", "DataBullError", "__version__"]
50
50
 
@@ -490,7 +490,11 @@ class DataBull:
490
490
  end_date: str,
491
491
  report_type: str = "Balance",
492
492
  ):
493
- """个股财报:report_type ∈ Balance/Income/CashFlow/Capital。"""
493
+ """个股财报:report_type ∈ Balance/Income/CashFlow/PershareIndex。
494
+
495
+ 取值必须与库中完全一致(区分大小写)。传其他值会得到空数组 +
496
+ X-Empty-Reason: no_data_in_range(库里没有该类型的数据)。
497
+ """
494
498
  return self._request(
495
499
  "cn/stock/financial_data",
496
500
  params={
@@ -502,6 +506,54 @@ class DataBull:
502
506
  )
503
507
 
504
508
  # -------------------------- 美股 / 港股 --------------------------
509
+ def get_us_stock_list(
510
+ self,
511
+ q: Optional[str] = None,
512
+ exchange: Optional[str] = None,
513
+ page: int = 1,
514
+ page_size: int = 100,
515
+ ):
516
+ """美股股票列表(分页,按代码稳定排序)。
517
+
518
+ :param q: 搜索关键词,模糊匹配代码或名称(英文);留空返回全量
519
+ :param exchange: 交易所过滤 NYSE / NASDAQ / AMEX;留空不过滤
520
+ :param page: 页码,从 1 开始
521
+ :param page_size: 每页条数,1~500
522
+ :return: {'code': 0, 'data': {'items': [...], 'total': N, 'page': p, 'page_size': n, 'has_more': bool}}
523
+ """
524
+ params: Dict[str, Any] = {}
525
+ if q:
526
+ params["q"] = q
527
+ if exchange:
528
+ params["exchange"] = exchange
529
+ params["page"] = page
530
+ params["page_size"] = page_size
531
+ return self._request("us/stocks", params=params)
532
+
533
+ def get_hk_stock_list(
534
+ self,
535
+ q: Optional[str] = None,
536
+ exchange: Optional[str] = None,
537
+ page: int = 1,
538
+ page_size: int = 100,
539
+ ):
540
+ """港股股票列表(分页,按代码稳定排序)。
541
+
542
+ :param q: 搜索关键词,模糊匹配代码或名称(英文);留空返回全量
543
+ :param exchange: 交易所过滤 hkex;留空不过滤
544
+ :param page: 页码,从 1 开始
545
+ :param page_size: 每页条数,1~500
546
+ :return: {'code': 0, 'data': {'items': [...], 'total': N, 'page': p, 'page_size': n, 'has_more': bool}}
547
+ """
548
+ params: Dict[str, Any] = {}
549
+ if q:
550
+ params["q"] = q
551
+ if exchange:
552
+ params["exchange"] = exchange
553
+ params["page"] = page
554
+ params["page_size"] = page_size
555
+ return self._request("hk/stocks", params=params)
556
+
505
557
  def get_us_stock_info(self, symbol: str):
506
558
  """美股个股基本信息。"""
507
559
  return self._request("us/stock/info", params={"symbol": symbol})
@@ -542,6 +594,122 @@ class DataBull:
542
594
  )
543
595
  return self._to_dataframe(data.get("data") if isinstance(data, dict) else data)
544
596
 
597
+ # -------------------------- 美股指数 --------------------------
598
+ def get_us_index_history(
599
+ self,
600
+ index_code: str = "I:SPX",
601
+ start_date: str = "",
602
+ end_date: str = "",
603
+ period: str = "d",
604
+ as_dataframe: bool = True,
605
+ ):
606
+ """美股指数历史行情(标普500 / 纳斯达克100 / 道琼斯等),支持日线 / 周线 / 月线。
607
+
608
+ :param index_code: 指数代码,两种写法都接受——清单代码(``I:SPX``,与
609
+ :meth:`get_us_index_list` 返回的一致)或等价简称(``GSPC``)。
610
+ 带 ``.INDX`` 后缀(``GSPC.INDX``)会被自动剥离
611
+ :param start_date: 起始日,YYYY-MM-DD / YYYYMMDD 都可以;留空默认近 1 年
612
+ :param end_date: 结束日,同上;留空默认当日
613
+ :param period: K 线周期,``d`` 日线 / ``w`` 周线 / ``m`` 月线
614
+ :param as_dataframe: True 返回 DataFrame,False 返回原始 dict
615
+ :return: 默认带日期索引的 DataFrame;``as_dataframe=False`` 时返回
616
+ ``{'code': 0, 'data': {'index': {...}, 'period': 'd', 'count': N,
617
+ 'items': [...], 'data_scope': 'local'|'realtime'}}``
618
+
619
+ 可用代码:``GSPC`` 标普500、``NDX`` 纳斯达克100、``IXIC`` 纳斯达克综合、
620
+ ``DJI`` 道琼斯工业、``NYA`` 纽交所综合、``XAX`` 美国交易所综合、
621
+ ``SP400`` 标普中盘400、``SPXTR`` 标普500全收益、``OEX`` 标普100、
622
+ ``VIX`` 波动率指数、``DJT`` 道琼斯运输。传入其他代码会返回 404。
623
+
624
+ .. note::
625
+ 指数没有「成交额」概念,``amount`` 恒为 0;``change_amount`` /
626
+ ``chg_pct`` / ``amplitude`` 由相邻两根 K 线派生,区间第一根为 0。
627
+ """
628
+ payload = self._request(
629
+ "us/index/history",
630
+ params={
631
+ "index_code": index_code,
632
+ "start_date": start_date,
633
+ "end_date": end_date,
634
+ "period": period,
635
+ },
636
+ )
637
+ if not as_dataframe:
638
+ return payload
639
+ # data 可能是对象(正常)或列表/空(异常响应、空结果),
640
+ # 这里只认对象形态,取不到 items 就当空,绝不因结构不符而抛异常
641
+ data = payload.get("data") if isinstance(payload, dict) else None
642
+ items = data.get("items", []) if isinstance(data, dict) else []
643
+ return self._to_dataframe(items)
644
+
645
+ def get_us_index_list(
646
+ self,
647
+ q: Optional[str] = None,
648
+ category: Optional[str] = None,
649
+ quote_ready_only: bool = False,
650
+ page: int = 1,
651
+ page_size: int = 100,
652
+ ):
653
+ """美股指数清单(分页,按代码稳定排序)。
654
+
655
+ :param q: 关键词,模糊匹配代码或名称;留空返回全量
656
+ :param category: 分类过滤,``broad`` 宽基 / ``total_return`` 全收益 /
657
+ ``exchange`` 交易所 / ``volatility`` 波动率;留空不过滤
658
+ :param quote_ready_only: 只返回行情已验证可取的指数
659
+ :param page: 页码,从 1 开始
660
+ :param page_size: 每页条数,1~500
661
+ :return: ``{'code': 0, 'data': {'items': [...], 'total': N, 'page': p,
662
+ 'page_size': n, 'pages': k}}``;空结果额外带 ``empty_reason``
663
+ (catalog_not_synced / no_match / page_out_of_range)
664
+
665
+ .. warning::
666
+ **清单收录 ≠ 行情可取**。清单有 1.3 万条指数,但只有十来个能真正取到
667
+ 行情。每条的 ``quote_ready`` 字段标记行情是否可用(1 可用),
668
+ ``quote_symbol`` 是行情查询代码。用 :meth:`get_us_index_history`
669
+ 前建议先看这两个字段,或直接传 ``quote_ready_only=True``。
670
+ """
671
+ params: Dict[str, Any] = {
672
+ "page": page,
673
+ "page_size": page_size,
674
+ "quote_ready_only": str(bool(quote_ready_only)).lower(),
675
+ }
676
+ if q:
677
+ params["q"] = q
678
+ if category:
679
+ params["category"] = category
680
+ return self._request("us/index/list", params=params)
681
+
682
+ def search_us_index(
683
+ self,
684
+ keyword: str,
685
+ limit: int = 20,
686
+ category: Optional[str] = None,
687
+ quote_ready_only: bool = False,
688
+ ):
689
+ """按关键词搜索美股指数,按匹配相关度排序(适合输入框实时联想)。
690
+
691
+ 相关度:代码完全相等 > 代码后缀相等 > 代码前缀 > 名称完全相等 >
692
+ 名称前缀 > 名称包含。同时匹配清单代码(``I:SPX``)、简称(``GSPC``)与名称。
693
+
694
+ :param keyword: 搜索关键词(必填)
695
+ :param limit: 返回条数上限,1~100
696
+ :param category: 分类过滤 broad / total_return / exchange / volatility
697
+ :param quote_ready_only: 只返回行情已验证可取的指数
698
+ :return: ``{'code': 0, 'data': [...]}``;没搜到时 data 为空数组且
699
+ ``empty_reason=no_match``
700
+ :raises DataBullError: keyword 为空时(本地拦下,不发请求)
701
+ """
702
+ if not keyword or not str(keyword).strip():
703
+ raise DataBullError(0, "keyword 必填:请传指数代码或名称")
704
+ params: Dict[str, Any] = {
705
+ "keyword": keyword,
706
+ "limit": limit,
707
+ "quote_ready_only": str(bool(quote_ready_only)).lower(),
708
+ }
709
+ if category:
710
+ params["category"] = category
711
+ return self._request("us/index/search", params=params)
712
+
545
713
  # -------------------------- ETF --------------------------
546
714
  def get_etf_list(
547
715
  self,
@@ -635,14 +803,6 @@ class DataBull:
635
803
  f"{market}/stock/tick", params={"symbol": symbol, "tick_type": tick_type}
636
804
  )
637
805
 
638
- def get_tick_all(self, tick_type: str = "stock", market: str = "cn"):
639
- """全量 Tick 数据包。
640
-
641
- tick_type ∈ stock / etf / index —— 采集端按类型分别写入快照,
642
- 读取时必须带上类型,否则键不匹配会恒定拿到空对象。
643
- """
644
- return self._request(f"{market}/tick/tickall", params={"tick_type": tick_type})
645
-
646
806
  def get_trading_calendar(
647
807
  self,
648
808
  market: str = "cn",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: databull
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: DataBull 中国 A 股市场数据 API 的 Python SDK(行情、财务、ETF、指数、板块、快讯)
5
5
  Author-email: Yc <yccheni@163.com>
6
6
  Project-URL: Homepage, https://www.databull.cn
@@ -42,7 +42,7 @@ pip install "databull[pandas]" # 需要 *_history / fear_greed 返回 DataFra
42
42
  国内直连 PyPI 慢时,可从官网下载 wheel 安装:
43
43
 
44
44
  ```bash
45
- pip install https://www.databull.cn/sdk/files/databull-0.1.2-py3-none-any.whl
45
+ pip install https://www.databull.cn/sdk/files/databull-0.1.4-py3-none-any.whl
46
46
  ```
47
47
 
48
48
  ## 快速开始
@@ -125,6 +125,9 @@ if not data["data"]["items"]:
125
125
  | 指数清单(分页/过滤) | `get_index_list` | `GET /cn/index/list` |
126
126
  | 指数搜索(相关度排序) | `search_index` | `GET /cn/index/search` |
127
127
  | 指数成分股与权重 | `get_index_constituents` | `GET /cn/index/constituents` |
128
+ | 美股指数历史行情(日/周/月线) | `get_us_index_history` | `GET /us/index/history` |
129
+ | 美股指数清单(分页/过滤) | `get_us_index_list` | `GET /us/index/list` |
130
+ | 美股指数搜索(相关度排序) | `search_us_index` | `GET /us/index/search` |
128
131
  | A股/ETF/指数标的清单 | `get_stock_list` | `GET /cn/stocks` |
129
132
  | 个股基本信息 | `get_stock_info` | `GET /cn/stock/info` |
130
133
  | 公司简介 | `get_company_profile` | `GET /cn/stock/profile` |
@@ -144,7 +147,6 @@ if not data["data"]["items"]:
144
147
  | 申万板块涨跌幅 | `get_sector_data` | `GET /cn/market/sector_data/{sw1,sw2,sw3}` |
145
148
  | 申万行业清单 | `get_sector_catalog` | `GET /cn/market/sector_catalog/{sw1,sw2,sw3}` |
146
149
  | 个股实时 Tick | `get_realtime` | `GET /cn/stock/tick` |
147
- | 全量 Tick 快照 | `get_tick_all` | `GET /cn/tick/tickall` |
148
150
  | 交易日历 | `get_trading_calendar` | `GET /cn/tick/trading_calendar` |
149
151
  | MCP 工具调用 | `call_mcp_tool` | `POST /mcp/call` |
150
152
 
File without changes
File without changes
File without changes
File without changes
File without changes