国泰君安 191 Alpha 因子库

国泰君安 191 Alpha 因子 来源于国泰君安 2017 年 6 月份公布的研报《基于短周期价量特征的多因子选股体系——数量化专题之九十三》,属于短周期价量因子。为了使用户更方便地计算因子,本模块使用 DolphinDB 脚本实现了所有 191 个因子的函数,并封装在 DolphinDB 模块 gtja191Alpha 中。

本文将为大家介绍该因子库的基本规范,并以其中几个因子为例,展示因子库在批计算、流计算中的应用。

注意:本教程包含的所有代码兼容 DolphinDB 2.00.9,1.30.21 及以上版本。

1. 函数命名规则与入参规范

  • gtja191Alpha 模块中的所有函数命名规则为 gtjaAlpha + 因子序号, 如 gtjaAlpha1 ,gtjaAlpha29 ,gtjaAlpha166 。

  • 每一个因子的入参字段有所不同,具体参考 附录1-因子入参一览表 。本教程涉及到的所有字段如下:

    参数名称 / 标准字段名称参数含义
    tradetime交易时间
    securityid股票代码
    open开盘价
    close收盘价
    high最高价
    low最低价
    vol交易量
    vwap成交量加权平均价格
    index_open指数开盘价
    index_close指数收盘价
  • gtja191Alpha 模块中的所有因子均为矩阵入参。

2. 批计算使用范例

本章节将从环境配置、数据准备、计算调用方法等方面具体介绍 gtja191Alpha.dos 模块的用法。

2.1. 环境准备

把附件的 gtja191Alpha.dos 放在 [home]/modules 目录下,[home] 目录由系统配置参数 home 决定,可以通过 getHomeDir() 函数查看。

更多 DolphinDB 模块的说明,请参阅 DolphinDB 教程:模块

2.2. 数据准备

本文提供了因子测试用的 日频数据文件 (datatest.csv) ,该数据包含了国泰君安 191 因子 所需的字段 。如使用其他数据,请对照 所需的字段 自行添加缺少字段。

对于数据,需要保证当前数据的表字段名与模块字段名一致。为方便使用,本教程准备了一个辅助模块 gtja191Prepare.dos 来帮助统一字段名。调用前辅助模块前,需将该辅助模块放置在 gtja191Alpha 同级目录下。

辅助模块中有三类函数:

  1. prepareData 函数,可将数据与标准字段的名称对齐。函数的参数中,rawData 为使用的数据源,startTime 与 endTime 为需要的数据的起始时间和结束时间,其余参数为现有字段名与标准字段的对应名称。
  2. gtjaPrepare 函数,将表中字段提取成计算所需的矩阵并用字典存储。
  3. gtjaCalAlpha# 函数,最终计算函数,会调用 gtjaPrepare 函数及 gtja191Alpha 模块中的计算函数。

辅助模块具体用法将在本节及下一节中介绍。

一般来说,数据准备阶段,用户需调用辅助模块中的 prepareData 函数将数据与标准字段名称对齐。

注意:如若用户采用的数据字段名与输入字段中的标准字段名一致,无需调用准备函数 prepareData 。

载入模块和数据方法如下,data 为准备好的数据:

use gtja191Alpha
use gtja191Prepare
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", volumeName="vol", vwapName="vwap", indexCloseName="index_close", indexOpenName="index_open")

2.3. 使用范例

gtja191Alpha 模块中的所有因子均为矩阵入参,故用户需先准备矩阵,再调用对应的 gtjaAlpha# 函数,返回的结果亦为矩阵。由于不同因子计算时用到的参数不同,用户需通过查询 附录1-因子入参一览表 来确定所需的参数。

以国泰君安 Alpha 第1号因子为例,计算方法如下:

use gtja191Alpha
open, close, vol = panel(data.tradetime, data.securityid, [data.open, data.close, data.vol])
res = gtjaAlpha1(open, close, vol)

//or you can use dictionary
input = dict(`open`close`vol, panel(data.tradetime, data.securityid, [data.open, data.close, data.vol]))
res = gtjaAlpha1(input.open, input.close, input.vol)

为了更加便于用户计算,省去查询参数这一步骤,因子计算 辅助函数模块 gtja191Prepare.dos 提供了所需的矩阵准备函数 gtjaPrepare 和计算函数 gtjaCalAlpha#,用户可将其作为模块导入。

以 gtjaAlpha 第 1 号因子为例,辅助模块内的函数如下:

def gtjaPrepare(data, startTime, endTime){
    t = select securityid, tradetime, vol, low, high, close, open, vwap, index_close, index_open from data where tradetime between startTime : endTime
    return dict(`vol`low`high`close`open`vwap`index_close`index_open, panel(t.tradetime, t.securityid, [t.vol, t.low, t.high, t.close, t.open, t.vwap, t.index_close, t.index_open]))
}

def gtjaCalAlpha1(data, startTime, endTime){
    input = gtjaPrepare(data, startTime, endTime)
    return gtja191Alpha::gtjaAlpha1(input.open,input.close,input.vol)
}
//调用方法如下:
use gtja191Prepare

res = gtjaCalAlpha1(data, startTime, endTime)

注意:直接调用计算模块及辅助模块的整体调用方式请参考 gtja191Alpha 模块调用脚本

2.4. 注意事项

gtja191Alpha 模块中部分因子的原公式定义并不明确,gtja191Alpha 模块对这些做了一定的调整:

  • 因子内做 RANK(A) 或 TSRANK(A, n) 计算时,默认用百分比的形式返回排名。

  • 计算 SMA(A, n, m) 值时,取用数据A过去n天的加权平均值,其中平滑系数参数alpha=n/m。

  • 原论文中定义 SUMAC(A, n) 为计算 A 的前 n 项的累加,实际计算时与计算 SUM(A, n) 无异。

3. 实时流计算使用范例

国泰君安 191 Alpha 因子中大多数因子的实现方式都较为复杂,在流计算中,需要创建多个引擎级联完成。DolphinDB 提供了一个解析引擎 streamEngineParser 来代替人工创建并串联多个引擎,大大提高效率。除此之外,gtja191Alpha 模块也实现了批流一体,即做流计算时无需修改计算代码,直接在流引擎 streamEngineParser 中调用即可。

streamEngineParser 解析本模块因子计算的大致逻辑如下,用户如自行写因子函数时可以做参考:

  1. 涉及到 row 系列函数 的计算,会解析为横截面引擎(createCrossSectionalEngine)。
  2. 如若计算中用到了 rolling 函数,会解析为时间序列聚合引擎(createTimeSeriesEngine)。
  3. 其余计算会解析为响应式状态引擎(createReactiveStateEngine)。

本小节以国泰君安 Alpha 第 1 号因子为例,演示如何调用 gtja191Alpha 模块,实现流计算:

  1. 首先定义输入输出的表结构:

    inputSchema = table(1:0, ["SecurityID","TradeTime","open","close","vol"], [SYMBOL,TIMESTAMP,DOUBLE,DOUBLE,DOUBLE])
    resultStream = table(10000:0, ["SecurityID","TradeTime","factor"], [SYMBOL,TIMESTAMP,DOUBLE])
  2. 调用 gtja191Alpha 模块,并在 streamEngineParser 中使用 gtjaAlpha1 函数:

    use gtja191Alpha
    metrics = <[SecurityID,gtjaAlpha1(open,close,vol)]>
    streamEngine = streamEngineParser(name="gtjaAlpha1Parser", metrics=metrics, dummyTable=inputSchema, outputTable=resultStream, keyColumn="SecurityID", timeColumn=`tradetime, triggeringPattern='keyCount', triggeringInterval=4000)

    部分因子可能会创建多个引擎,可以调用 getStreamEngineStat() 查看总共串联了哪些引擎:

    getStreamEngineStat()
    
    #output
    ReactiveStreamEngine->
    name          user  status lastErrMsg numGroups numRows numMetrics memoryInUsed snapshotDir ...
    ------------- ----------- ------ ---------- --------- ------- ---------- ------------ ----------- 
    gtjaAlpha1P...guest OK                4000      84000   5          800928                   ...
    gtjaAlpha1P...guest OK                4000      84000   2          1264872                  ...
    
    CrossSectionalEngine->
    name         user  status lastErrMsg   numRows numMetrics metrics      triggering...triggering......
    ------------ -------- ------ ------------ ---------- ---------- ------------ ------------------ --------------- ---
    gtjaAlpha1...guest OK                  4000    3          SecurityID...keyCount     4000         ...      
  3. 将数据注入引擎,即可在 resultStream 输出表中查看结果:

    streamEngine.append!((select SecurityID, TradeTime, close, high, low from data order by TradeTime))
    //check the result
    res = exec factor from resultStream pivot by TradeTime, SecurityID

注意:完整 国泰君安 191 Alpha 流计算流程代码可查看 国泰君安191Alpha流计算完整过程

4. 小结

本文介绍了 gtja191Alpha 模块的用法。该模块用 DolphinDB 内置函数实现了 国泰君安 191 Alpha 因子,具有简单便捷、批流一体的特点。

5. 附录

5.1. 附录1-因子入参一览表

因子序号所需参数因子序号所需参数因子序号所需参数
15, 37, 54, 184, 185open, close119open,vol,vwap9, 68, 123high,low,vol
55, 107, 137, 171open,close,high,low10, 14, 18, 19, 20, 21, 22, 23, 24, 27, 31, 34, 46, 53, 58, 63, 65, 66, 67, 71, 79, 86, 88, 89, 98, 106, 112, 116, 122, 127, 129, 135, 143, 146, 147, 151, 152, 153, 157, 160, 162, 165, 166, 167, 169, 173, 174, 183, 189, 190close77, 130high,low,vol,vwap
140open,close,high,low,vol2, 3, 28, 47, 57, 59, 72, 78, 82, 96, 110, 126, 158, 159, 161, 164, 172, 175, 186close,high,low8, 13high,low,vwap
1, 136open,close,vol11, 52, 60, 111, 115, 117, 128, 150, 176, 191close,high,low,vol5, 32, 42, 62, 83, 141high,vol
39, 45open,close,vol,vwap114close,high,low,vol,vwap108high,vol,vwap
12open,close,vwap104close,high,vol103low
6, 187open,high101, 163, 170close,high,vol,vwap44, 61, 74, 138, 179low,vol,vwap
118open,high,low33, 91close,low,vol80, 81, 97, 100, 102, 145, 155, 168vol
56, 69open,high,low,vol4, 25, 29, 40, 43, 48, 76, 84, 85, 94, 99, 113, 134, 142, 178, 180close,vol16, 36, 70, 90, 95, 121, 132, 154vol,vwap
87open,high,low,vwap7, 64, 73, 92, 125, 131, 144close,vol,vwap41vwap
93open,low17, 26, 120, 124close,vwap30, 149, 181close,index_close
156open,low,vwap38, 177high75, 182close,open,index_close,index_open
35, 105, 139, 148    open,vol49, 50, 51, 109, 133, 188high,low