常见问题
部署
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])
}
因此,可视化模板不仅可以将用图表的方式展示运行结果,还能批量合并多个结果。