Alpha 158 因子库
vwapAlpha158 因子集来源于微软开源量化平台 Qlib(Microsoft Qlib),是 Qlib 内置的两套标准量价因子库之一(另一套为 Alpha360),该因子集系统地整合了量化投资中常见的多种技术指标。为了使用户更方便地计算因子,本模块使用 DolphinDB 脚本实现了所有 158 个因子的函数,并封装在 DolphinDB 的 alpha158 模块中。
本文介绍该因子库的基本规范,并以其中几个因子为例,展示因子库在批计算、流计算中的应用。
注意:本教程包含的所有代码兼容 DolphinDB 3.00.5 及以上版本。
1. 函数名称与入参规范
-
alpha158 模块中的所有函数名称与入参字段参考附录1-因子名称及入参一览表。本教程涉及到的所有字段如下:
参数名称 / 标准字段名称 参数含义 tradetime 交易时间 securityid 股票代码 open 开盘价 close 收盘价 high 最高价 low 最低价 vol 交易量 vwap 成交量加权平均价格 -
alpha158 模块中的所有因子均为矩阵入参。
2. 批计算使用范例
本章节将从环境配置、数据准备、计算调用方法等方面具体介绍 alpha158.dos 模块的用法。
2.1 环境准备
下载附件 alpha158.dos,并将其放在 [home]/modules 目录下。[home] 目录由系统配置参数 home 决定,可以通过
getHomeDir() 函数查看。
更多 DolphinDB 模块的说明,请参阅模块。
2.2 数据准备
本文提供了因子测试用的日频数据文件 (datatest.csv),该数据包含了 Alpha158 因子所需的字段 。如使用其他数据,请对照所需的字段自行添加缺少字段。
对于数据,需要保证当前数据的表字段名与模块字段名一致。为方便使用,本教程准备了一个辅助模块 alpha158Prepare.dos 来帮助统一字段名。调用前辅助模块前,需将该辅助模块放置在 Alpha 同级目录下。
辅助模块中有三类函数:
-
prepareData函数,可将数据与标准字段的名称对齐。函数的参数中,rawData 为使用的数据源,startTime 与 endTime 为需要的数据的起始时间和结束时间,其余参数为现有字段名与标准字段的对应名称。 -
alpha158Prepare函数,将表中字段提取成计算所需的矩阵并用字典存储。 -
alpha158Cal*系列函数,即最终计算函数,会调用alpha158Prepare函数及 alpha158 模块中的计算函数。
一般来说,数据准备阶段,用户需调用辅助模块中的 prepareData 函数将数据与标准字段名称对齐。
注意:如若用户采用的数据字段名与输入字段中的标准字段名一致,无需调用准备函数 prepareData。
载入模块和数据方法如下,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")
2.3 使用范例
alpha158 模块中的所有因子均为矩阵入参,故用户需先准备矩阵,再调用对应的函数,返回的结果亦为矩阵。由于不同因子计算时用到的参数不同,用户需通过查询附录1-因子名称及入参一览表来确定所需的参数。
以 KMID 因子为例,计算方法如下:
use alpha158
open, close = panel(data.tradetime, data.securityid, [data.open, data.close])
res = kmid(close,open)
//or you can use dictionary
input = dict(`open`close, panel(data.tradetime, data.securityid, [data.open, data.close]))
res = kmid(input.close,input.open)
为了更加便于用户计算,省去查询参数这一步骤,因子计算辅助函数模块 alpha158Prepare.dos 提供了所需的矩阵准备函数 alpha158Prepare
和计算函数 alpha158Cal*,用户可将其作为模块导入。
以 KMID 因子为例,辅助模块内的函数如下:
def alpha158Prepare(data, startTime, endTime){
t = select securityid, tradetime, open, close, high, low, vol, vwap from data where tradetime between startTime: endTime
return dict(`open`close`high`low`vol`vwap, panel(t.tradetime, t.securityid, [t.open, t.close, t.high, t.low, t.vol, t.vwap]))
}
def alpha158CalKmid(data, startTime, endTime){
input = alpha158Prepare(data, startTime, endTime)
return alpha158::kmid(input.close, input.open)
}
//调用方法如下:
use alpha158Prepare
res = alpha158CalKmid(data, startTime, endTime)
注意:直接调用计算模块及辅助模块的整体调用方式请参考附录2:alpha158 模块调用脚本。
3. 实时流计算使用范例
Alpha158 因子主要分为 K-bar、price 和 rolling 三类,公式结构相对简单。由于 alpha158 模块中的因子函数已经按照批计算方式封装,流计算时无需重写计算逻辑,可以直接在 streamEngineParser 的 metrics 中调用。streamEngineParser 会根据表达式自动解析并创建相应的流计算引擎;涉及滚动窗口的因子会被解析到时序/状态类引擎中,其余逐行计算因子由状态引擎完成。
本小节以 Alpha158 KMID 因子为例,演示如何调用 alpha158 模块,实现流计算:
//定义输入输出的表结构
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
注意:完整 Alpha158 流计算流程代码可查看附录2:Alpha158流计算完整过程。
4. 小结
本文介绍了 alpha158 模块的用法。该模块用 DolphinDB 内置函数实现了 Alpha 158 因子,具有简单便捷、批流一体的特点。
目前,DolphinDB 已陆续实现 WorldQuant 101 Alpha 因子指标库、国泰君安 191 Alpha 因子库、MyTT 指标库、CSAP 因子指标库、风险和绩效计算(Empyrical)指标库、高频行情低频化因子库使用教程等多套业内常用因子库,持续完善量化研究基础能力,为因子开发、模型训练和策略研究提供统一、高性能的计算支持。
5. 附录
5.1 附录1-因子名称及入参一览表
| 因子名称 | 所需参数 | 因子名称 | 所需参数 |
|---|---|---|---|
| KMID, OPEN0 | open, close | KLEN | open, high, low |
| KUP | open, high, close | KLOW | open, low, close |
| KMID2, KUP2, KLOW2, KSF | open, high, low, close | KSFT2, RSV5, RSV10, RSV20, RSV30, RSV60 | high, low, close |
| HIGH0, MAX5, MAX10, MAX20, MAX30, MAX60 | high, close | LOW0, MIN5, MIN10, MIN20, MIN30, MIN60 | low, close |
| IMAX5, IMAX10, IMAX20, IMAX30, IMAX60 | high | IMIN5, IMIN10, IMIN20, IMIN30, IMIN60 | low |
| IMXD5, IMXD10, IMXD20, IMXD30, IMXD60 | high, low | CORR5, CORR10, CORR20, CORR30, CORR60, CORD5, CORD10, CORD20, CORD30, CORD60, WVMA5, WVMA10, WVMA20, WVMA30, WVMA60 | close, volume |
| VMA5, VMA10, VMA20, VMA30, VMA60, VSTD5, VSTD10, VSTD20, VSTD30, VSTD60, VSUMP5, VSUMP10, VSUMP20, VSUMP30, VSUMP60, VSUMN5, VSUMN10, VSUMN20, VSUMN30, VSUMN60, VSUMD5, VSUMD10, VSUMD20, VSUMD30, VSUMD60 | volume | VWAP0 | vwap, close |
| ROC5, ROC10, ROC20, ROC30, ROC60, MA5, MA10, MA20, MA30, MA60, BETA5, BETA10, BETA20, BETA30, BETA60, RSQR5, RSQR10, RSQR20, RSQR30, RSQR60, RESI5, RESI10, RESI20, RESI30, RESI60, STD5, STD10, STD20, STD30, STD60, QTLU5, QTLU10, QTLU20, QTLU30, QTLU60, QTLD5, QTLD10, QTLD20, QTLD30, QTLD60, RANK5, RANK10, RANK20, RANK30, RANK60, CNTP5, CNTP10, CNTP20, CNTP30, CNTP60, CNTN5, CNTN10, CNTN20, CNTN30, CNTN60, CNTD5, CNTD10, CNTD20, CNTD30, CNTD60, SUMP5, SUMP10, SUMP20, SUMP30, SUMP60, SUMN5, SUMN10, SUMN20, SUMN30, SUMN60, SUMD5, SUMD10, SUMD20, SUMD30, SUMD60 | close |
5.2 附录2
-
日频数据文件:data.zip
-
alpha158 因子模块:alpha158.dos
-
alpha158 模块调用脚本:alpha158AlphaRes.dos
-
alpha158 辅助模块:alpha158Prepare.dos
-
alpha158 流计算完整过程:alpha158StreamTest.dos
