Shortcuts

7 因子#

学术界和业界一直关心同一个问题:股票之间的异象(anomaly),或者说公司自身的属性(firm characteristic),能在多大程度上解释股票收益在截面上的差异。换一种说法:既然股票的未来收益可以看成 当前状态变量的函数,我们想知道的就是——哪些状态变量能预测股票的未来收益。这些状态变量在不同的地方有不同 的名字:特征(feature)、预测变量(predictor)、因子(factor)、alpha、指标(indicator)、决定因素 (determinant)。它们说的是同一件事。

—教程 因子,因子开发和评价

日频因子包括 qlib 与 alpha158 的量价因子,Barra CNE5 的风格、行业、国家因子,以及 CNE5、CNE6 的原始描述符。 因子名写全名:库 owner/library[@rev](展开为它的全部因子)或因子 owner/library/factor[@rev], 可以混在一次请求里;没有简称。start_date 与 end_date 相同时就是当天的截面。 各库的口径与计算方式见 因子数据,每个因子的公式与含义见 因子字典。

函数 / 类

解决的问题

get_factor_exposure()

按代码、日期区间读取因子暴露

list_factor_libraries()

有哪些因子库、各自的版本和因子数

list_factors()

一个库里有哪些因子

几个库的区别:

库

内容

system/qlib、system/alpha158

qlib 的价量因子;alpha158 是 qlib Alpha158 的 158 个因子(引用 system/qlib 的同名因子)

system/barra-cne5

10 个风格因子(SIZE、BETA、MOMENTUM、RESVOL、NLSIZE、BTOP、LIQUIDITY、EARNYILD、GROWTH、LEVERAGE)、 31 个申万一级行业哑变量、COUNTRY。风格因子是截面标准化后的暴露(流通市值加权均值 0、等权标准差 1), 读取时在 universe 上计算

system/barra-cne5-descriptor、system/barra-cne6-descriptor

Barra 原始描述符(LNCAP、BETA、STOM……),个股自身的时间序列,与 universe 无关

流量额度:不按档位裁剪日期或代码数。调用前按「代码 × 交易日 × 因子」估算应答大小,超过单次上限 512 MB 或今日剩余额度的请求直接拒绝(RpcError(code=1401)),见 因子数据。

get_factor_exposure — 按代码、日期区间读取因子暴露#

libfinance.get_factor_exposure(order_book_ids, factor_names, start_date, end_date, universe=None)[源代码]#

获取因子暴露。

参数
  • order_book_ids – 单个代码或代码列表

  • factor_names – 库名(如 "system/barra-cne5")或因子全名(如 "system/qlib/MA5"), 一个或一组,可以混合

  • start_date – 起始日期;与 end_date 相同时是当天的截面

  • end_date – 结束日期

  • universe – 截面因子的计算范围(代码列表);省略为当天全部 A 股。只影响截面因子

返回

pandas.DataFrame,以 (order_book_id, date) 为索引,每个因子一列,列名为因子全名 (库展开为 owner/library/factor)。

示例

1. Barra CNE5 风格因子:库名展开为 42 列(10 个风格、31 个行业、COUNTRY)

f = lf.get_factor_exposure(["600000.XSHG", "000001.XSHE"], "system/barra-cne5", "2026-09-07", "2026-09-10")
print(f.shape)
print(f.iloc[:, :10].rename(columns=lambda c: c.rsplit("/", 1)[1]).round(3))
输出#
(8, 42)
                           SIZE   BETA  MOMENTUM  RESVOL  NLSIZE   BTOP  LIQUIDITY  EARNYILD  GROWTH  LEVERAGE
order_book_id date                                                                                            
600000.XSHG   2026-09-07  1.466 -2.158    -0.892   0.270  -1.476  3.680     -2.495     4.225  -0.685     3.895
              2026-09-08  1.474 -2.151    -0.876   0.260  -1.475  3.672     -2.503     4.216  -0.679     3.896
              2026-09-09  1.469 -2.154    -0.897   0.270  -1.482  3.684     -2.496     4.222  -0.679     3.905
              2026-09-10  1.464 -2.152    -0.954   0.255  -1.485  3.682     -2.478     4.173  -0.680     3.896
000001.XSHE   2026-09-07  1.420 -1.936    -0.438  -0.762  -1.469  3.680     -1.710     4.353  -0.846     3.086
              2026-09-08  1.437 -1.932    -0.418  -0.737  -1.470  3.672     -1.715     4.342  -0.840     3.097
              2026-09-09  1.419 -1.935    -0.409  -0.730  -1.474  3.684     -1.712     4.350  -0.841     3.105
              2026-09-10  1.429 -1.934    -0.456  -0.723  -1.479  3.682     -1.699     4.299  -0.841     3.068
const auto f = lf::get_factor_exposure({"600000.XSHG", "000001.XSHE"}, "system/barra-cne5", "2026-09-07", "2026-09-10");
std::cout << f->num_rows() << " rows x " << f->num_columns() - 2 << " factors\n";
show(f->SelectColumns({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}).ValueOrDie(), 0);  // order_book_id, date, 10 styles
输出#
8 rows x 42 factors
order_book_id  date        system/barra-cne5/SIZE  system/barra-cne5/BETA  system/barra-cne5/MOMENTUM  system/barra-cne5/RESVOL  system/barra-cne5/NLSIZE  system/barra-cne5/BTOP  system/barra-cne5/LIQUIDITY  system/barra-cne5/EARNYILD  system/barra-cne5/GROWTH  system/barra-cne5/LEVERAGE
600000.XSHG    2026-09-07  1.466282                -2.157793               -0.891617                   0.270285                  -1.476277                 3.679871                -2.495109                    4.224588                    -0.684836                 3.894874
600000.XSHG    2026-09-08  1.473904                -2.150934               -0.875787                   0.260453                  -1.474581                 3.672298                -2.502964                    4.215625                    -0.678987                 3.896418
600000.XSHG    2026-09-09  1.469355                -2.153597               -0.896680                   0.269552                  -1.481582                 3.684458                -2.495817                    4.222175                    -0.679277                 3.904802
600000.XSHG    2026-09-10  1.463998                -2.152061               -0.953517                   0.254907                  -1.484850                 3.682087                -2.478461                    4.172697                    -0.679655                 3.895869
000001.XSHE    2026-09-07  1.420016                -1.936313               -0.438099                   -0.761788                 -1.468745                 3.679871                -1.709550                    4.352623                    -0.846074                 3.085660
000001.XSHE    2026-09-08  1.436537                -1.931869               -0.417630                   -0.737101                 -1.469791                 3.672298                -1.714808                    4.342318                    -0.840224                 3.097376
000001.XSHE    2026-09-09  1.419413                -1.934573               -0.409014                   -0.730437                 -1.473595                 3.684458                -1.711973                    4.350358                    -0.840513                 3.105194
000001.XSHE    2026-09-10  1.429442                -1.933636               -0.456308                   -0.722677                 -1.479236                 3.682087                -1.698563                    4.298957                    -0.840890                 3.067905
[8 rows x 12 columns]

2. 原始描述符与标准化后的风格因子混在一次请求里

print(lf.get_factor_exposure(["600000.XSHG", "600519.XSHG"],
                             ["system/barra-cne5-descriptor/LNCAP", "system/barra-cne5/SIZE", "system/barra-cne5/BANKS"],
                             "2026-09-10", "2026-09-10"))
输出#
                          system/barra-cne5-descriptor/LNCAP  system/barra-cne5/SIZE  system/barra-cne5/BANKS
order_book_id date                                                                                           
600000.XSHG   2026-09-10                           26.464375                1.463998                      1.0
600519.XSHG   2026-09-10                           28.105089                1.463998                      0.0
show(lf::get_factor_exposure({"600000.XSHG", "600519.XSHG"},
                             {"system/barra-cne5-descriptor/LNCAP", "system/barra-cne5/SIZE", "system/barra-cne5/BANKS"},
                             "2026-09-10", "2026-09-10"), 0);
输出#
order_book_id  date        system/barra-cne5-descriptor/LNCAP  system/barra-cne5/SIZE  system/barra-cne5/BANKS
600000.XSHG    2026-09-10  26.464375                           1.463998                1
600519.XSHG    2026-09-10  28.105089                           1.463998                0
[2 rows x 5 columns]

3. universe:截面因子在给定的代码上重新标准化,时序因子不变

banks = ["600000.XSHG", "000001.XSHE", "601398.XSHG", "601288.XSHG", "600036.XSHG"]
print(lf.get_factor_exposure(["600000.XSHG", "000001.XSHE"], ["system/barra-cne5/SIZE", "system/barra-cne5-descriptor/LNCAP"],
                             "2026-09-10", "2026-09-10", universe=banks))
输出#
                          system/barra-cne5/SIZE  system/barra-cne5-descriptor/LNCAP
order_book_id date                                                                  
600000.XSHG   2026-09-10               -1.061550                           26.464375
000001.XSHE   2026-09-10               -1.323651                           26.161171
const lf::Codes banks = {"600000.XSHG", "000001.XSHE", "601398.XSHG", "601288.XSHG", "600036.XSHG"};
show(lf::get_factor_exposure({"600000.XSHG", "000001.XSHE"},
                             {"system/barra-cne5/SIZE", "system/barra-cne5-descriptor/LNCAP"}, "2026-09-10",
                             "2026-09-10", banks), 0);
输出#
order_book_id  date        system/barra-cne5/SIZE  system/barra-cne5-descriptor/LNCAP
600000.XSHG    2026-09-10  -1.061550               26.464375
000001.XSHE    2026-09-10  -1.323651               26.161171
[2 rows x 4 columns]

4. alpha158:当天的截面

print(lf.get_factor_exposure(["600000.XSHG", "000001.XSHE", "600519.XSHG"],
                             ["system/alpha158/KMID", "system/alpha158/ROC5", "system/alpha158/STD20"], "2026-09-10", "2026-09-10"))
输出#
                          system/alpha158/KMID  system/alpha158/ROC5  system/alpha158/STD20
order_book_id date                                                                         
600000.XSHG   2026-09-10              0.014100              0.991444               0.013712
000001.XSHE   2026-09-10              0.014555              1.002532               0.023610
600519.XSHG   2026-09-10             -0.004547              1.010699               0.011705
show(lf::get_factor_exposure({"600000.XSHG", "000001.XSHE", "600519.XSHG"},
                             {"system/alpha158/KMID", "system/alpha158/ROC5", "system/alpha158/STD20"}, "2026-09-10",
                             "2026-09-10"), 0);
输出#
order_book_id  date        system/alpha158/KMID  system/alpha158/ROC5  system/alpha158/STD20
600000.XSHG    2026-09-10  0.014100              0.991444              0.013712
000001.XSHE    2026-09-10  0.014555              1.002532              0.023610
600519.XSHG    2026-09-10  -0.004547             1.010699              0.011705
[3 rows x 5 columns]

输出由 docs/_shared/update_examples.py 运行示例脚本生成:数据版本 sha256:6feda8ca,2026-10-09。 下载示例脚本: 11_factors.cpp · 11_factors.py

结果解读:两只都是大盘银行股,SIZE 约 +1.45、BETA 约 −2、BTOP 与 LEVERAGE 很高,行业只有 BANKS 为 1。 600000.XSHG 与 600519.XSHG 的 SIZE 相同:两者的 LNCAP 都超过全市场 3 倍标准差,缩尾到同一个上界后再标准化—— 这是 Barra 的缩尾处理,最大的几只股票的 SIZE 相同。传入 universe 后 SIZE 在这几只银行股里重新标准化 (于是变成负值),LNCAP 是时序因子,不变。

list_factor_libraries — 有哪些因子库#

libfinance.list_factor_libraries()[源代码]#

列出因子库。

返回

pandas.DataFrame,列为 name(库名)、version(当前版本)、factors(因子数)、description。

示例

1. 因子库一览

print(lf.list_factor_libraries())
输出#
                           name version  factors                                        description
0               system/alpha158  v1.0.0      158  Qlib Alpha158: the 158 fields of qlib/contrib/...
1             system/barra-cne5  v2.0.0       42                                                   
2  system/barra-cne5-descriptor  v1.0.0       17                                                   
3             system/barra-cne6  v1.0.0       36                                                   
4  system/barra-cne6-descriptor  v1.0.0       36                                                   
5                   system/qlib  v1.0.0      158                                                   
show(lf::list_factor_libraries(), 0);
输出#
name                          version  factors  description
system/alpha158               v1.0.0   158      Qlib Alpha158: the 158 fields of qlib/contrib/data/loader.py (commit d5379c5), in Qlib order; each refers to its system/qlib factor.
system/barra-cne5             v2.0.0   42       
system/barra-cne5-descriptor  v1.0.0   17       
system/barra-cne6             v1.0.0   36       
system/barra-cne6-descriptor  v1.0.0   36       
system/qlib                   v1.0.0   158      
[6 rows x 4 columns]

输出由 docs/_shared/update_examples.py 运行示例脚本生成:数据版本 sha256:6feda8ca,2026-10-09。 下载示例脚本: 11_factors.cpp · 11_factors.py

list_factors — 一个库里有哪些因子#

libfinance.list_factors(library=None)[源代码]#

列出因子全名。

参数

library – 库名,如 "system/barra-cne5";省略为全部库

返回

带版本的因子全名列表,如 ["system/barra-cne5/SIZE@v2.0.0", ...];去掉 @版本 即读取当前版本

示例

1. 一个库里的因子全名

print(lf.list_factors("system/barra-cne5")[:12])
输出#
['system/barra-cne5/SIZE@v2.0.0', 'system/barra-cne5/BETA@v2.0.0', 'system/barra-cne5/MOMENTUM@v2.0.0', 'system/barra-cne5/RESVOL@v2.0.0', 'system/barra-cne5/NLSIZE@v2.0.0', 'system/barra-cne5/BTOP@v2.0.0', 'system/barra-cne5/LIQUIDITY@v2.0.0', 'system/barra-cne5/EARNYILD@v2.0.0', 'system/barra-cne5/GROWTH@v2.0.0', 'system/barra-cne5/LEVERAGE@v2.0.0', 'system/barra-cne5/AGRICULTURE@v2.0.0', 'system/barra-cne5/BASIC_CHEMICALS@v2.0.0']
const auto names = lf::list_factors("system/barra-cne5");
show(lf::Json(std::vector<std::string>(names.begin(), names.begin() + std::min<size_t>(12, names.size()))));
输出#
[
  "system/barra-cne5/SIZE@v2.0.0",
  "system/barra-cne5/BETA@v2.0.0",
  "system/barra-cne5/MOMENTUM@v2.0.0",
  "system/barra-cne5/RESVOL@v2.0.0",
  "system/barra-cne5/NLSIZE@v2.0.0",
  "system/barra-cne5/BTOP@v2.0.0",
  "system/barra-cne5/LIQUIDITY@v2.0.0",
  "system/barra-cne5/EARNYILD@v2.0.0",
  "system/barra-cne5/GROWTH@v2.0.0",
  "system/barra-cne5/LEVERAGE@v2.0.0",
  "system/barra-cne5/AGRICULTURE@v2.0.0",
  "system/barra-cne5/BASIC_CHEMICALS@v2.0.0"
]

输出由 docs/_shared/update_examples.py 运行示例脚本生成:数据版本 sha256:6feda8ca,2026-10-09。 下载示例脚本: 11_factors.cpp · 11_factors.py