量化交易回测系列二:多因子Alpha策略回测

本文解释多因子模型与 alpha 策略的基本思路、特征,并与套利策略进行对比与讨论适用性。

Source: https://dolphindb.cn/blogs/13

What this page covers

技能认证特训营第二期正式开启(限时报名)

页面顶部提供活动通知与报名链接入口。

量化交易回测系列二:多因子Alpha策略回测

本节给出文章标题,并标注作者与发布日期。

多因子 Alpha 策略与多因子模型背景

本节解释多因子模型与 alpha 策略的思路与特征,并讨论与套利策略的对比及适用性。

1. 生成因子

本节说明输入数据结构,并给出因子生成函数、因子定义与相关 DolphinDB 函数说明。

2. 回测框架

本节给出多因子 Alpha 回测框架的总体分解。

2.1 计算历史周期的投资仓位

本节介绍如何按周期(一天)计算投资仓位,并扩展到历史每一天的并行计算。

2.1.1 计算一天的股票投资组合

本节描述权重约束、因子矩阵构造、权重修剪逻辑,并给出 formPeriodPort 的输入输出与实现要点。

2.1.2 计算过去每天的股票投资组合

本节说明使用分区内存数据库与 map-reduce,将 formPeriodPort 应用于每个交易日并写入分区表。

2.2 计算仓位和盈亏

本节定义 calcStockPnL,用于生成按 tranche/因子/日期的仓位与盈亏明细,并通过 map-reduce 写入分区表。

3. 运行实例

本节以美国股市为例运行回测,展示执行流程、绘图输出,并描述计算规模与性能。

4. 讨论

本节指出框架当前覆盖范围与未解决问题,并预告后续文章将讨论的主题。

Facts Index

Entity Attribute Value Confidence
技能认证特训营第二期报名链接https://www.qingsuyun.com/h5/e/217471/5/high
文章发布日期2021-05-14high
文章作者署名Junxihigh
多因子模型基本思路找到与回报率最相关的指标并据此构建投资组合(做多正相关股票、做空负相关股票)medium
单因子个股权重(多因子模型)特征一般实现多空均衡(市场中性),不暴露市场风险头寸(beta 为 0,因此称为 alpha 策略),能实现绝对收益medium
多个因子关系/作用多个因子之间相互正交,便于策略配置,实现回报和风险的最优控制low
多因子 alpha 策略 vs 套利策略对比套利策略通常 sharpe ratio 更高但 scale 不好;多因子 alpha 策略有很好的 scale,可配置大量资金low
多因子 Alpha 策略应用场景在对冲基金中的使用非常普遍low
输入数据表 inData(genSignals)字段包含 6 个字段:sym(股票代码), date(日期), close(收盘价), RET(日回报), MV(市值), VOL(交易量)high
genSignals(inData)数据过滤条件weekday(date) between 1:5, close>5, VOL>0, MV>100000(并按 sym、date 排序)high
规模因子 signal_size定义MV 的平方根的相反数(-sqrt(MV))high
波动率因子 signal_vol定义过去一个月股价波动率的相反数(-mstd(RET, 21)*sqrt(252))high
动量因子 signal_mom定义过去 12 个月(去除最近 1 个月)的动量因子(move(cumretIndex,21)/move(cumretIndex,252)-1)high
beta 因子 signal_beta定义利用过去三个月的数据计算个股跟市场的 beta(mbeta(RET, mRet, 63))high
mRet(市场回报代理)计算方式按 date 分组,对 RET 使用 prevMV 加权平均(wavg(RET, prevMV))high
genSignals 输出输出字段sym, date, close, ret(由 RET 重命名), signal_size, signal_beta, signal_vol, signal_momhigh
genSignals 输出数据起始日期过滤date>=1991.01.01high
DolphinDB 函数_abs取绝对值high
DolphinDB 函数_prev把向量中的所有元素向右移动一个位置high
DolphinDB 函数_cumprod计算累计乘积high
DolphinDB 函数_sqrt计算平方根high
DolphinDB 函数_mstd(X,k)计算移动标准差high
DolphinDB 函数_wavg(X,k)计算加权平均数high
DolphinDB 函数_move(X,k)k>0 右移 k 位;k<0 左移 k 位high
DolphinDB 函数_mbeta(X,Y,k)计算普通最小二乘回归的系数估计high
多因子 Alpha 策略回测框架组成部分包含 3 个部分:生成每个周期的权重(tranche)、根据持有时间生成每日仓位与盈亏、统计分析各策略及总体业绩high
一天组合权重(单因子约束)约束条件一个因子中所有股票的权重和为 0(多空均衡)high
一天组合权重(跨因子约束)约束条件不同因子之间相互正交:第 i 个因子的权重 wi 与第 j 个因子的值 sj 的内积为 0(i<>j)high
因子矩阵 sigMat构造说明矩阵每列为一个因子、每行为一只股票,并添加单位因子列(全为 1);并对信号做去均值(x - avg(x))high
实际交易股票数量控制处理方法去除权重较小的股票(大部分权重很小可忽略),通过嵌套函数 f 调整单因子股票权重medium
formPeriodPort 函数输入参数signals(8 字段:股票代码、日期、收盘价格、回报率和 4 个因子)、signalNames(因子名称向量)、stockPercentile(控制股票数量)high
formPeriodPort 输出输出字段数据表包含 4 个字段:tranche, sym, signalIdx, exposurehigh
formPeriodPort 逻辑exposure 分配/修剪对每个因子多空各分配一美元(allocate two dollars on each signal, one for long and one for short);并修剪小权重(trim small weights)high
DolphinDB 函数_size返回向量中元素的个数high
DolphinDB 函数_first返回第一个元素high
DolphinDB 函数_matrix构建矩阵high
DolphinDB 函数_transpose矩阵转置high
DolphinDB 函数_dot矩阵或向量内积high
DolphinDB 函数_inv矩阵求逆high
DolphinDB 函数_iif(condition, trueResult, falseResult)满足条件返回 trueResult,否则返回 falseResult(逐元素 if...else)high
DolphinDB 函数_loop(func,args)高价模板函数:对 args 每个元素应用 func 并汇总为元组high
DolphinDB 函数_unionAll合并多个表high
回测计算环境原因/做法回测数据量非常庞大,将数据放到内存分区数据库并使用并行计算medium
参考链接分区数据库教程https://zhuanlan.zhihu.com/p/46299595high
partSignals 分区表分区粒度将 genSignals 生成的数据保存到分区表 partSignals;一个分区表示一天high
ports 分区表分区粒度创建分区表 ports 保存股票投资组合;一个分区表示一年high
formPortfolio并行计算方式使用 map-reduce,将 formPeriodPort 应用于每一天,并将结果合并到分区表 portshigh
DolphinDB 函数_sort把向量中的元素排序high
DolphinDB 函数_database(directory,[partitionType],[partitionScheme],[locations])创建数据库;directory 为空时创建内存数据库high
DolphinDB 函数_createPartitionedTable(dbHandle, table,[tableName], partitionColumns)在数据库中创建分区表high
DolphinDB 函数_datatimeParse(X, format)把字符串转换成 DolphinDB 时间类型数据medium
DolphinDB 函数_type返回数据类型的 IDhigh
DolphinDB 函数_mr(ds, mapFunc,[reduceFunc],[finalFunc],[parallel=true])map-reduce 函数high
calcStockPnL 任务目标输出内容根据仓位与持有时间,生成每只股票在每个 tranche、每个因子上每一天的仓位和盈亏,并保存到分区表 pnlshigh
calcStockPnL 输入ports 字段tranche, sym, signalIdx, exposurehigh
calcStockPnL 输入dailyRtn 字段date, sym, rethigh
calcStockPnL 输入holdingDays 含义股票持有的天数high
calcStockPnL 输出输出字段8 个字段:date, sym, signalIdx, tranche, age, ret, exposure, pnlhigh
DolphinDB 函数_dict(key,value)创建字典high
DolphinDB 函数_cj(leftTable,rightTable)交叉连接两个表high
DolphinDB 函数_isValid检查元素是否为 NULL;非 NULL 返回 1,NULL 返回 0high
DolphinDB 函数_ej(leftTable,rightTable, matchingCols,[rightMatchingCols])等值连接两个表high
运行实例市场市场范围以美国股市为例运行多因子 Alpha 策略回测high
输入日数据表 USPrices字段6 个字段:sym, date, close, RET, MV, VOLhigh
运行示例参数holdingDays5high
运行示例参数stockPercentile20high
运行示例参数signalNames`signal_mom`signal_vol`signal_beta`signal_sizehigh
运行示例流程步骤signals=genSignals(USPrices);ports=formPortfolio(signals, signalNames, stockPercentile);dailyRtn=select sym,date,ret from signals;pos=calcStockPnL(ports, dailyRtn, holdingDays);并对 pnl 聚合后绘制累计盈亏图high
图表(四因子累计盈亏)展示内容(AI 说明)展示动量、波动率、贝塔、市值四因子从 1992 至 2017 的累计盈亏(Cumulative PnL)走势;基于 DolphinDB 对 25 年美股历史数据回测生成low
图表(动量因子不同持有天数)展示内容(AI 说明)展示动量因子在五个不同持有天数(Age C1 至 C5)下的累计盈亏走势,用于分析信号随持仓时间增加的衰减情况;结果基于 DolphinDB 对上亿条盈亏记录的计算low
DolphinDB产品定位通用的分布式时序数据库,内置高效的多范式编程语言,用于量化交易开发效率高medium
多因子回测框架实现规模代码量仅用 3 个自定义函数,50 余行代码medium
回测结果明细表(盈亏明细)记录数包含 1 亿余条记录medium
单机回测性能硬件与耗时单机(4 核)执行耗时仅 50 秒(对美股 25 年市值较高股票按日回测)medium
当前回测框架覆盖范围未解决问题仅解决单个因子中股票配置;仍需解决:因子间权重配置以平衡回报与风险;新因子是否带来额外 alpha(能否由已有因子表示)high
后续内容预告下一篇文章将介绍如何使用 DolphinDB 回答因子权重配置与新因子增量 alpha 的问题high