Starfish 因子开发管理平台快速上手:如何完成策略编写与回测

DolphinDB 开发的因子开发管理平台 Starfish 围绕量化投研的因子、策略开发阶段设计,为用户提供了一个从数据管理、因子研究到策略回测的完整解决方案。

因子平台的回测引擎提供了多个关键的事件函数 ,涵盖策略初始化、每日盘前和盘后回调、逐笔、快照和K线行情的回调,以及订单委托和成交回报函数。通过在策略初始化函数中定义指标,并在相应的回调函数中编写自定义策略逻辑,用户可以灵活地实现自己的交易策略。此外,因子平台还支持多样化的回测结果展示,用户可以通过数据报告和内置可视化报告直观地评估策略表现。这些可视化工具不仅帮助用户深入分析收益来源和风险因素,还能有效监控策略的执行效果,助力更为精准的策略优化。

本文将详细展示如何使用 DolphinDB 因子开发管理平台完成策略编写、回测运行。

Starfish 安装部署可参考 DolphinDB:Starfish 因子开发管理平台快速上手丨因子开发篇

Starfish 因子开发管理平台 license 需申请试用,请点击 联系我们 - DolphinDB 填写表单,留言备注试用因子平台!

1. 策略开发与回测

在金融市场中,策略的开发与回测是投资成功的核心。Starfish 因子开发管理平台提供了一系列工具,帮助用户有效创建和验证交易策略,从而优化投资决策。

1.1 策略开发

策略开发是回测流程的起点。用户首先需要创建一个新的回测策略,选择相关的市场类型,如股票或期货,确定数据和回测类型,以及定义策略的基本信息如名称和描述。这一步是整个回测流程的基础,设定了后续操作的参数。具体的创建参数有:

  1. 名称:策略名称
  2. 回测类型:策略的品种,包含股票、期货、期权、债券。
  3. 行情类型:输入行情的类型,包含快照、分钟频率、快照频率;对于股票,还支持逐笔+快照或者快照+成交。
  4. 数据类型:TABLE 或者 DICT,代表进入回测的行情类型,具体会影响到在策略编写时如何拿取行情。例如,如若选择 TABLE,那么,需要用 for 循环的方式拿取每个时间中的每一条行情;如若选择 DICT,则可以拿 key 直接访问到行情。因此如果要追求更高的性能,更推荐使用 DICT 方式。
  5. 标签:用户自定义的标签。
  6. 备注:用户自定义的标签。

1.2 策略代码

在确定策略框架后,编写策略代码是关键一步。通过定义一系列事件函数,用户可以实现对市场数据的响应,确保策略的逻辑和执行能够与市场动态保持一致。

事件函数 说明
def initialize(mutable context){} 策略初始化函数,只触发一次。可以在该函数中初始化一些变量,或者订阅指标计算。回调函数传入参数 context 为逻辑上下文,是由回测引擎创建的字典变量
def beforeTrading(mutable context){} 策略盘前交易函数,每日盘前触发一次。可以在该函数中一些启动前的准备,如订阅行情等
def onTick(mutable context, msg,indicator){} 逐笔行情通知函数,行情更新时的处理函数,逐笔委托和成交。在股票的逐笔+快照类型回测时不需要indicator参数。
def onSnapshot(mutable context, msg,indicator){} 快照行情通知函数,在股票的逐笔+快照类型回测时不需要indicator参数。
def onBar(mutable context, msg,indicator){} k线行情通知函数。
def onOrder(mutable context,orders){} 委托回报通知函数,每个订单状态有变化时会触发。
def onTrade(mutable context,trades){} 成交回报通知函数,有成交时会触发。
def afterTrading(mutable context){} 策略每日盘后回调函数,每日盘后触发一次。可以在该函数统计当日的成交等信息
def finalize(mutable context){} 策略结束之后回调函数

重要参数解释:

  • context :逻辑上下文,是由回测引擎创建的字典变量。策略的所有自定义变量都可以设置在 context 中。自动包含以下 4 个变量:

    • context["tradeTime"] 获取行情的最新时间
    • context["tradeDate"] 获取当前日期
    • context["BarTime"] 快照降频为低频行情时的当前期 Bar 时间戳
    • context["engine"] 获取回测引擎实例。
  • msg:回测引擎传入最新的行情。在 onTick 中即为 tick 行情,在 onSnapshot 中即为快照行情,在 onBar 中即为K线行情。

  • indicator:在初始化函数 initialize 中通过引擎接口 subscribeIndicator 自动订阅计算,以方便用户在后续策略中使用。indicator 集成了流数据处理方案,可以操作滑动窗口计算。

例如,在 initialize 函数中定义了指标 rsi:

复制代码
def initialize(mutable context){
  d = dict(STRING,ANY)
  d["rsi"]=<ta::rsi(close,5)>  // 使用内置ta因子模块中的rsi因子
  Backtest::subscribeIndicator(context['engine'],'kline',d)
}

在回调函数中引用指标或者行情:

复制代码
def onBar(mutable context, msg, indicator=NULL){
  for (stock in msg.keys()){
    close = msg[stock]['close'] // 获取标的的收盘价
    rsi = indicator[stock]['rsi'] // 获取标的rsi指标
  }
} // 假定msg为字典

其余的参数介绍,可以在策略编辑页面右上角辅助文档按钮打开,包含了传入的行情的具体字段,方便用户进行回调函数的编写:
1-1 策略代码编辑页面

1.3 回测引擎参数

配置回测引擎参数是运行回测前的重要环节。用户需设定初始资金、手续费等核心参数,以模拟真实交易环境,确保策略的有效性。其中,以下的参数配置为必填项:

key 说明 备注
startDate 开始日期
endDate 结束日期
cash 初始资金
commission 手续费
tax 印花税
frequency frequency>0时,行情为逐笔行情,引擎内部合成 frequency 频率的行情触发 onSnapshot 默认为0,合成频率为0,指自动合成

配置完这些必填参数后,理论上即可运行一个回测任务。但对于不同的策略类型(股票、期货、期权和债券),引擎还会有额外不同的参数配置,具体的参数配置和介绍可以参考回测文档 Backtest

1.4 行情数据

行情数据的字段及类型主要基于 DolphinDB 回测引擎对数据结构范式的规定:一般来说用户从不同交易所、数据库获取各种股票数据,包括逐笔委托订单数据、快照数据、逐笔成交数据和 k 线数据。然而,这些数据来源各异,具有不同的结构和范式,对每一栏数据的含义、格式和取值也缺乏统一的规范。因此,用户在使用回测功能时,需要先确认数据结构的正确性。

在因子平台的策略与回测功能中,输入的行情数据源会是运行设定的一部分,具体在预设的第二步中。可以看到,平台中支持两种方式的数据源入参方式:
1-2 回测参数 - 设置数据源

  • 已有库表:选择当前用户可访问的库表,及其与目标字段的对应关系。只能选择数据类型与目标数据类型相同的字段。
  • 自定义计算:用户可以使用 SQL 的查询函数进行表的重构,或是使用公共函数库内的函数对已有的数据源进行处理,将最后的结果赋值为 result。在编写代码时,可以点击"计算代码"旁边的问号按钮查看此回测任务需要的目标行情数据源具体的列名、类型以及解释。

1-3 回测参数 - 设置数据源 - 计算代码

2. 回测结果解析

在因子平台中,回测结果的呈现方式主要分为数据报告和可视化报告两大类。

2.1 数据报告

数据报告提供了回测引擎返回的五个关键结果表格,涵盖了策略收益、每日权益、持仓情况等核心指标。这些数据不仅便于用户快速预览回测结果,还支持CSV格式下载,方便后续分析与分享。

数据报告中包含了回测引擎返回的 5 个结果表格:

表名 含义
getReturnSummary 策略的收益概述
getDailyTotalPortfolios 策略每日权益指标
getDailyPosition 每日持仓数据详情
getTradeDetails 交易明细表
getPosition 持仓信息

每个部分结果默认展示前 10 行,可以在表格下方切换页数查看 10 行以后的数据。每个表格的字段根据策略类型略有不同,例如对于期货分钟频,getReturnSummary 和 getDailyTotalPortfolios 结果为:

2-1 回测结果 - 数据报告

用户可以通过数据报告对回测的结果有一个大概的预览,并且可以点击每个表格右上角的下载按钮下载此表格为 csv 文件。

2.2 可视化报告

因子平台的内置可视化报告分为六个部分,为用户提供了丰富的策略分析视角。通过图表和可视化数据,用户可以直观地把握策略的核心执行结果、收益变化和持仓状况,从而实现对策略性能的深入评估。

  1. 策略概述:汇总并展示策略的核心执行结果,包括基本统计和性能指标。数据源自 getReturnSummary,这为用户提供了一个快速把握策略效果的视图。
    2-2 回测可视化报告 - 策略概述

  2. 收益详情:该部分通过三个标签页展示不同的收益数据:

  • 每日收益率/盈亏:展示每一交易日的收益变化,帮助用户追踪策略的短期表现。

2-3 回测可视化报告 - 每日收益率/盈亏

  • 账户单位净值:展示账户净值的时间序列变化,反映策略从长期角度的资本增长。

2-4 回测可视化报告 - 账户单位净值

  • 累计收益率:展示从策略启动至今的总收益率,为评估整体投资回报提供依据。

2-5 回测可视化报告 - 累计收益率

  1. 交易分析:包含了从开始日期到结束日期开仓的所有标的的行情及买卖信号的可视化图表。可以根据日期和标的进行筛选。也可以在这个图中观察在 initialize 中使用 subscribeIndicator 订阅的指标。例如在下图中,此策略订阅了 3 个指标:rsi、prevMacd、macd,即可在交易分析图中进行点击查看。对于分钟频率或者日频的策略,行情价格对应收盘价;对于快照数据,则对应行情中的 lastPrice。

2-6 回测可视化报告 - 交易分析

  1. 持仓详情:包含了从开始日期到结束日期策略每日的持仓状况,用户可按时间及标的物筛选,直观了解持仓变动。此部分有助于用户监控策略的持仓风险和市场敞口。

2-7 回测可视化报告 - 持仓详情

  1. 账户详情:包含了从开始日期到结束日期的账户详情,如提供策略运行期间的详细账户情况,如资产总值、现金余额等。根据策略类型的不同,返回的字段不同。例如,对于股票来说,包含以下信息:
    2-8 回测可视化报告 - 账户详情

  2. 订单详情:包含了从开始日期到结束日期每个开仓的标的所产生的订单详情,包括订单提交、成交至订单成功等状态。用户可以根据日期及标的进行筛选。对于每一笔成交的交易,都会有提交及下单成功两条交易。

2-9 回测可视化报告 - 订单详情

总体而言,这些内置可视化报告为用户提供了一个全面、多维的视角来评估和优化他们的交易策略,实现了对策略性能深入的可视化分析,同时利用低代码环境来充分利用 DolphinDB 的高效数据处理能力。

3. 回测进阶用法

在进行策略回测时,深入掌握进阶用法能够显著提升策略优化的效率和效果。因子平台为用户提供了灵活的工具,以满足多样化的策略需求,包括自定义参数寻优和绩效归因分析,这些功能使得策略开发和评估变得更加精准和系统化。

3.1 自定义参数寻优

在策略开发中,经常需要调整多个参数以达到最佳的市场表现。这些参数可能包括窗口大小、最大买卖价差、报价金额、对冲偏移量、价格波动等。因子平台提供了一个强大的自定义参数寻优功能,使得策略优化过程更加直观和灵活。

首先,在策略的编写阶段,开发者可以通过 userParams 字典传入策略函数来使用自定义参数。userParams 是一个由开发者自行定义的键值对集合,使策略在运行时能够调用这些自定义设置。
3-1 策略用例代码编写页面 - 初始化函数

在策略的回测参数设置中,开发者可以详细配置每个参数的候选值。具体的键值对可以在回测参数第三步中设置:
3-2 策略用例回测参数 - 自定义参数

例如上图的 CTA 策略想基于 MACD 指标记录买入卖出信号,但对于指标中的参数 shortWindowN 和 longWindowN 要进行参数的寻优。因此,可以在回测设置的自定义参数模块中给 initialize 函数中的 userParams 自定义参数字典加入键值,也就是名称,以及对应的值的选项。在代码编辑页中的 initialize 中,就可以通过 userParams[参数名称] 的方式访问到对应的值。例如,在上图代码框中,要提取 shortWindowN 的值,即可使用 userParams["shortWindowN"]拿取。

需要注意的是,所有的值都是字符串的形式,因此在真正使用的时候,需要对非字符串的值进行一层类型转换。例如 shortWindowN 为整数类型,则需要使用的时候使用 int(userParams["shortWindowN"])拿取到整数类型的窗口大小。

因为在这里设定了多个值,就会产生多个回测任务,在第六步参数组合中,即可查看共有几种参数组合。
3-3 策略用例回测参数 - 参数组合

3.2 绩效归因

绩效归因是评估和优化策略的重要手段,通过对策略回测结果的深入分析,可以了解策略的收益来源和风险因素,从而改进策略表现。本节将介绍如何在平台上创建和使用绩效归因模板,对历史回测结果进行可视化评价。因子平台中的绩效归因模板可以通过自定义的方式来评价策略结果。所有用户创建的模板都是公开的,用户可以查看和使用平台上所有的模板,但只能编辑和删除自己的模板。

首先,用户需在平台的"策略与回测"模块中找到并点击"绩效归因"选项,进入模板列表页面。在此页面中,所有可用的绩效归因模板均已列出。用户可通过点击页面上的"创建"按钮,启动新模板的创建过程。在此过程中,需要填写以下必要参数:

  • 模板名称
  • 描述:可以简要记录模板的用途和特点。
  • 标签:添加相关标签,便于分类和搜索。

3-4 新建绩效归因模板

创建成功后,即可跳转入绩效归因的编辑页面,该页面分为两个主要部分:模板参数和模板代码。

  • 模板参数:从概念上讲,绩效归因模板是通过函数调用实现对历史回测结果的深入计算。在模板参数部分,有一个控件类型为策略运行记录选择器,用于选择进行归因分析的结果对象。其余参数则包括归因时间及归因方法。在设置每个参数时,需明确每个参数的名称、控件类型及默认值。

3-5 绩效归因模板编辑 - 模板参数

  • 模板代码:在这一部分,平台会自动生成函数定义及其对应的参数提取方式。在撰写绩效归因代码时,用户只需直接使用参数名即可获取相应的参数值,进而对策略结果及相关参数进行进一步计算和整理。需注意,函数的返回值必须是字典类型,以保证数据的结构性。

3-6 绩效归因模板编辑 - 模板代码

在完成代码编辑后,用户可以点击代码框右上角的"查看运行结果"按钮,进行模板及默认参数值的试运行,以确保所得到的结果符合预期。

在因子平台中,我们内置了 Brinson 和 Campisi 两个绩效归因模板以及相对应的函数模块库。对于每个模板的实现方式和结果含义可以参考基于 DolphinDB 的 Brinson 绩效归因模型实践基于 DolphinDB 的 Campisi 绩效归因模型实践

  • Brinson:Brinson 绩效归因一般用于股票组合,具体的参数解释如下:
参数名称 含义
backtestResult 历史回测结果
method Brinson 的归因方式,默认值为 BHB。可选值为 BHB 和 BF
multiPeriod 是否多期归因
showAll 是否展示每期结果
multiPeriodMethod 多期归因的方式,默认是为 grap。可选值为 grap 和 sum
industryClassCode 行业分类表代码。在这里填写如何获取股票的代码及对应的行业表格。如若不填,则不以行业进行归因,而是将每个股票当作一个行业进行归因分析
selfDefinedBenchmark 是否自定义基准
benchmarkCode 获取基准持仓表的代码,需要有 symbol 和 weight 两列。
  • Campisi:Campisi 绩效归因适用于债券组合的回测结果,具体的参数解释如下:
参数名称 含义
backtestResult 历史回测结果
treasuryCurveCode 获取国债曲线表格的代码。如若不填,则使用模拟数据
convexity 是否考虑凸性
benchmark 是否选择有基准归因
benchmarkPositionCode 获取基准持仓表的代码,需要有 symbol 和 weight 两列
industryCurveCode 获取行业曲线表格的代码,如若不填,则使用模拟数据
multiPeriod 是否多期归因

4. 回测实战用例

本节将通过股票快照策略和和股票日频策略的具体案例,介绍因子开发管理平台的策略开发与回测功能。

4.1 股票快照策略

4.1.1 策略开发

在策略与回测页面下我的策略中,可以创建新策略,选择相应的策略、行情、消息类型后就会跳转此策略的编辑页面。

  • 在策略初始化函数中,此策略定义了一个指标 maxVolatility_1m,为当前 tick 相比于上一个 tick 的收益率。subscribeIndicator 接口获取回测引擎名、需要计算的数据类型(如 snapshot、tick 等)、需要计算的指标字典(key为指标名,用于之后访问;value为指标计算的元代码),之后计算结果将传入 onSnapshot 等策略回调函数。

4-1 stockDemo1 - 策略代码 - 初始化函数

  • 在每日盘前回调交易函数中,可以初始化当日的全局变量,并使用 Backtest::setUniverse 订阅设定当日的股票池。

4-2 stockDemo1 - 策略代码 - 策略盘前交易函数

  • 在快照行情通知函数中,编写基于快照行情的策略逻辑。可以根据行情及策略信号下达委托买卖订单。onSnapshot 中的 msg 参数中包含了最新的快照行情以及在初始化中订阅的指标。例如,在 Demo 中,我们可以计算出的 maxVolatility_1m 值来判断是否需要下达委托买的订单。Backtest::submitOrder 是回测引擎提供的下单接口。

4-3 stockDemo1 - 策略代码 - 快照行情通知函数

因此本策略的主要逻辑为:如果最新价相比于前价涨幅超过1%,则下单 000001.XSHE 的限价买单,下单时间为最新的快照时间,价格为一档卖价,股数为一档卖量。

4.1.2 回测运行

在编辑页面或者列表点击运行按钮后,就会弹出需要选择的预设参数。对于内置的两个策略 Demo,我们也提供了对应的预设参数。例如,stockDemo1 对应的预设为 stockDemo1_preset。点击后,所需要的参数就会自动填充完成。
4-4 stockDemo1 - 策略回测预设 - 选择预设

4-5 stockDemo1 - 策略回测预设 - 设置参数

  • 设置数据源:此预设中因为我们没有数据,因此使用的是两条模拟的 tick 数据

4-6 stockDemo1 - 策略回测预设 - 设置数据源

  • 设置自定义参数:用于参数寻优,在 Demo2 中会详细介绍使用方法
  • 设置可视化模板:用于选择可视化的模板。如果不选,则默认使用内置的可视化模板
  • 设置绩效归因:选择绩效归因模板以及对应的参数
  • 参数组合:帮助确认已填的参数会产生的回测任务数量

在设置完所有参数后点击运行即可进入运行的详情页面。当然,如果已经设置好所有所需的参数,可以在任一步骤中点击运行。

4.1.3 回测结果

回测的结果页面可以分为两个部分:

4-7 stockDemo1 - 策略回测结果详情页

  • 运行信息:包含此运行的元信息以及运行状态、运行参数
  • 策略子任务:包含此运行中所有回测任务的运行时间、回测时间以及运行状态。
    • 例如,在这里可以点击查看日志查看策略中打印的日志

4-8 stockDemo1 - 策略回测结果详情页 - 查看日志

  • 点击查看详情,即可查看回测任务的详情
    • 运行结果:里面包含了所有回测引擎返回的表格结果。可以对每个表格进行下载。

4-9 stockDemo1 - 策略回测结果详情页 - 数据报告

  • 可视化报告:因为在参数处未选择模板,生成的报告使用了默认的可视化模板,包含了策略概述、收益详情、交易分析、持仓详情、账户详情和订单详情,对于后 4 个模块,可以进行股票代码和日期的筛选。

4.2 股票日频策略

接下来,我们来介绍一个更为复杂的日频策略来展示如何使用因子开发管理平台中的策略来编写事件回调函数,并且实现参数寻优的功能 。策略中也可以订阅因子平台中开发完成的因子信号,以实现交易信号的生成。

4.2.1 策略开发

以公共脚本库下的 stockDemo2 为例。下图为策略初始化函数中的代码,可以分为三个部分进行解析:
4-10 stockDemo2 - 策略代码 - 初始化函数

  • 信号订阅:蓝框内为订阅相对强弱 RSI 指标,与 stockDemo1 中展示的一样,在字典 d 中订阅指标并且使用 Backtest::subscribeIndicator 指定订阅指标的数据类型。这里为 'kline',因此我们可以在 onBar 处获得指标的结果
  • 因子信号定义:在绿框内,我们使用到了 "ta::rsi" 这个因子,代表平台中有一个因子模块 ta,rsi 是其中的一个因子。因此,在订阅指标的时候用户可以任意使用到公开因子模块或者草稿因子模块中的因子信号。
  • 自定义参数的参数寻优:在每一个函数参数中都存在 userParams 用于储存用户的自定义参数,以实现自定义参数及参数寻优的功能。例如,在上图中,在计算 RSI 信号时,需要对 timePeriod 进行调参以实现优化策略的功能。
    • 首先,在设定运行回测参数的自定义参数对应的函数下添加 'timePeriod' 以及对应的可选值
    • 设定好参数后,对应的值可以通过参数 userParams 进行获取。例如在 stockDemo2 中,我们使用到了 int(userPrams["timePeriod"]) 取出相应的值。需要注意的是,使用前需要把值转为对应的类型,例如这里使用 int() 将值转为整数类型。

在逐笔行情通知函数 onBar 中,此策略进一步定义了对于交易信号的判断:
4-12 stockDemo2 - 策略代码 - 逐笔行情通知函数

  • 在这个回调函数中,我们取出行情中的 rsi 指标值和在 contextDict 中储存的上一个 rsi 值,通过一些简单的 if 条件来判断是否需要提交委托买卖订单
    • 使用 print 函数打印日志,用于策略的 debug

4.2.2 回测结果

编辑好回调函数及代码后,点击运行,选择默认的内置预设 stockDemo2_preset 即可进行运行。运行详情页面如下:
4-13 stockDemo2 - 策略回测结果详情

  • 参数寻优报告:包含了所有回测任务的回测结果一览,包含了指标概述等比较。可以在此看到不同参数所产生的策略收益与成交信息。

4-14 stockDemo2 - 策略回测结果详情 - 参数寻优报告

并且可以点击不同的回测任务查看到每个任务的具体详情,例如点击综合第一下的 stockDemo2_3 即跳转到对应的报告:
4-15 stockDemo2 - 策略回测结果详情 - 可视化报告

以上就是一个更为复杂的策略在因子开发管理平台的实现。

试用 Starfish 因子开发管理平台,请点击 联系我们 - DolphinDB填写表单,留言备注试用因子平台!

相关推荐
船长@Quant18 天前
tsfresh:时间序列特征自动提取与应用
python·量化策略·sklearn·策略回测·风险控制·tsfresh
DolphinDB智臾科技2 个月前
基于 MDL 行情插件的中金所 L1 数据处理最佳实践
期货·量化金融·dolphindb·期货交易·期货行情·行情·中金所
DolphinDB智臾科技9 个月前
向量数据库、主键存储引擎、高速网络 RDMA 框架……DolphinDB 版本更新啦!
数据库·机器学习·时序数据库·ficc·dolphindb·vectordb
DolphinDB智臾科技9 个月前
DolphinDB 蝉联 Gartner 中国实时数据管理代表厂商
数据库·人工智能·时序数据库·dolphindb·gartner
呆萌的代Ma9 个月前
在dolphinDB上直接保存一个dataframe为分布式数据表
分布式·dolphindb
DolphinDB智臾科技10 个月前
共筑信创新生态:DolphinDB 与移动云 BC-Linux 完成兼容互认
数据库·时序数据库·兼容性测试·dolphindb·国产信创
DolphinDB智臾科技1 年前
金仕达与 DolphinDB 建立深度合作,共筑 FICC 科技创新新篇章
数据库·时序数据库·ficc·金仕达·交易电子化·dolphindb