国泰君安 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 同级目录下。
辅助模块中有三类函数:
- prepareData 函数,可将数据与标准字段的名称对齐。函数的参数中,rawData 为使用的数据源,startTime 与 endTime 为需要的数据的起始时间和结束时间,其余参数为现有字段名与标准字段的对应名称。
- gtjaPrepare 函数,将表中字段提取成计算所需的矩阵并用字典存储。
- 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
解析本模块因子计算的大致逻辑如下,用户如自行写因子函数时可以做参考:
- 涉及到 row 系列函数 的计算,会解析为横截面引擎(
createCrossSectionalEngine
)。 - 如若计算中用到了
rolling
函数,会解析为时间序列聚合引擎(createTimeSeriesEngine
)。 - 其余计算会解析为响应式状态引擎(
createReactiveStateEngine
)。
本小节以国泰君安 Alpha 第 1 号因子为例,演示如何调用 gtja191Alpha 模块,实现流计算:
首先定义输入输出的表结构:
inputSchema = table(1:0, ["SecurityID","TradeTime","open","close","vol"], [SYMBOL,TIMESTAMP,DOUBLE,DOUBLE,DOUBLE]) resultStream = table(10000:0, ["SecurityID","TradeTime","factor"], [SYMBOL,TIMESTAMP,DOUBLE])
调用 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 ...
将数据注入引擎,即可在 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, 185 | open, close | 119 | open,vol,vwap | 9, 68, 123 | high,low,vol |
55, 107, 137, 171 | open,close,high,low | 10, 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, 190 | close | 77, 130 | high,low,vol,vwap |
140 | open,close,high,low,vol | 2, 3, 28, 47, 57, 59, 72, 78, 82, 96, 110, 126, 158, 159, 161, 164, 172, 175, 186 | close,high,low | 8, 13 | high,low,vwap |
1, 136 | open,close,vol | 11, 52, 60, 111, 115, 117, 128, 150, 176, 191 | close,high,low,vol | 5, 32, 42, 62, 83, 141 | high,vol |
39, 45 | open,close,vol,vwap | 114 | close,high,low,vol,vwap | 108 | high,vol,vwap |
12 | open,close,vwap | 104 | close,high,vol | 103 | low |
6, 187 | open,high | 101, 163, 170 | close,high,vol,vwap | 44, 61, 74, 138, 179 | low,vol,vwap |
118 | open,high,low | 33, 91 | close,low,vol | 80, 81, 97, 100, 102, 145, 155, 168 | vol |
56, 69 | open,high,low,vol | 4, 25, 29, 40, 43, 48, 76, 84, 85, 94, 99, 113, 134, 142, 178, 180 | close,vol | 16, 36, 70, 90, 95, 121, 132, 154 | vol,vwap |
87 | open,high,low,vwap | 7, 64, 73, 92, 125, 131, 144 | close,vol,vwap | 41 | vwap |
93 | open,low | 17, 26, 120, 124 | close,vwap | 30, 149, 181 | close,index_close |
156 | open,low,vwap | 38, 177 | high | 75, 182 | close,open,index_close,index_open |
35, 105, 139, 148 | open,vol | 49, 50, 51, 109, 133, 188 | high,low |