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 同级目录下。

辅助模块中有三类函数:

  1. prepareData 函数,可将数据与标准字段的名称对齐。函数的参数中,rawData 为使用的数据源,startTimeendTime 为需要的数据的起始时间和结束时间,其余参数为现有字段名与标准字段的对应名称。

  2. alpha158Prepare 函数,将表中字段提取成计算所需的矩阵并用字典存储。

  3. 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 模块中的因子函数已经按照批计算方式封装,流计算时无需重写计算逻辑,可以直接在 streamEngineParsermetrics 中调用。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