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 相同时就是当天的截面。
各库的口径与计算方式见 因子数据,每个因子的公式与含义见 因子字典。
函数 / 类 |
解决的问题 |
|---|---|
按代码、日期区间读取因子暴露 |
|
有哪些因子库、各自的版本和因子数 |
|
一个库里有哪些因子 |
几个库的区别:
库 |
内容 |
|---|---|
|
qlib 的价量因子;alpha158 是 qlib Alpha158 的 158 个因子(引用 |
|
10 个风格因子(SIZE、BETA、MOMENTUM、RESVOL、NLSIZE、BTOP、LIQUIDITY、EARNYILD、GROWTH、LEVERAGE)、
31 个申万一级行业哑变量、COUNTRY。风格因子是截面标准化后的暴露(流通市值加权均值 0、等权标准差 1),
读取时在 |
|
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