交易回测系列一:技术信号回测

本页是一篇关于使用 DolphinDB 进行交易回测的文章,以移动平均线(MA)为例实现技术信号回测,并提供背景说明。

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

What this page covers

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

页面顶部包含限时报名推广信息与链接。

交易回测系列一:技术信号回测(文章信息与背景)

本部分给出文章标题、来源与发布日期,并说明系列目标与 MA 指标在回测中的背景。

回测场景与数据字段要求

回测考虑不止损与止损两种情况,并列出数据表所需字段。

定义 MA 信号

本部分给出 MA 交易信号的判定逻辑,并提供 maSignal 函数实现方式。

不止损回测:交易规则、实现与函数说明

本部分定义不止损回测交易规则,给出 backtest 函数输出与盈亏计算,并解释若干内置函数及数据对齐方式。

相关内置函数(文中说明)

止损回测:止损点判断与回测实现

本部分介绍 stoploss 用于判断止损点,并给出 backtest_stoploss 的实现思路(含 segmentby 与部分应用)。

文中提及的函数(用于说明)

统计信息计算

本部分提供 calcPerformance 函数,用于计算多项回测统计指标,并以字典形式返回。

运行实例:数据集、两种回测结果与图表

本部分使用美国股市 1998-2016 日频数据演示回测,分别给出不止损与止损(2.5%阈值)示例代码与部分结果,并对累计盈亏图作说明。

性能与目的说明(含参数免责声明)

本部分描述 DolphinDB 的定位与回测实现/执行方面的主张,并明确示例参数仅用于演示。

Facts Index

Entity Attribute Value Confidence
交易回测系列一:技术信号回测发布日期2021-05-14high
DolphinDB署名/来源DolphinDBhigh
本文/系列文章目的介绍如何使用 DolphinDB 进行交易回测,并以移动平均线(MA)为例实现技术信号回测high
移动平均线指标(MA)指标类型趋势指标high
移动平均线指标(MA)作用/价值描述除指示趋势外,可用于避免股价下跌错失清仓、减少收益损失并及时止损,也可避免股价上涨错失买入时机从而获得更高收益low
回测过程考虑的两种情况不止损回测与止损回测high
数据表需要包含字段sym(股票代码)、date(日期)、close(收盘价格)high
MA 信号判定规则短期均线大于长期均线时认为是 MA 交易信号high
maSignal(x, shortHorizon, longHorizon)实现方式signal = mavg(x, shortHorizon) > mavg(x, longHorizon),并将前 min(x.size(), longHorizon-1) 的信号置为 NULLhigh
不止损回测交易算法买入规则若 prevSignal=false 且 signal=true,则买入多头头寸(long position)high
不止损回测交易算法卖出规则若 prevSignal=true 且 signal=false,则卖出空头头寸(short position)high
不止损回测交易算法持仓保持规则若不符合买入或卖出规则,则保持与前一天相同的头寸high
backtest(t)输出字段/盈亏计算返回 sym,date,close,signal,position,以及 pnl=position*(close - prevClose)(仅保留 isValid(position) 的记录)high
backtest(t)头寸计算含义position=1 表示买入,position=-1 表示卖出,position=NULL 表示保持不变high
_iif(condition, trueResult, falseResult)函数说明满足 condition 返回 trueResult,否则返回 falseResult;相当于 if...else 且语法更简洁high
_int()函数说明返回 int 类型的 NULL 值high
_prev(x)函数说明把向量中所有元素向右移动一个位置high
_ffill(x)函数说明使用 NULL 值前的非 NULL 元素填充向量中的 NULL 值high
_isValid()函数说明检查元素是否为 NULL;为 NULL 返回 0,否则返回 1high
backtest(t)数据对齐方法使用 prev() 将前一天收盘价 prevClose 与前一天信号 prevSignal 与当天数据对齐以便计算high
stoploss(ret, threshold)输入/输出返回布尔类型向量 indicator,用于判断是否需要止损high
stoploss(ret, threshold)回撤与阈值触发规则计算 cumret=cumprod(1+ret),drawDown=1 - cumret/cumret.cummax();当 drawDown >= threshold 时认为应当止损,并将 firstCutIndex=at(drawDown>=threshold).first()+1high
firstCutIndex 计算加 1 的原因说明由于到股市收盘时才知道是否需要止损或止盈,所以 firstCutIndex 要加 1high
stoploss(ret, threshold)indicator 赋值规则indicator 初始全为 false;若 firstCutIndex 有效且小于 ret.size(),则 indicator[firstCutIndex:] 设为 truehigh
_cumprod函数说明计算累计乘积high
_cummax函数说明计算累计最大值high
_at(x)函数说明x 为布尔表达式,找出符合条件 x 的元素的位置high
_first函数说明返回第一个元素high
_take(x, k)函数说明返回包含 k 个 x 的向量high
backtest_stoploss(t, thresholdDrawDown)计算内容在计算 pnl=position*(close-prevClose) 的同时计算 ret=(close-prevClose)/prevClose,并生成 stoplossIndhigh
backtest_stoploss(t, thresholdDrawDown)止损信号生成方法stoplossInd = segmentby(stoploss{,thresholdDrawDown}, ret, position)(按 sym context)high
backtest_stoploss(t, thresholdDrawDown)止损前后盈亏对比输出返回 pnl * stoplossInd 作为 pnl,并保留 pnl 作为 nostoplossPnl(字段名 nostoplossPnl)high
_segmentby(func, funcArgs, segment)函数说明将 funcArgs 按 segment 的连续相同元素分组,并对每个组应用 funchigh
segmentby 示例输入与输出x=1 2 3 0 3 2 1 4 5,y=1 1 1 -1 -1 -1 1 1 1,segmentby(cumsum,x,y) 输出 1 3 6 0 3 5 1 5 10high
stoploss{, thresholdDrawDown}表达式含义定义部分应用,用于固定 stoploss 的第二个参数 thresholdDrawDownhigh
backtest_stoploss 函数说明分段依据按 position 的阶段分组:连续多个 1 表示持续买入、连续多个 -1 表示持续卖出、连续多个 NULL 表示持续不变high
calcPerformance(pnl)返回类型返回字典(dict(STRING, DOUBLE))high
calcPerformance(pnl)计算指标cumpnl=pnl.sum(), avgpnl=pnl.avg(), days=pnl.size(), std=pnl.std(), maxDrawdown=(pnl.cumsum().cummax()-pnl.cumsum()).max()high
运行实例数据集数据范围与频率使用美国股市从 1998 年到 2016 年股票的每日交易信息high
运行实例数据集记录数共包含 3474 万条记录high
MA 信号示例计算参数设置maSignal(close, 50, 100) 作为 signalhigh
止损回测示例阈值设置预设阈值设为 2.5%(positions = backtest_stoploss(t, 0.025))high
不止损回测示例结果表(节选)股票 A 的指标cumpnl=48.75, avgpnl=0.0108, days=4,513., std=1.5895, maxDrawdown=106.55high
不止损回测示例结果表(节选)股票 AA 的指标cumpnl=7.9625, avgpnl=0.0017, days=4,624., std=1.131, maxDrawdown=119.75high
不止损回测累计盈亏图(AI 说明)最终累计盈亏(约)最终累计盈亏约为 100,000low
止损回测示例结果表(节选)股票 A 的指标(止损)cumpnl=58.2775, avgpnl=0.0129, days=4,513., std=1.5731, maxDrawdown=102.125high
止损回测示例结果表(节选)股票 AA 的指标(止损)cumpnl=20.47, avgpnl=0.0044, days=4,624., std=1.1126, maxDrawdown=110.8125high
止损回测累计盈亏图(AI 说明)峰值累计收益(接近)峰值接近 200,000,并称加入止损后最终累计收益显著提升low
DolphinDB database产品定位描述通用的分布式时序数据库,内置高效的多范式编程语言,开发效率高low
回测实现代码量(不考虑止损)MA 信号计算代码行数3 行代码计算 MA 信号medium
回测实现代码量(不考虑止损)回测代码行数3 行代码进行回测medium
不止损回测执行性能(文中声明)执行耗时对美国股市 18 年全部股票按日回测,不止损回测执行耗时仅 4 秒多low
止损回测执行性能(文中声明)执行耗时止损回测仅 7 秒多low
本文目标读者/目的说明从技术上帮助金融工程师使用 DolphinDB 快速实现交易回测high
文中示例参数免责声明/适用性说明长短线时间、止损阈值、数据过滤方法等参数仅用于演示,并非实践中的最佳参数high
技能认证特训营第二期报名链接https://www.qingsuyun.com/h5/e/217471/5/high