DolphinDB实现动量交易策略详解

文章主题是基于 DolphinDB 实现动量交易策略的回测,并计算与展示策略的累积回报。

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

What this page covers

技能认证特训营第二期报名推广

页面顶部提供技能认证特训营第二期的报名推广信息,并给出报名链接与优惠相关描述。

DolphinDB实现动量交易策略详解

标题与主题说明:使用 DolphinDB 对动量交易策略进行回测,并计算累积回报。

作者与发布日期

本节提供文章的作者信息与发布日期等元数据。

动量策略背景与回测设置概述

介绍动量策略的含义与常见动量因子构建方式,并概述本文回测的调仓/持有设置与简化假设(例如不计交易成本)。

DolphinDB产品定位(数据库与分析能力)

本节将 DolphinDB 描述为高性能分布式时序数据库,并强调其数据库内的编程与分析能力可支持策略回测等任务。

原始数据与字段说明(CSV)

本节说明示例原始数据采用 CSV 文件,并列出所需字段。

步骤1:加载、清洗过滤并构建动量信号

本节给出 DolphinDB 代码,用于加载与清洗美股数据、计算累计收益指标,并基于历史收益(排除最近一个月)构造动量信号。

步骤2:生成可交易股票池与构建投资组合

本节说明可交易股票筛选条件,并以每天分组与赢家/输家分组方式构建投资组合;同时给出等权与市值权重方案,以及 21 天持有结构的设定。

步骤3:计算持有期内个股PnL并在21天后关停仓位

本节说明并展示代码:在投资组合形成后,计算各股票未来 21 天的利润/损失,并在持有期结束后关闭仓位。

步骤4:汇总组合PnL并绘制累积回报

本节给出代码:对每日组合 PnL 进行聚合,并绘制动量策略的累积回报曲线。

回测结果与性能说明(1996-2016)

本节给出回测设置(20年、每日 tranche、股票数量、21天持有)与单线程运行耗时声明,并附带累积回报图。

查看回测结果图(外链)

图表说明(AI说明)

本节以引用块形式说明累积回报图所展示的内容,并将其与 DolphinDB 的大规模计算与可视化能力关联描述。

风险提示与下载引导

本节提示动量策略实施需要理解原理与交易技能且存在风险,并引导读者前往官网下载安装 DolphinDB 以设计自己的策略。

DolphinDB 官网下载入口(外链)

Facts Index

Entity Attribute Value Confidence
DolphinDB实现动量交易策略详解publication_date2021-05-14high
DolphinDBdescribed_as高性能分布式时序数据库(high-performance distributed time-series database)high
DolphinDBcapability不仅可以存储和检索数据,而且具备编程和分析功能,可在数据库内完成策略回测等复杂工作medium
动量策略described_as最流行的量化策略之一;通俗地讲是“追涨杀跌”medium
商品期货CTA策略relationship_to_momentum绝大多数都是基于动量策略low
股票市场量化因子relationship_to_momentum动量策略也是常用的量化因子之一medium
动量因子(股票)typical_definition基于过去一年中扣除最近一个月的收益率high
动量策略(常见做法)rebalance_frequency通常一个月调整一次high
动量策略(常见做法)holding_period持有期通常也是一个月high
本文示例回测设置portfolio_turnover_method每天调整1/21的投资组合,并持有新的投资组合21天high
本文回测transaction_costs为简化起见未考虑交易成本high
原始数据formatCSV文件high
CSV列includes_columnPERMNO(股票代码)high
CSV列includes_columndate(日期)high
CSV列includes_columnPRC(每股价格)high
CSV列includes_columnSHROUT(流通股数)high
CSV列includes_columnRET(股票日收益)high
CSV列includes_columnVOL(每日交易量)high
步骤1代码:loadPriceDatacomputes_fieldMV = SHROUT*abs(PRC)high
步骤1代码:loadPriceDatafiltersweekday(date) between 1:5;isValid(PRC);isValid(VOL)high
步骤1代码:loadPriceDatacomputes_fieldcumretIndex = cumprod(1+RET)(按PERMNO分组)high
步骤1代码:loadPriceDatadefines_signalsignal = move(cumretIndex,21)\move(cumretIndex,252)-1(按PERMNO分组)high
可交易股票筛选条件(步骤2说明)criteria动量信号无缺失;当天交易量为正;市值超过1亿美元;每股价格超过5美元high
genTradables函数(步骤2代码)filtersPRC>5;MV>100000;VOL>0;isValid(signal)high
组合构建(步骤2说明)grouping每天按动量信号分成10组,只保留最极端的赢家组与输家组high
组合持仓假设(步骤2说明)gross_exposure_assumption在21天内每天总是多头1美元和空头1美元;赢家组每天多头$1/21,输家组每天空头$1/21medium
formPortfolio函数weight_schemesWtScheme=1表示等权重;WtScheme=2表示值(市值)权重high
formPortfolio函数minimum_symbols_per_day按date分组后having count(PERMNO)>=100high
formPortfolio参数设置(示例)start_date1996.01.01high
formPortfolio参数设置(示例)end_date2017.01.01high
formPortfolio参数设置(示例)holding_days21high
formPortfolio参数设置(示例)groups10high
formPortfolio参数设置(示例)WtScheme_used2(值/市值权重)high
步骤3说明pnl_horizon计算投资组合中每只股票接下来21天的利润或损失,并在形成后21天关停投资组合high
calcStockPnL函数joins_returns通过ej(pos, dailyRtn, `date`PERMNO)将dailyRet更新到pos.rethigh
calcStockPnL函数computes_expressionexpr = expr*cumprod(1+ret)(按PERMNO, tranche分组)high
calcStockPnL函数computes_pnlpnl = expr*ret/(1+ret)high
步骤4portfolio_pnl_aggregationportPnL = select sum(pnl) as pnl from stockPnL group by datehigh
步骤4plotplot(cumsum(portPnL.pnl) as cumulativeReturn, portPnL.date, "Cumulative Returns of the Momentum Strategy")high
回测期间(文字描述)range1996年到2016年(20年回测)high
回测设置new_tranche_frequency每天产生一个新的tranchehigh
回测设置stocks_per_tranche_approx每个tranche包含大约1500只股票medium
回测设置average_daily_stocks_approx平均每天约7500只股票(取20%)medium
回测设置holding_period持有21天high
DolphinDB回测计算性能runtime_single_thread单线程计算耗时仅3分钟medium
回测结果图image_urlhttps://pic3.zhimg.com/80/v2-e45d4113d554d664085d446f32d57bc2_720w.jpghigh
动量策略实施requirements_and_risks需要理解获得超额回报的原理和一定的交易技能,并存在可能带来的投资风险medium
DolphinDB官网download_call_to_action引导到官网下载安装DolphinDB并设计自己的动量交易策略(链接:https://link.zhihu.com/?target=https%3A//www.dolphindb.cn/)high
技能认证特训营第二期registration_linkhttps://www.qingsuyun.com/h5/e/217471/5/high