常见问题

部署

Q1:初始化报错 Backtest 插件加载失败

A:请确认所有节点(包括控制节点、计算节点和数据节点)均已正确安装并加载「模拟撮合」和「回测」插件。

Q2:重启 Server 后打开 Starfish 报错:Failed to load module [starfish::facplfRun]

A:需确保所有节点的配置文件中已预加载回测插件,请在 cfg 文件中添加:

preloadModules=plugins::MatchingEngineSimulator,plugins::Backtest

Q3:运行 init 脚本报错 "Can’t find module [starfish::facplfEnv]"

A:请通过 getHomeDir() 检查模块路径下是否存在 starfish 模块文件。集群部署需要确保所有节点的modules 文件夹下包含 starfish 模块文件

Q4:初始化后通过网址可访问 Starfish,但 Web 端无因子平台入口

A:确保当前已登录系统;确认 Web 端连接的是控制节点

平台使用

Q1:登录后无「因子与评价」「策略与回测」导航栏

A:需在系统管理界面中完成以下操作:1. 为账号分配部门;2. 给予当前用户「因子研究」「策略研究」权限;3. 刷新页面生效。

Q2:如何删除已审批通过的因子/策略?

A:仅部门管理员或审核员可操作,操作步骤是:1. 进入「公共函数库」;2. 选择目标部门;3. 点击对应条目右侧的「删除」操作。

因子

Q1:怎么开发一个新的因子?

A:参考因子的快速上手文档:快速上手之因子开发

Q2:能否基于现有因子进行二次封装或开发关联因子?

A:支持调用公共/私有因子库,例如已经在模块 factor1 中新建了一个 ma 因子,那么另一个模块 factor2 中可以通过 factor1::ma 的方式使用。

Q3:平台内置了哪些因子?如何查看?

A:在「公共脚本库 > 因子库」中可查看内置因子,包括 WorldQuant Alpha 101 等 7 类常见因子库。

Q4:「我的因子」「计算模板」「评价模板」有何区别?

A:我的因子中为包含了多个因子函数的模块;因子计算模板是如何将因子代码带入到数据中计算的方法,例如最简单的是如何从数据源中取出计算当前因子需要的数据,以及如何将数据源的字段与因子的参数进行对应等;因子评价模板是对因子计算的结果进行评价的代码。

Q5:运行因子计算模板中的要设置的参数是什么?数据类型是什么呢?

A:因子计算模板是一个函数,因此函数的参数即为运行这个计算模板所需要传入的内容。数据类型即传入的内容的类型。特殊的数据类型有:

  • 数据库选择:传入选择的数据库的句柄
  • 库表选择:传入选择的数据库表的表对象
  • 库表列选择:传入库表的某一列数据
  • 前置模板运行结果:传入上一个计算模板的运行结果
  • 因子函数入参:传入选择的因子名,会包含模块名,例如alpha::alpha101

Q6:使用了 Alphalens 的评价模板后有以下报错: Column index is out of range?

A:检查评价运行参数 period,目前只支持填写 3 个调仓周期,例如1,5,10。

Q7:使用了 Alphalens 的评价模板后有以下报错: Not allowed to create a void vector. RefId:S05005?

A:检查因子值是否全为空。

Q8:为何仅显示部分因子结果?

A:因子的计算运行结果在页面上只展示 100 条,帮助用户判断计算结果是否符合预期。

Q9:如何对已入库因子进行 Alphalens 评价?

A:可以新建一个因子模块,每个函数返回一个库内的因子名,例如:

def factor1() {
  return 'factor1'
}

def factor1() {
  return 'factor1'
}

再新建一个计算模板,用于根据因子函数中返回的因子名称从指定库里查询数据。例如:

def getFactorData(dbName, tbName, factor, startDate, endDate) {
  factorName = funcByName(factor)()
  res = select date(tradetime) as tradetime, securityid, value 
        from loadTable(dbName, tbName) 
        where date(tradetime) between startDate:endDate and factorname=fname
  return res
}

具体的评价的步骤可以参考快速上手。

策略

Q1:怎么开发一个新的策略?

A:参考策略的快速上手文档:快速上手之策略开发

Q2:我从来没有用过 DolphinDB 的回测,教程在哪里可以看?

A:starfish 的策略编写页面中,有提供一部分的回调函数介绍,如果需要完整的回测教程,请参考:Backtest

Q3:我想用 starfish 中的因子库进行指标回测,要怎么写?

A:可以通过 因子库名::因子函数名 的方法调用,例如使用 ta 因子库中的 rsi 因子,即可在初始化函数中直接订阅。

def initialize(mutable context) {
    d=dict(STRING,ANY)
	d["RSI"]=<ta::rsi(close, 14)>
	Backtest::subscribeIndicator(context["engine"], "kline", d)
}

工作流

Q1:工作流中的任务是顺序执行的吗?

A:是的,工作流中的每一个任务都会检查前置任务是否执行完成,只有完成后才会执行,如果中途有任一一个任务失败,则不会继续执行。

Q2:工作流里的因子任务和直接跑因子测试有什么区别?

A:工作流里的因子任务可以选择是否需要入库,以及如果要入库的话,对应的库名和表名。

可视化

Q1:可视化模板的类型是什么?

A:分为两类:一种是平台中已执行的任务,包含因子计算结果、因子评价结果、策略回测结果、绩效归因结果;第二种是自定义模板,也就是对任意的数据进行可视化。对于第一种类型,不支持添加其他参数;对于自定义模板,可以添加任意参数。

Q2:对于非自定义的可视化模板中,函数参数 resultList 是什么?一般是怎么获取的?

A:若模板类型为自定义外的其他类型,运行记录的结果以元组形式传至计算代码。例如,选择了两条因子计算的结果,那么resultList为包含两个因子结果的元组,resultList[0] 获得的是第一个因子的运行记录,为一个表格,同理,resultList[1] 是第二个因子结果的表格。因此,在实际使用的时候,可以把两个运行记录合并到一起做一些相关性分析,例如:

def prepareData(resultList) {
  factor1 = resultList[0]
  factor2 = resultList[1]
  unionFactor = select *, corr(factor1.value, factor2.value) as corr from lj(factor1, factor2, `tradeTime`securityid) limit 100
  return dict(['rest'], [unionFactor])
}

因此,可视化模板不仅可以将用图表的方式展示运行结果,还能批量合并多个结果。