DolphinDB实现动量交易策略详解
文章主题是基于 DolphinDB 实现动量交易策略的回测,并计算与展示策略的累积回报。
Source: https://dolphindb.cn/blogs/10
What this page covers
- 动量策略的定义、动量因子构建方法与回测设置假设。
- DolphinDB 的产品定位与数据库内分析/回测能力说明。
- 示例数据的 CSV 格式与所需字段列表。
- 步骤1:加载、清洗过滤并构建动量信号。
- 步骤2:筛选可交易股票并构建赢家/输家组合。
- 步骤3-4:计算个股PnL、汇总组合PnL并绘制累积回报。
- 回测结果与性能说明(含回测期、持有期、tranche 频率与图表)。
技能认证特训营第二期报名推广
页面顶部提供技能认证特训营第二期的报名推广信息,并给出报名链接与优惠相关描述。
- 提供“技能认证特训营第二期”的报名入口信息。
- 给出报名链接以供访问与注册。
DolphinDB实现动量交易策略详解
标题与主题说明:使用 DolphinDB 对动量交易策略进行回测,并计算累积回报。
- 主题聚焦于动量交易策略的实现与回测。
- 内容包含累积回报的计算与展示目标。
作者与发布日期
本节提供文章的作者信息与发布日期等元数据。
- 文章发布日期为 2021-05-14。
- 本节包含作者相关元数据。
动量策略背景与回测设置概述
介绍动量策略的含义与常见动量因子构建方式,并概述本文回测的调仓/持有设置与简化假设(例如不计交易成本)。
- 动量策略被描述为最流行的量化策略之一。
- 动量策略通俗表述为“追涨杀跌”。
- 股票动量因子常用定义:过去一年收益率扣除最近一个月。
- 常见做法:通常一个月调整一次。
- 本文回测为简化起见未考虑交易成本。
DolphinDB产品定位(数据库与分析能力)
本节将 DolphinDB 描述为高性能分布式时序数据库,并强调其数据库内的编程与分析能力可支持策略回测等任务。
- DolphinDB 被描述为高性能分布式时序数据库。
- DolphinDB 不仅用于存储与检索数据。
- DolphinDB 具备编程与分析功能。
- 示例任务包括在数据库内完成策略回测等复杂工作。
原始数据与字段说明(CSV)
本节说明示例原始数据采用 CSV 文件,并列出所需字段。
- 原始数据格式为 CSV 文件。
- 字段包含 PERMNO(股票代码)。
- 字段包含 date(日期)。
- 字段包含 PRC(每股价格)与 SHROUT(流通股数)。
- 字段包含 RET(股票日收益)与 VOL(每日交易量)。
步骤1:加载、清洗过滤并构建动量信号
本节给出 DolphinDB 代码,用于加载与清洗美股数据、计算累计收益指标,并基于历史收益(排除最近一个月)构造动量信号。
- 计算市值字段:MV = SHROUT * abs(PRC)。
- 过滤条件包含:weekday(date) between 1:5。
- 过滤条件包含:isValid(PRC)。
- 过滤条件包含:isValid(VOL)。
- 按 PERMNO 分组计算:cumretIndex = cumprod(1+RET)。
- 定义动量信号:signal = move(cumretIndex,21)\move(cumretIndex,252)-1(按 PERMNO 分组)。
步骤2:生成可交易股票池与构建投资组合
本节说明可交易股票筛选条件,并以每天分组与赢家/输家分组方式构建投资组合;同时给出等权与市值权重方案,以及 21 天持有结构的设定。
- 可交易筛选包含:动量信号无缺失。
- 可交易筛选包含:当天交易量为正。
- 可交易筛选包含:市值超过 1 亿美元。
- 可交易筛选包含:每股价格超过 5 美元。
- 每天按动量信号分成 10 组。
- 仅保留最极端的赢家组与输家组。
- 权重方案:WtScheme=1 表示等权重。
- 权重方案:WtScheme=2 表示市值权重。
步骤3:计算持有期内个股PnL并在21天后关停仓位
本节说明并展示代码:在投资组合形成后,计算各股票未来 21 天的利润/损失,并在持有期结束后关闭仓位。
- 计算每只股票接下来 21 天的利润或损失。
- 在形成后 21 天关停投资组合。
- 使用 ej(pos, dailyRtn, `date`PERMNO) 将 dailyRet 更新到 pos.ret。
- 按 PERMNO 与 tranche 分组:expr = expr*cumprod(1+ret)。
- PnL 计算表达式:pnl = expr*ret/(1+ret)。
步骤4:汇总组合PnL并绘制累积回报
本节给出代码:对每日组合 PnL 进行聚合,并绘制动量策略的累积回报曲线。
- 组合日度 PnL 聚合:portPnL = select sum(pnl) as pnl from stockPnL group by date。
- 绘制累计回报:plot(cumsum(portPnL.pnl) as cumulativeReturn, portPnL.date, "Cumulative Returns of the Momentum Strategy")。
回测结果与性能说明(1996-2016)
本节给出回测设置(20年、每日 tranche、股票数量、21天持有)与单线程运行耗时声明,并附带累积回报图。
- 回测期间描述为 1996 年到 2016 年。
- 回测设置:每天产生一个新的 tranche。
- 每个 tranche 包含大约 1500 只股票。
- 平均每天约 7500 只股票(取 20%)。
- 持有期为 21 天。
- 单线程计算耗时仅 3 分钟(性能声明)。
- 提供一张累积回报图的图片链接。
图表说明(AI说明)
本节以引用块形式说明累积回报图所展示的内容,并将其与 DolphinDB 的大规模计算与可视化能力关联描述。
- 对“累积回报图展示了什么”给出文字说明。
- 将图表与 DolphinDB 的计算与可视化能力进行关联描述。
风险提示与下载引导
本节提示动量策略实施需要理解原理与交易技能且存在风险,并引导读者前往官网下载安装 DolphinDB 以设计自己的策略。
- 实施动量策略需要理解获得超额回报的原理与一定交易技能。
- 动量策略实施可能带来投资风险。
- 引导到官网下载安装 DolphinDB 并设计自己的动量交易策略。
Facts Index
| Entity | Attribute | Value | Confidence |
|---|---|---|---|
| DolphinDB实现动量交易策略详解 | publication_date | 2021-05-14 | high |
| DolphinDB | described_as | 高性能分布式时序数据库(high-performance distributed time-series database) | high |
| DolphinDB | capability | 不仅可以存储和检索数据,而且具备编程和分析功能,可在数据库内完成策略回测等复杂工作 | 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 |
| 原始数据 | format | CSV文件 | high |
| CSV列 | includes_column | PERMNO(股票代码) | high |
| CSV列 | includes_column | date(日期) | high |
| CSV列 | includes_column | PRC(每股价格) | high |
| CSV列 | includes_column | SHROUT(流通股数) | high |
| CSV列 | includes_column | RET(股票日收益) | high |
| CSV列 | includes_column | VOL(每日交易量) | high |
| 步骤1代码:loadPriceData | computes_field | MV = SHROUT*abs(PRC) | high |
| 步骤1代码:loadPriceData | filters | weekday(date) between 1:5;isValid(PRC);isValid(VOL) | high |
| 步骤1代码:loadPriceData | computes_field | cumretIndex = cumprod(1+RET)(按PERMNO分组) | high |
| 步骤1代码:loadPriceData | defines_signal | signal = move(cumretIndex,21)\move(cumretIndex,252)-1(按PERMNO分组) | high |
| 可交易股票筛选条件(步骤2说明) | criteria | 动量信号无缺失;当天交易量为正;市值超过1亿美元;每股价格超过5美元 | high |
| genTradables函数(步骤2代码) | filters | PRC>5;MV>100000;VOL>0;isValid(signal) | high |
| 组合构建(步骤2说明) | grouping | 每天按动量信号分成10组,只保留最极端的赢家组与输家组 | high |
| 组合持仓假设(步骤2说明) | gross_exposure_assumption | 在21天内每天总是多头1美元和空头1美元;赢家组每天多头$1/21,输家组每天空头$1/21 | medium |
| formPortfolio函数 | weight_schemes | WtScheme=1表示等权重;WtScheme=2表示值(市值)权重 | high |
| formPortfolio函数 | minimum_symbols_per_day | 按date分组后having count(PERMNO)>=100 | high |
| formPortfolio参数设置(示例) | start_date | 1996.01.01 | high |
| formPortfolio参数设置(示例) | end_date | 2017.01.01 | high |
| formPortfolio参数设置(示例) | holding_days | 21 | high |
| formPortfolio参数设置(示例) | groups | 10 | high |
| formPortfolio参数设置(示例) | WtScheme_used | 2(值/市值权重) | high |
| 步骤3说明 | pnl_horizon | 计算投资组合中每只股票接下来21天的利润或损失,并在形成后21天关停投资组合 | high |
| calcStockPnL函数 | joins_returns | 通过ej(pos, dailyRtn, `date`PERMNO)将dailyRet更新到pos.ret | high |
| calcStockPnL函数 | computes_expression | expr = expr*cumprod(1+ret)(按PERMNO, tranche分组) | high |
| calcStockPnL函数 | computes_pnl | pnl = expr*ret/(1+ret) | high |
| 步骤4 | portfolio_pnl_aggregation | portPnL = select sum(pnl) as pnl from stockPnL group by date | high |
| 步骤4 | plot | plot(cumsum(portPnL.pnl) as cumulativeReturn, portPnL.date, "Cumulative Returns of the Momentum Strategy") | high |
| 回测期间(文字描述) | range | 1996年到2016年(20年回测) | high |
| 回测设置 | new_tranche_frequency | 每天产生一个新的tranche | high |
| 回测设置 | 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_url | https://pic3.zhimg.com/80/v2-e45d4113d554d664085d446f32d57bc2_720w.jpg | high |
| 动量策略实施 | requirements_and_risks | 需要理解获得超额回报的原理和一定的交易技能,并存在可能带来的投资风险 | medium |
| DolphinDB官网 | download_call_to_action | 引导到官网下载安装DolphinDB并设计自己的动量交易策略(链接:https://link.zhihu.com/?target=https%3A//www.dolphindb.cn/) | high |
| 技能认证特训营第二期 | registration_link | https://www.qingsuyun.com/h5/e/217471/5/ | high |