在量化投资中,因子是构建选股模型和机器学习模型的重要输入。常见的价格趋势、波动率、成交量、K 线形态等指标,本质上都是不同类型的量化因子。通过组合多个因子,研究人员可以更全面地刻画股票特征,挖掘潜在的 Alpha 收益。
随着机器学习在量化投资中的广泛应用,研究过程中通常需要计算数百甚至上千个因子作为模型特征,其中大量是业内长期使用的经典量价指标。这类因子的计算逻辑已经较为成熟,在不同项目中经常需要重复实现。为了减少重复开发、提高研究结果的一致性,业界通常会将这些基础因子整理成标准化因子库,作为量化研究和机器学习建模的基础。
为此,微软开源量化平台 Qlib 提供了两套标准因子库,其中 Alpha158 是应用最广泛的基础量价因子库之一,系统整理了 158 个经典技术指标,涵盖 K 线形态、价格走势、成交量、滚动统计等多个维度,已成为许多量化研究和机器学习模型的数据基础。
为了方便用户直接使用,DolphinDB 使用原生脚本实现了 Alpha158 全部 158 个因子的计算函数,并封装为 alpha158 模块。用户无需自行编写因子公式,即可直接调用完成历史数据和实时数据上的因子计算。
本文介绍了该因子库的基本规范,并以KMID因子为例,展示因子库在批计算、流计算中的应用。
注意:本教程包含的所有代码兼容 DolphinDB 3.00.5 及以上版本。
数据准备
Alpha158 的所有因子都基于统一的数据格式进行计算,因此在调用之前,需要先完成两项准备工作:统一字段名称,以及将行情数据转换为因子计算所需的数据结构。
为了简化整个过程,DolphinDB 提供了辅助模块 alpha158Prepare.dos,其中主要提供三类函数:
-
prepareData:统一数据字段名称,完成标准化处理;
-
alpha158Prepare:将行情数据转换为因子计算所需的矩阵,并以字典形式组织;
-
alpha158Cal*:封装完整计算流程,自动完成数据准备并调用对应因子函数。
载入模块和数据方法如下,data 为准备好的数据:
use alpha158
use alpha158Prepare
login('admin', '123456')
rawData = loadText("/YOUR_DIR/datatest.csv")
startTime = timestamp(2010.01.01)
endTime = timestamp(2010.01.31)
data = prepareData(rawData=rawData, startTime=startTime, endTime=endTime, securityidName="securityid", tradetimeName="tradetime", openName="open", closeName="close", highName="high", lowName="low", volName="vol", vwapName="vwap")
因子计算
完成数据准备后,即可直接调用 Alpha158 中的各类因子进行计算。
首先使用 alpha158Prepare 对行情数据进行预处理,将原始数据转换为 Alpha158 因子所需的输入格式:
use alpha158
input = alpha158Prepare(data, startTime, endTime)`
下面以 KMID 因子为例,直接调用对应的因子函数即可完成计算。
res = alpha158::kmid(input.close, input.open)
如果希望进一步简化调用过程,也可以直接使用辅助模块提供的 alpha158Cal* 系列函数。将数据准备和因子计算封装为一步操作。以上 KMID 因子的计算过程,也可以直接写成:
use alpha158Prepare
res = alpha158CalKmid(data, startTime, endTime)`
支持实时流计算
除了历史批量计算外,Alpha158 模块同样支持实时流计算。
借助 streamEngineParser,同一套因子代码可以直接用于流计算,无需针对实时场景重新开发或维护另一套实现。用户只需在 metrics 中调用 Alpha158 因子函数,系统便会自动完成相应流计算引擎的构建。
对于包含滚动窗口的因子,系统会自动选择适合的时序状态引擎;对于逐条计算的因子,则采用状态引擎执行。整个过程无需额外配置,真正实现了同一套因子代码同时支持历史批计算和实时流计算。
下面仍以 KMID 因子为例,在 streamEngineParser 中直接调用 kmid(close, open) 即可完成实时计算,因子本身无需任何修改。
//定义输入输出的表结构
inputSchema = table(1:0,["SecurityID", "TradeTime", "open", "close"],[SYMBOL, TIMESTAMP, DOUBLE, DOUBLE])
resultStream = table(10000:0, ["SecurityID", "TradeTime", "factor"], [SYMBOL, TIMESTAMP, DOUBLE])
//调用 alpha158 模块,并在 streamEngineParser 中使用 kmid 函数:
use alpha158
metrics = <[SecurityID, kmid(close, open)]>
streamEngine = streamEngineParser(
name="alpha158KmidParser",
metrics=metrics,
dummyTable=inputSchema,
outputTable=resultStream,
keyColumn="SecurityID",
timeColumn=`TradeTime,
triggeringPattern='keyCount',
triggeringInterval=4000
)
//将数据注入引擎,即可在 resultStream 输出表中查看结果:
streamEngine.append!(inputData)
res = exec factor from resultStream pivot by TradeTime, SecurityID
小结
DolphinDB 对微软 Qlib Alpha158 因子库中的全部 158 个经典量价因子进行了原生实现,并封装为统一模块。用户无需重复实现基础因子,即可完成历史批量计算和实时流计算,并使用统一接口快速开展因子研究。
点击 dolphindb.com/downloads/t…~
目前,DolphinDB 已陆续实现 WorldQuant 101 Alpha、国泰君安 Alpha191、CSAP 横截面资产定价因子库、 Qlib Alpha158等多套业内常用因子库,持续完善量化研究基础能力,为因子开发、模型训练和策略研究提供统一、高性能的计算支持。