==========
libfinance
==========
.. rst-class:: lang-switch
\[ `English `_ | 中文 \]
量化研究的结论依赖历史数据,而历史数据有三类常见的失真:证券代码会更名、复用,不同市场之间还会重号;财务报表在披露后会被修订,回测若读取最新版本,就用上了当时无从获得的信息;分红、拆股等公司行动改变价格的可比性,复权口径不一致会直接扭曲收益。研究与生产又常常分别使用 Python 与 C++,两套接口的细微差别会让同一策略在迁移后得到不同的结果。
``libfinance`` 是面向量化研究与回测的金融数据客户端,覆盖 A 股与美股,提供 Python 与 C++ 两种实现。它以统一的证券标识、按时点(point-in-time)的数据版本和逐事件计算的复权因子组织行情、证券目录、交易日历、公司行动、股本、财务、行业 / 指数 / 主题成分与日频因子等数据;两个市场、两种语言遵循同一份接口契约,调用方式一致,差异只来自数据本身。
数据设计的四条约定:
* **统一的证券标识符**\ :\ ``.``\ ,如 ``600000.XSHG``\ 、\ ``000001.XSHE``\ 、\ ``AAPL.US``\ 。
命名空间区分不同市场的同号代码,代码按历史时点解析,更名与代码复用不会串到别的证券。
* **point-in-time 机制 as_of**\ :按历史时点还原证券池、选取当时已披露的财务版本,避免未来信息与幸存者偏差。
* **高质量的复权因子 exfactor**\ :由公司行动逐事件计算,提供不复权、前复权、后复权三种口径;
``get_ex_factor`` 给出单次与累计因子,价格的每一次调整都可追溯。
* **Python 与 C++ 统一的函数设计**\ :两种客户端按同一份契约实现,函数名、参数顺序与默认值、校验与报错、
返回的列一一对应;同一组调用经两种客户端发给同一服务端逐项比对。
详见 :doc:`concepts/security_identifiers`\ 、\ :doc:`concepts/point_in_time`\ 、\ :doc:`concepts/exfactor` 与
:doc:`concepts/python_cpp`\ 。
教程:\ :doc:`tutorials/factor_development`\ 、\ :doc:`tutorials/classification`\ 。
.. code-block:: python
from libfinance import get_price
# 一次调用混查两个市场:代码自带市场
bars = get_price(["600000.XSHG", "AAPL.US"], "2024-03-01", "2024-03-05", adjust_type="none")
这次调用返回什么、怎样读,见 :doc:`getting_started/quickstart`\ 。
A 股与美股共用一套术语
==========================
统一体现在三个层面。
.. list-table::
:header-rows: 1
:widths: 22 46 32
* - 层面
- 统一的内容
- 例
* - 证券标识
- 写法都是 ``.``\ ;命名空间的粒度取决于该市场消除歧义所需的范围
- ``600000.XSHG``\ 、\ ``AAPL.US``
* - 函数与参数
- 两个市场调用同一组函数,参数名相同,\ ``as_of`` 与 ``adjust_type`` 的含义一致
- ``get_price``\ 、\ ``instruments``\ 、\ ``get_dividends``
* - 返回结构
- 列名与索引一致;某个市场不适用或未提供的字段取 ``NaN``\ ,不另设一张表
- 美股的 ``turnover``\ 、\ ``limit_up``\ 、\ ``limit_down``
需要显式指定市场的,只有不涉及具体证券的查询:交易日历、全市场目录、数据覆盖范围。
按证券查询时,命名空间已经给出了市场信息,列表里也可以混合两个市场的代码。
.. code-block:: python
from libfinance import instruments, get_trading_dates
instruments(["000001.XSHE", "AAPL.US"]) # 命名空间已给出市场
get_trading_dates("2024-01-01", "2024-01-31", market="us") # 不涉及具体证券
统一的是术语和调用约定,数据本身的差异依然存在:配股只有 A 股,分拆只有美股,主题目录(THS)只有
A 股;美股没有涨跌停,也没有提供成交额。
逐个接口的情况见 :doc:`howto/us_market`\ 。
这里有什么数据
==============
.. list-table::
:header-rows: 1
:widths: 22 12 30 36
* - 数据
- 市场
- 主要函数
- 说明
* - 交易日历
- CN · US
- :func:`~libfinance.get_trading_dates`
- 交易日、区间取日、前后推 N 个交易日
* - 证券主数据
- CN · US
- :func:`~libfinance.all_instruments`
- 代码、名称、类型、上市与退市日期
* - 日频行情
- CN · US
- :func:`~libfinance.get_price`
- 开高低收、成交量额,可复权
* - 复权因子
- CN · US
- :func:`~libfinance.get_ex_factor`
- 逐除权日的单次及累计因子
* - 股本结构
- CN · US
- :func:`~libfinance.get_shares`
- 逐交易日的总股本与流通股本
* - 分红 / 拆股 / 配股
- CN · US
- :func:`~libfinance.get_dividends`
- 除权事件,价格跳空的来源;配股只有 A 股
* - 分拆
- US
- :func:`~libfinance.get_spinoffs`
- A 股不产生这类事件
* - 财务报表(PIT)
- CN · US
- :func:`~libfinance.get_pit_financials_ex`
- 按季度取,带修订历史
* - 财务衍生指标
- CN · US
- :func:`~libfinance.get_financial_metrics`
- 按交易日的财务衍生指标
* - 行业分类
- CN · US
- :func:`~libfinance.get_instrument_industry`
- 申万、GICS 等分类体系;成员与权重见 :func:`~libfinance.get_industry_constituents`
* - 指数成分与权重
- CN · US
- :func:`~libfinance.get_index_constituents`
- 中证、标普等;权重见 :func:`~libfinance.get_index_weights`
* - 主题成分与权重
- CN
- :func:`~libfinance.get_theme_constituents`
- THS 主题;权重见 :func:`~libfinance.get_theme_weights`
* - 日频因子
- CN
- :func:`~libfinance.get_factor_exposure`
- alpha158、qlib,Barra CNE5 风格 / 行业因子,CNE5 与 CNE6 描述符;见 :doc:`data/factors` 与 :doc:`reference/factor_dictionary`
* - 实时行情
- CN
- :class:`~libfinance.subscribe.quote_api.QuoteApi`
- 订阅推送
覆盖到哪一年、更新到哪一天,取决于你连的那个服务。\ **不要照抄文档里的日期**\ ,用
:doc:`data/freshness` 里的两个函数自己查。
从哪里开始读
============
.. grid:: 1 1 3 3
:gutter: 3
.. grid-item-card:: 我只想取一段行情
:link: getting_started/quickstart
:link-type: doc
安装 → 连接 → 第一次查询。
然后看 :doc:`howto/price_panel`\ ,它把"取最近 N 个交易日"这件事里所有会踩的
坑走了一遍。
.. grid-item-card:: 我要做回测
:link: concepts/point_in_time
:link-type: doc
先读 :doc:`concepts/point_in_time` 与 :doc:`concepts/exfactor`\ 。
这两章决定了你的回测会不会用到当时还看不到的数字。
.. grid-item-card:: 我要实时行情
:link: data/realtime
:link-type: doc
实时快照与订阅推送是两条不同的路径,
:doc:`howto/subscribe` 给出可直接运行的订阅程序。
如果你已经在用了,遇到问题直接查 :doc:`howto/troubleshooting`——它按\ **症状**\ 编排:
你看到什么现象,就从哪一行开始。
两件事值得先知道
================
它们不是高级话题,是\ **默认行为**\ 。不知道的话,代码能跑,数字是错的。
.. dropdown:: 不传 ``adjust_type``\ ,你拿到的是前复权价
:color: warning
:icon: alert
同一只股票、同一天,前复权收盘价 8.81,未复权 10.49——差 16%。通过 ``adjust_type`` 显式选择价格口径。见 :doc:`data/price`\ 。
.. dropdown:: 财报会被追溯修订
:color: warning
:icon: alert
同一个 2024 年二季度的净利润,这个库里存着 5 个版本,最新一版发布于 2026 年。
回测里不传 ``as_of``\ ,你用的就是未来才存在的数字。见 :doc:`data/point_in_time`\ 。
.. toctree::
:maxdepth: 2
:caption: 开始使用
:hidden:
getting_started/installation
getting_started/quickstart
.. toctree::
:maxdepth: 1
:caption: 概念设计
:titlesonly:
:hidden:
concepts/security_identifiers
concepts/point_in_time
concepts/exfactor
concepts/python_cpp
.. toctree::
:maxdepth: 2
:caption: API 参考
:hidden:
reference/contracts
reference/market_data
reference/fundamentals
reference/classification
5 公司行动信息
6 实时行情
7 因子
.. toctree::
:maxdepth: 1
:caption: 字段与使用支持
:hidden:
reference/fields
reference/factor_dictionary
reference/index_meta
reference/industry_meta
reference/theme_meta
reference/errors
.. toctree::
:maxdepth: 1
:caption: 教程
:titlesonly:
:hidden:
tutorials/factor_development
tutorials/classification
.. toctree::
:maxdepth: 1
:caption: 关于
:hidden:
about/changelog
about/contributing
about/citing