5259 0

[源码分享] 最简最快的worldQuant 101 Alpha因子实现 [推广有奖]

  • 0关注
  • 2粉丝

等待验证会员

初中生

95%

还不是VIP/贵宾

-

威望
0
论坛币
10 个
通用积分
2.0022
学术水平
2 点
热心指数
2 点
信用等级
2 点
经验
312 点
帖子
11
精华
0
在线时间
12 小时
注册时间
2018-11-12
最后登录
2019-4-1

楼主
DolphinDB智臾科技 发表于 2018-11-12 20:27:31 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
DolphinDB是一款高性能分布式时序数据库,它特别适用于投资银行、对冲基金和交易所的定量查询和分析,可以用于构建基于历史数据的策略测试。下面我们将举例说明如何在DolphinDB中快速构建Alpha因子或Signal。
WorldQuant LLC发表的论文101 Formulaic Alphas中给出了101个Alpha因子公式。很多个人和机构尝试用不同的语言来实现这101个Alpha因子。本文中,我们例举了较为简单的Alpha #001和较为复杂的Alpha #098两个因子的实现,分别使用了2行和4行SQL代码,可谓史上最简。

因子介绍
Alpha#001公式:rank(Ts_ArgMax(SignedPower((returns<0?stddev(returns,20):close), 2), 5))-0.5
Alpha#98公式:(rank(decay_linear(correlation(vwap, sum(adv5,26.4719), 4.58418), 7.18088))- rank(decay_linear(Ts_Rank(Ts_ArgMin(correlation(rank(open), rank(adv15), 20.8187), 8.62571), 6.95668) ,8.07206)))
这两个因子在计算时候既用到了cross sectional的信息,也用到了大量时间序列的计算。也即在计算某个股票某一天的因子时,既要用到该股票的历史数据,也要用到当天所有股票的信息,所以计算量很大。

需要的数据
输入数据为包含以下字段的table:
symbol:股票代码
date:日期
volume:成交量
vwap:成交量的加权平均价格
open:开盘价格
close:收盘价格
在计算Alpha #001因子时,只需要股票代码、日期和收盘价格三个字段。

代码实现
  1. def alpha1(stock){
  2.         t= select date,symbol ,mimax(pow(iif(ratios(close) < 1.0, mstd(ratios(close) - 1, 20),close), 2.0), 5) as maxIndex from stock context by symbol
  3.         return select date,symbol, rank(maxIndex) - 0.5 as A1 from t context by date
  4. }

  5. def alpha98(stock){
  6.         t = select symbol, date, vwap, open, mavg(volume, 5) as adv5, mavg(volume,15) as adv15 from stock context by symbol
  7.         update t set rank_open = rank(open), rank_adv15 = rank(adv15) context by date
  8.         update t set decay7 = mavg(mcorr(vwap, msum(adv5, 26), 5), 1..7), decay8 = mavg(mrank(9 - mimin(mcorr(rank_open, rank_adv15, 21), 9), true, 7), 1..8) context by symbol
  9.         return select symbol, date, rank(decay7)-rank(decay8) as A98 from t context by date
  10. }
复制代码

以上代码使用了DolphinDB的一些内置函数:
pow:计算指数幂
iif:条件运算函数
ratios:对向量X的每个元素,计算X(n)\X(n-1)
mstd:在滑动窗口中计算标准差
mavg:在滑动窗口中计算平均值
mcorr:在滑动窗口中计算相关性
msum:在滑动窗口中求和
mrank:返回元素在滑动窗口的按升序或降序排序后的位置
mimin:返回滑动窗口中最小值的索引位置
mimax:返回滑动窗口中最大值的索引位置。
所有的核心代码都用SQL实现,对用户非常方便,可读性也很好。SQL中最关键的功能是context by子句实现的分组计算功能。与group by每个组产生一行记录不同,context by会输出跟输入相同行数的记录,所以我们可以方便的进行多个函数嵌套。cross sectional计算时,我们用date分组。时间序列计算时,我们用symbol(股票代码)分组。

性能分析
我们使用美国证券市场从2007年到2016年总共11,711只股票进行回测。每个股票每个交易日产生一个因子值, 总共产生1700万个因子值。使用单线程计算:Alpha #001因子耗时仅6秒,复杂的Alpha #098因子耗时仅26秒。最初使用C#编程来计算,不仅代码复杂,而且性能不佳,Alpha #098耗时超90分钟,性能相差200倍以上。DolphinDB的高性能得益于它的设计思路和技术架构。
在计算Alpha因子时,除了要考虑性能问题,代码的简洁性和可读性也不容忽视。DolphinDB实现Alpha #001因子只需要2行核心代码,实现Alpha #098因子仅需要4行核心代码,而其他系统实现则需要大段代码,可以参考其他系统计算Alpha #001因子。为什么DolphinDB的实现如此简洁?这得益于DolphinDB功能强大的脚本语言。在DolphinDB中,脚本语言与SQL是完全融合在一起的,SQL查询可以直接赋给一个变量或作为函数的参数。DolphinDB的SQL引擎除了支持标准的SQL以外,还为大数据分析特别是时间序列数据分析做了很多有用的扩展。比如上面使用到的context by是DolphinDB的特色之一,它相当于其他系统(SQL Server、PostgreSQL)的窗口函数,但是它比其他系统的窗口函数功能强得多,语法上也更简洁灵活,对面板数据非常友好。DolphinDB内置了许多与时序数据相关的函数,并进行了优化,大幅度提高了计算性能,比如上面使用到的mavg、mcorr、mrank、mimin等计算滑动窗口指标的函数复杂度仅为O(n)或O(nlogk), k为窗口大小。
感兴趣的朋友可以到官网下载DolphinDB尝试实现自己的Alpha因子和策略回测。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


已有 1 人评分经验 学术水平 热心指数 信用等级 收起 理由
accumulation + 100 + 1 + 1 + 1 精彩帖子

总评分: 经验 + 100  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

本帖被以下文库推荐

速度即价值

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群
GMT+8, 2026-1-28 01:55