
Qlib 表达式引擎入门从一行字符串到自定义因子库【免费下载链接】qlibQlib is an AI-oriented Quant investment platform that aims to use AI tech to empower Quant Research, from exploring ideas to implementing productions. Qlib supports diverse ML modeling paradigms, including supervised learning, market dynamics modeling, and RL, and is now equipped with https://github.com/microsoft/RD-Agent to automate RD process.项目地址: https://gitcode.com/GitHub_Trending/qli/qlib把($close-$open)/$open这样一串文本交给 Qlib它就返回一整条日收益率时间序列——因子不用写成 Python 函数写成字符串即可。这就是 Qlib 的表达式引擎Expression Engine它的核心实现只有 qlib/data/ops.py 一个文件约 50 个运算符类覆盖了绝大多数因子计算需求。先把心智模型立起来因子是配方不是代码可以把表达式理解成一份因子计算的配方解析字符串被解析成运算符对象树比如Mean($close, 20)变成Mean(featureclose, N20)一个对象执行引擎从数据层递归拉取数据逐节点计算每个节点的输出是下游节点的输入窗口自适应引擎会自动为表达式多取一段历史数据保证窗口计算不缺样本由每个运算符的get_extended_window_size声明。最小可复制示例拿到一个单票的两列因子import qlib from qlib.data import D qlib.init(provider_uri~/.qlib/qlib_data/cn_data) fields [$close, ($close-$open)/$open] df D.features([SH600519], fields, 2020-01-01, 2020-06-30)⚠️ 所有原始行情字段必须带$前缀$open、$close、$high、$low、$volume、$vwap裸写close会报NameError。场景一算简单因子——算术与一元函数加减乘除用中缀写法直接嵌在字符串里对数、绝对值这类变换用函数式写法fields [ $close/$open - 1, # 日内涨跌幅 ($high-$low)/$open, # 价格振幅 Log($volume1), # 成交量取对数压量级 ]三个要点运算符优先级遵循 Python 规则不确定就加括号Log只对正数有意义价格类字段放心用收益率类先加 1 再取对数结果列名默认就是表达式文本本身长表达式建议在D.features后重命名列。场景二跨期比较——Ref、差分与滚动窗口时间序列因子的核心是今天 vs 历史上表达式引擎用三个原语覆盖原语写法含义历史引用Ref($close, 1)前 1 期收盘价等价shift(1)差分Delta($close, 5)当日值减 5 日前值滚动统计Mean/Std/Sum/Max/Min/Skew/Kurt/Rank/Quantile/Med(...)窗口内统计量fields [ Ref($close, 1), # 昨收 $close - Ref($close, 5), # 5 日动量 Mean($close, 20), # 20 日均价 Mean($close, 0.1), # 指数加权移动平均 Sum($close/Ref($close,1)-1, 20), # 20 日累计收益 ] 窗口参数N有三种形态正整数是固定窗口0 表示扩展窗口从序列起点累计(0,1)的小数则变成指数加权该值即alpha。同一套滚动基类qlib/data/ops.py 中的Rolling同时实现了这三种语义。场景三条件逻辑——If 与布尔运算比较运算返回 0/1 序列、|做条件组合If(cond, a, b)做分支可以直接把策略规则写成因子# 带止损的 5 日动量跌破 20 日线时动量置零 fields [ If($close Mean($close, 20), 0, Sum($close/Ref($close,1)-1, 5)), ] # 上涨趋势且放量才给量否则给 0 fields [ If(($close Mean($close, 20)) ($volume Mean($volume, 20)), $volume, 0), ]⚠️If的三个参数都会被完整计算没有短路求值条件分支里的表达式若含非法运算如负数取对数仍会先算出 NaN。场景四跨资产引用——ChangeInstrument 一行切标的算相对强度、市场 beta 时需要把计算对象从个股切到指数。ChangeInstrument(instrument, feature)就是干这个的idx ChangeInstrument(SH000300, $close) fields [ $close/Ref($close,1) - 1, # 个股日收益 f{idx}/Ref({idx},1) - 1, # 沪深 300 日收益 $close/Ref($close,1) - 1 - f({idx}/Ref({idx},1) - 1), # 超额收益 ]切到指数后后续的Mean、Ref等照常嵌套写出来的仍然是个股为主、指数为辅的混合序列。多频率场景下引擎还内置了TResample运算符可在表达式内对高频序列做重采样聚合。组合玩法因子库与自定义运算符站在现成因子库上。Qlib 自带 Alpha158/Alpha360 两套因子集全部用表达式定义见 qlib/contrib/data/handler.py。想抄作业直接读get_feature_config里的表达式列表想微调改窗口参数即可不用碰 Python 代码。注册自定义运算符。写一个继承ExpressionOps的类把_load_internal实现成对输入序列的 NumPy/pandas 变换然后注册进Operators字符串里就能用类名调用from qlib.data.ops import Operators, ExpressionOps class MyOp(ExpressionOps): def _load_internal(self, instrument, start_index, end_index, *args): series self.feature.load(instrument, start_index, end_index, *args) return series.clip(-1, 1) Operators.register(MyOp) # 之后表达式里可用 MyOp($close)也可以不走代码、走配置C.set(custom_ops[{class: MyOp, module_path: my_ops.py}])适合团队协作时把自定义算子放进仓库。避坑与调优四组最常见的误区按误区 → 正确做法对照误区用Ref($close, -1)表示昨收。负数是未来数据-1是明天只能出现在 label 表达式里如Ref($close, -2)/Ref($close, -1) - 1表示次日收益用在 feature 里就是前视偏差。误区窗口参数写 0 表示不滚动。Mean(x, 0)实际是扩展窗口从第一天累计到当前结果含义完全不同不想要历史累计就别传 0。误区手动扩长时间区间给窗口预热。引擎按get_extended_window_size自动向前多取数据D.features的start_time之前会自动补齐手动扩展反而让首段数据被重复计算。误区同一大因子列表反复全量计算、内存爆掉。D.features自带磁盘缓存实现见 qlib/data/cache.py传disk_cache1后相同表达式区间的结果落盘复用二次计算从分钟级降到秒级。结语表达式引擎的价值是把改因子从改代码降级成改字符串一个窗口参数、一条条件规则都是一行文本的事。源码入口qlib/data/ops.py运算符定义、qlib/data/cache.py表达式缓存、qlib/contrib/data/handler.pyAlpha158/360 因子库。【免费下载链接】qlibQlib is an AI-oriented Quant investment platform that aims to use AI tech to empower Quant Research, from exploring ideas to implementing productions. Qlib supports diverse ML modeling paradigms, including supervised learning, market dynamics modeling, and RL, and is now equipped with https://github.com/microsoft/RD-Agent to automate RD process.项目地址: https://gitcode.com/GitHub_Trending/qli/qlib创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考