国泰君安 191 Alpha 因子的流批一体实现
国泰君安 191 Alpha 因子 来源于国泰君安 2017 年 6 月份公布的研报《基于短周期价量特征的多因子选股体系——数量化专题之九十三》,属于短周期价量因子。
为了方便用户计算因子,我们用 DolphinDB 脚本实现了所有 191 个因子的函数,并封装在 DolphinDB 模块 gtja191Alpha (gtja191Alpha.dos) 中。
本文将为大家介绍该因子库的基本规范,并以其中几个因子为例,展示因子库在批计算、流计算中的应用。
本教程包含的所有代码兼容 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 教程:模块 。
2.2 数据准备
本文提供了因子测试用的 日频数据文件 (datatest.csv) ,该数据包含了国泰君安 191 因子 所需的字段 。如使用其他数据,请对照 所需的字段 自行添加缺少字段。
对于数据,需要保证当前数据的表字段名与模块字段名一致。为方便使用,本教程准备了一个辅助模块 gtja191Prepare.dos 来帮助统一字段名。调用前辅助模块前,需将该辅助模块放置在 gtja191Alpha 同级目录下。
辅助模块中有三类函数:
- prepareData 函数,可将数据与标准字段的名称对齐。函数的参数中,rawData 为使用的数据源,startTime 与 endTime 为需要的数据的起始时间和结束时间,其余参数为现有字段名与标准字段的对应名称。
- gtjaPrepare 函数,将表中字段提取成计算所需的矩阵并用字典存储。
- gtjaCalAlpha# 函数,最终计算函数,会调用 gtjaPrepare 函数及 gtja191Alpha 模块中的计算函数。
辅助模块具体用法将在本节及 2.3 节中介绍。
一般来说,数据准备阶段,用户需调用辅助模块中的 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 : endTimereturn 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 gtja191Prepareres = gtjaCalAlpha1(data, startTime, endTime)
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 系列函数 的计算,会解析为横截面引擎(
CrossSectionalEngine
)。 - 如若计算中用到了 rolling 函数,会解析为时间序列聚合引擎(
TimeSeriesEngine
)。 - 其余计算会解析为响应式状态引擎(
ReactiveStreamEngine
)。
本小节以国泰君安 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])
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, 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 |
5.2 附录2
- 国泰君安 191 Alpha 因子模块
- 日频数据文件
- 国泰君安191 Alpha 辅助模块
- 国泰君安191Alpha流计算完整过程
国泰君安 191 Alpha 因子的流批一体实现相关推荐
- flink集成springboot案例_Flink从流处理到流批一体的19个最佳实践
近年来,随着实时化需求的场景日益增多,企业已不满足于简单使用流计算或批计算进行数据处理,采用一套引擎即可实现低延迟.高吞吐.高稳定的强大性能逐渐成为更多企业的追求.Apache Flink 作为领先的 ...
- 基于Flink SQL构建流批一体实时数仓
基于Flink构建流批一体的实时数仓是目前数据仓库领域比较火的实践方案.随着Flink的不断迭代,其提供的一系列技术特性使得用户构建流批一体的应用变得越来越方便.本文主要分享基于FinkSQL构建实时 ...
- hive增量表和全量表_基于 Flink + Hive 构建流批一体准实时数仓
基于 Hive 的离线数仓往往是企业大数据生产系统中不可缺少的一环.Hive 数仓有很高的成熟度和稳定性,但由于它是离线的,延时很大.在一些对延时要求比较高的场景,需要另外搭建基于 Flink 的实时 ...
- 数据仓库、数据湖、流批一体,终于有大神讲清楚了!
摘要 数据仓库,数据湖,包括Flink社区提的流批一体,它们到底能解决什么问题?今天将由阿里云研究员从解决业务问题出发,将问题抽丝剥茧,从技术维度娓娓道来:为什么你需要数据湖或者数据仓库解决方案?它的 ...
- 大数据架构如何做到流批一体?
阿里妹导读:大数据与现有的科技手段结合,对大多数产业而言都能产生巨大的经济及社会价值.这也是当下许多企业,在大数据上深耕的原因.大数据分析场景需要解决哪些技术挑战?目前,有哪些主流大数据架构模式及其发 ...
- 解读Dataphin流批一体的实时研发
简介:Dataphin作为一款企业级智能数据构建与管理产品,具备全链路实时研发能力,从2019年开始就支撑可集团天猫双11的实时计算需求,文章将详细介绍Dataphin实时计算的能力. -更多关于数智 ...
- Flink 1.13,面向流批一体的运行时与 DataStream API 优化
简介:在 1.13 中,针对流批一体的目标,Flink 优化了大规模作业调度以及批执行模式下网络 Shuffle 的性能,以及在 DataStream API 方面完善有限流作业的退出语义. 本文由社 ...
- 流批一体生产应用!Bigo 实时计算平台建设实践
简介:本文由 Bigo 计算平台负责人徐帅分享,主要介绍 Bigo 实时计算平台建设实践的介绍 本文由 Bigo 计算平台负责人徐帅分享,主要介绍 Bigo 实时计算平台建设实践的介绍.内容包括: B ...
- 40亿条/秒!Flink流批一体在阿里双11首次落地的背后
简介:今年的双11,实时计算处理的流量洪峰创纪录地达到了每秒40亿条的记录,数据体量也达到了惊人的每秒7TB,基于Flink的流批一体数据应用开始在阿里巴巴最核心的数据业务场景崭露头角,并在稳定性.性 ...
最新文章
- 论坛报名 | 人工智能与疫情精准防控
- poj 3257(哈希+二维dp)
- 【堆内存】动态图+代码五分钟轻松理解学会
- redis 内存溢出_查漏补缺,Redis为什么会这么快,看完这七点你就知道了
- 用户界面和兼容性测试
- 20190226-SecureCRT连接linux显示中文乱码
- 05章项目: QuickHit快速击键
- Redis主从复制和集群配置
- 声纹识别demo_科学网—声纹识别、说话人识别软件,SPEAKER v0.1 - 石自强的博文...
- 交换机配置常用的命令
- 海量图片上传及存储方案
- Python学习路线(课程大纲+Python视频教程+下载地址)
- Java算法:LeetCode算法Java版合集1111-1588题
- 腾讯位置大数据中区域热力图数据的数据解析
- 了解keep-alive
- Array.of()
- C语言学习必看的N本书-续(一定要看呵)
- ES初探之——shard和replica
- 中国石油大学(北京)-《 油气藏经营管理》第二阶段在线作业
- python中文分词之jieba分词的使用
热门文章
- 烽火HG680-KB_Hi3798MV310_当贝桌面_强刷及免拆_两种方法-卡刷固件包
- 自然语言中的重要概念——熵(Entropy)
- Jsoup爬取同花顺龙虎榜
- linux图形界面抖动,Linux下RGB接口LCD显示屏移植杂点抖动问题解决
- 华为发布5g折叠屏手机,未来该如何把握扫地机器人黑科技?
- exif信息中的数据_什么是EXIF数据,如何将其从照片中删除?
- 无线充电宝口碑最好的牌子推荐,口碑好的无线充电宝盘点
- axure 富文本编辑器_Java的类加载器与双亲委托机制
- RAW格式转化为BMP
- Web页面或app等前端页面之Java Web的JSP、Servlet、Cookie、Session等技术小结