API 使用教程

本文档为 DolphinDB 因子开发管理平台的 API 文档,将介绍因子与评价、策略与回测、数据导入模板、工作流和任务监控等各个部分的相应接口和应用流程。

1. 因子与评价

因子与评价分为因子模块、因子计算模板、因子评价模板三个部分。

1.1.因子模块

因子模块是因子开发管理平台中进行因子开发的基本单位,一个因子模块中可以包含多个因子函数。本节将介绍如何新建、编辑因子模块,如何获取因子模块列表。如何运行因子模块,以及如何查看因子模块运行结果。

1.1.1 新建因子模块

首先,使用 starfish::facplfBasic::facplf_create_new_factor 接口来新建因子模块。新建成功,将会返回一个包含该因子模块的 id 的字典,可以通过这个 id 进行后续的编辑和运行。

例如,新建一个因子模块,属性、备注和标签均为空:

starfish::facplfBasic::facplf_create_new_factor(
  {
      "name": "apitest_factorModule1",
      "properties": "",
      "tags": "",
      "comment": ""
  }
)

返回结果为:

{"factor_id": d1d3c1e8-083e-781a-6f66-839acf3e5105}

1.1.2 编辑因子模块

在创建完一个新的因子模块或者需要对已有因子模块进行编辑时,可以使用 starfish::facplfBasic::facplf_edit_factor 接口来修改因子模块的基本属性或因子代码。

例如,对上一小节新建的因子模块进行编辑,可以写为:

starfish::facplfBasic::facplf_edit_factor({
    "factor_id": "d1d3c1e8-083e-781a-6f66-839acf3e5105",
    "name": "test_factor",
    "properties": "SQL",
    "tags": "test",
    "comment": "",
    "code": "def test_factor(price){return max(price)}"
})

1.1.3 获取因子模块列表

使用 starfish::facplfBasic::facplf_get_factor_list 接口,可以查看已有的因子模块列表。返回值为字典,其中 items 的值为一个表格,包含了当前用户的所有因子模块 id、因子函数列表、因子模块名称、属性、标签、备注、运行记录数、创建时间、更新时间和创建者。

例如,运行该接口:

starfish::facplfBasic::facplf_get_factor_list()

返回结果如下图所示:

1.1.4 查看因子模块详情

使用 starfish::facplfBasic::facplf_get_factor_detail 接口,可以查看因子模块的详细信息。包含因子模块 id、因子函数列表、因子模块名称、基本属性、运行记录数和因子模块代码等。用户可以使用这个接口来确认因子模块的具体详情。

例如,运行下面的接口,查看指定因子模块的详细信息:

starfish::facplfBasic::facplf_get_factor_detail({
    "factor_id": "d1d3c1e8-083e-781a-6f66-839acf3e5105"
})

返回结果如下图所示:

1.1.5 运行因子模块

先运行use starfish::facplfRun,再调用 starfish::facplfRun::facplf_create_draft_test接口,可以运行指定的因子模块。例如:

use starfish::facplfRun
starfish::facplfRun::facplf_create_draft_test({
    "factors": [
        {
            "type": "private",
            "factor_id": "d1d3c1e8-083e-781a-6f66-839acf3e5105",
            "funcs": [
                "test_factor"
            ]
        }
    ],
    "factor_templates": [
        {
            "template_id": "440a4075-6903-0ffe-4365-434782e5801b",
            "template_params": [
                {
                    "name": "data",
                    "type": "db_tb_select",
                    "value": {
                        "database": "dfs://factor_test",
                        "table": "data"
                    }
                },
                {
                    "name": "factorName",
                    "type": "factor",
                    "value": NULL
                },
                {
                    "name": "startDate",
                    "type": "date",
                    "value": "2024.09.20"
                },
                {
                    "name": "endDate",
                    "type": "date",
                    "value": "2024.09.20"
                },
                {
                    "name": "securityidName",
                    "type": "string",
                    "value": "securityid"
                },
                {
                    "name": "tradetimeName",
                    "type": "string",
                    "value": "tradetime"
                },
                {
                    "name": "frequency",
                    "type": "string",
                    "value": "1m"
                }
            ]
        }
    ],
    "analysis": false
})

执行后,将会返回一个包含因子模块运行结果 id 的 dict:

{
    "tests": [
        "admin_apitest_factorModule2_apitest_6927068c_f7c0_7a84_627f_146261d813e8"
    ]
}

1.1.6 查看因子模块运行结果

根据上一小节得到的因子模块运行结果 id,可以调用 starfish::facplfBasic::facplf_get_single_test_detail 接口,查看运行结果:

starfish::facplfBasic::facplf_get_single_test_detail({
"test_id": "admin_apitest_factorModule2_apitest_6927068c_f7c0_7a84_627f_146261d813e8"
})

返回结果是一个 dict,结构如下图所示:

1.2 因子计算模板

因子计算模板需要与因子模块结合使用,用于描述因子计算的完整流程,一个因子模板可以用于多个因子模块的计算。本节将介绍如何新建、编辑因子计算模板,以及如何获取因子计算模板列表。

1.2.1 新建因子计算模板

首先,使用 starfish::facplfBasic::facplf_create_new_private_factor_template 接口来新建因子计算模板。新建成功,将会返回一个包含该因子计算模板的 id 的字典,可以通过这个 id 进行后续的编辑。

例如,新建一个因子计算模板,属性、备注和标签均为空:

starfish::facplfBasic::facplf_create_new_private_factor_template({
    "tags": "",
    "factor_properties": "",
    "name": "apitest_factorTemplate1",
    "comment": ""
})

返回结果为:

{"template_id": 623b9f8c-3933-23b4-d506-13bb3524c084}

1.2.2 编辑因子计算模板

在创建完一个新的因子计算模板或者需要对已有因子计算模板进行编辑时,可以使用 starfish::facplfBasic::facplf_edit_private_factor_template 接口来修改因子计算模板的基本属性或模板代码。

例如,对上一小节新建的因子计算模板进行编辑,可以写为:

starfish::facplfBasic::facplf_edit_private_factor_template({
    "tags": "SQL",
    "factor_properties": "",
    "template_id": "623b9f8c-3933-23b4-d506-13bb3524c084",
    "name": "apitest_factorTemplate2",
    "comment": "",
    "code": '
def apitest_factorTemplate2(data, startDate, endDate, factorName, oriName, 
tarName, tarValueName, securityidName, tradetimeName, frequency){
    // 该计算模板以SQL的方式调用因子模块代码,并进行group by分组
    // 找出因子函数所需参数
    syntax = (exec syntax from defs() where name = factorName)[0]
    parameter = syntax[1:(strlen(syntax)-1)].split(",")
    mapping = dict(parameter, parameter)

    // 列名映射
    ori = oriName.strReplace(" ","").split(",")
    tar = tarName.strReplace(" ","").split(",")
    mapping[tar] = ori
    param = mapping[parameter]

    // 生成元代码
    args = each(sqlCol, param)
    // 将指定值转成int型
    args[!isNull(int(param))] = dropna(int(param))

    // sql 元代码
    // 选择所有代码并进行因子计算
    tarValueNameVector = tarValueName.split(",")
    selects = (sqlColAlias(parseExpr("\'"+frequency+"\'"), `frequency),
    sqlColAlias(makeUnifiedCall(funcByName(factorName), args), tarValueNameVector))
    from_tb = data
    whereConditions = expr(startDate, <=, sqlCol(tradetimeName,date), <=, endDate)
    ret = sql(
        select = selects,
        from = from_tb,
        where = whereConditions,
        groupBy=[sqlCol(securityidName), sqlColAlias(
        parseExpr("interval("+ tradetimeName +","+ frequency+","+"\'none\'"+")"), 
        tradetimeName)],
        groupFlag = 1
    )
    return ret.eval()
}'
})

1.2.3 获取因子计算模板列表

使用 starfish::facplfBasic::facplf_get_private_factor_template_list 接口,可以查看已有的因子计算模板列表。返回值为字典,其中 items 的值为一个表格,包含了当前用户的所有因子计算模板 id、因子计算模板名称、属性、标签、备注、创建时间、更新时间和创建者。

例如,运行该接口:

starfish::facplfBasic::facplf_get_private_factor_template_list()

返回结果如下图所示:

1.2.4 查看因子计算模板详情

使用 starfish::facplfBasic::facplf_get_private_factor_template_detail 接口,可以查看因子计算模板的详细信息。包含因子计算模板 id、因子计算模板名称、基本属性和因子计算模板代码等。用户可以使用这个接口来确认因子计算模板的具体详情。

例如,运行下面的接口,查看指定因子计算模板的详细信息:

starfish::facplfBasic::facplf_get_private_factor_template_detail({
    "template_id": "623b9f8c-3933-23b4-d506-13bb3524c084"
})

返回结果如下图所示:

1.3 因子评价模板

因子评价模板用于计算因子表现,从而对不同的因子进行评价。本节将介绍如何新建、编辑因子评价模板,如何获取因子评价模板列表,如何运行因子评价模板,以及如何查看因子评价模板的运行结果。

1.3.1 新建因子评价模板

首先,使用 starfish::facplfBasic::facplf_create_new_analysis_template 接口来新建因子评价模板。新建成功,将会返回一个包含该因子评价模板的 id 的字典,可以通过这个 id 进行后续的编辑和运行。

例如,新建一个因子评价模板,标签为 IC,备注为空:
starfish::facplfBasic::facplf_create_new_analysis_template({
    "name": "apitest_factorAnalysis",
    "tags": "IC",
    "comment": ""
})

返回结果为:

{"template_id": 858fed65-37fe-621c-76ba-e0c050b3a02f}

1.3.2 编辑因子评价模板

在创建完一个新的因子评价模板或者需要对已有的因子评价模板进行编辑时,可以使用 starfish::facplfBasic::facplf_edit_analysis_template 接口来修改因子评价模板的基本属性或模板代码。

例如,对上一小节新建的因子评价模板进行编辑,可以写为:

starfish::facplfBasic::facplf_edit_analysis_template({
    "template_id": "858fed65-37fe-621c-76ba-e0c050b3a02f",
    "name": "apitest_factorAnalysis",
    "tags": "IC",
    "comment": "",
    "code": "use alphalens\r\ndef apitest_factorAnalysis(factorData, originData, factorTimeCol, factorSecurityidCol, factorCol, originTimeCol, originSecurityidCol, originPriceCol){\r\n    factor = sql((sqlCol(factorTimeCol,,`date),sqlCol(factorSecurityidCol,,`asset), sqlCol(factorCol,,`factor)), factorData, orderBy=(sqlCol(factorTimeCol), sqlCol(factorSecurityidCol))).eval()\r\n    prices = sql(sqlCol(originPriceCol,last), originData, groupBy = (sqlCol(originTimeCol,date,`date), sqlCol(originSecurityidCol)), groupFlag = 2).eval()\r\n    factor_data = get_clean_factor_and_forward_returns(factor,prices,groupby=NULL,binning_by_group=false,quantiles=2,bins=NULL,periods=[1, 5, 10],filter_zscore=20,groupby_labels=NULL,max_loss=0.35,zero_aware=false,cumulative_returns=true)\r\n    return create_information_tear_sheet(factor_data, group_neutral=false, by_group=false)[`Information_Analysis]\r\n}"
})

1.3.3 获取因子评价模板列表

使用 starfish::facplfBasic::facplf_analysis_template_list 接口,可以查看已有的因子评价模板列表。返回值为字典,其中 items 的值为一个表格,包含了当前用户的所有因子评价模板 id、因子评价模板名称、标签、是否为自定义模板、创建时间、更新时间、创建者、备注、运行记录数和模板代码。

例如,运行该接口:

starfish::facplfBasic::facplf_analysis_template_list()

返回结果如下图所示:

1.3.4 查看因子评价模板详情

使用 starfish::facplfBasic::facplf_analysis_template_detail 接口,可以查看因子评价模板的详细信息。包含因子评价模板 id、因子评价模板名称、基本属性和因子评价模板代码等。用户可以使用这个接口来确认因子评价模板的具体详情。

例如,运行下面的接口,查看指定因子评价模板的详细信息:

starfish::facplfBasic::facplf_analysis_template_detail({
    "template_id": "858fed65-37fe-621c-76ba-e0c050b3a02f"
}) 

返回结果如下图所示:

1.3.5 运行因子评价模板

先运行 use starfish::facplfRun,再调用 starfish::facplfRun::facplf_run_analysis 接口,可以运行指定的因子评价模板。例如:

use starfish::facplfRun

starfish::facplfRun::facplf_run_analysis({
    "type": 3,
    "analysis_template": {
        "template_id": "858fed65-37fe-621c-76ba-e0c050b3a02f",
        "template_params": [
            {
                "name": "factorData",
                "type": "db_tb_select",
                "value": {
                    "database": "dfs://factor_test",
                    "table": "result"
                }
            },
            {
                "name": "originData",
                "type": "db_tb_select",
                "value": {
                    "database": "dfs://factor_test",
                    "table": "data"
                }
            },
            {
                "name": "factorTimeCol",
                "type": "string",
                "value": "tradetime"
            },
            {
                "name": "factorSecurityidCol",
                "type": "string",
                "value": "securityid"
            },
            {
                "name": "factorCol",
                "type": "string",
                "value": "value"
            },
            {
                "name": "originTimeCol",
                "type": "string",
                "value": "tradetime"
            },
            {
                "name": "originSecurityidCol",
                "type": "string",
                "value": "securityid"
            },
            {
                "name": "originPriceCol",
                "type": "string",
                "value": "price"
            }
        ]
    }
})

执行后,将会返回一个包含评价作业 id 和评价任务 id 的 dict:

{
    "aly_job_id": [
        "admin_apitest_factorAnalysis_29998048_42a7_3b68_efba_9b9b37e284bd"
    ],
    "aly_task_id": "29998048-42a7-3b68-efba-9b9b37e284bd"
}

1.3.6 查看因子评价模板运行结果

根据上一小节得到的因子评价作业 id,可以调用 starfish::facplfBasic::facplf_get_analysis_record_detail 接口,查看运行结果:

starfish::facplfBasic::facplf_get_analysis_record_detail({
    "analysis_record_id": 
      "admin_apitest_factorAnalysis_29998048_42a7_3b68_efba_9b9b37e284bd"
})

返回结果是一个 dict,结构如下图所示:

2. 策略与回测

为了精准测试和验证策略在实盘交易中的效果,本平台支持了回测功能。策略与回测分为策略开发、回测预设设置、运行策略、绩效归因四个部分。

2.1 策略开发

在策略开发中,用户可以自定义策略函数。

2.1.1 新建策略

首先,使用 starfish::facplfBasic::facplf_create_new_strategy 接口来新建策略。新建成功,将会返回一个包含该策略的 id 的字典。可以通过这个 id 进行后续的编辑和运行。

例如,新建一个股票策略,数据类型为快照,以字典形式接受行情数据,备注和标签为空:

starfish::facplfBasic::facplf_create_new_strategy({
    "strategy_name": "APIDemo",
    "strategy_group": "stock",
    "data_type": 1,
    "msg_as_table": false,
    "tags": "",
    "comment": ""
})

返回结果为:

{"id": "45f4ee13-4555-4ce1-3c3f-4039c04d8f73"}

2.1.2 编辑策略

在创建完一个新的策略或者需要对已有策略编辑时,可以使用starfish::facplfBasic::facplf_save_strategy_code接口编写策略逻辑。具体来说,因为因子平台将策略函数分为 9 个函数:initialize, beforeTrading, onTick, onSnapshot, onBar, onOrder, onTrade, afterTrading, finalize,因此用户可以根据自己的策略代码进行分类编写为一个字典,然后传入此接口中。

例如,用下面的代码编写一个策略:

initialize = '
	//初始化回调函数
	print("initialize")
	//订阅快照行情的指标
	d=dict(STRING,ANY)
	d["timestamp"] = <timestamp>
	d["maxVolatility_1m"]=<lastPrice\\prevClosePrice-1>
	Backtest::subscribeIndicator(contextDict["engine"], "snapshot", d) 
'

beforeTrading = '
    ////每日盘前回调函数
    ////1、通过contextDict["tradeDate"]可以获取当日;
    print ("beforeTrading: "+contextDict["tradeDate"])
    //通过backtest::setUniverse可以更换当日股票池
    Backtest::setUniverse(contextDict["engine"],["000001.XSHE"])
'
finalize = ''
afterTrading = ''
onBar = ''
onOrder = ''
onSnapshot = '
	for( istock in msg.keys()){
		lastPrice=msg[istock]["offerPrice"][0]
		qty=msg[istock]["offerQty"][0]
		if (indicator[istock]["maxVolatility_1m"]>0.01){
			Backtest::submitOrder(contextDict["engine"], 
			(istock,contextDict["tradeTime"] , 5, lastPrice, qty, 1),"buy")
		}
	}
'
onTick = ''
onTrade = ''

code = dict(["initialize","beforeTrading","onTick","onBar","onSnapshot","onOrder",
  "onTrade","afterTrading","finalize"],
  [initialize,beforeTrading,onTick,onBar,onSnapshot,onOrder,onTrade,
  afterTrading,finalize])

param = dict(`id`code, ["45f4ee13-4555-4ce1-3c3f-4039c04d8f73", code])
starfish::facplfBasic::facplf_save_strategy_code(param)

2.1.3 获取策略列表

使用 starfish::facplfBasic::facplf_get_strategy_list 接口,可以查看已有的策略列表。返回值为字典,其中 items 的值为一个表格,包含了当前用户的所有策略 id、策略名称、策略类型、数据类型、创建更新时间、备注和标签。

例如,运行该接口:

starfish::facplfBasic::facplf_get_strategy_list()

返回结果为:

{
    "total": 1,
    "items": [
        {
            "id": "45f4ee13-4555-4ce1-3c3f-4039c04d8f73",
            "strategy_name": "API_demo",
            "strategy_group": "stock",
            "data_type": 1,
            "msg_as_table": false,
            "create_time": "2024.10.22 15:16:38.207",
            "update_time": "2024.10.22 15:20:24.129",
            "comment": "",
            "tags": "",
            "creator": "admin",
            "run_record_count": 0
        }
    ]
}

2.1.4 查看策略详情

使用 starfish::facplfBasic::facplf_get_backtest_detail 接口,可以查看策略的详细信息。包含策略名称、策略代码、基本属性、以及运行记录数等。用户可以使用这个接口来确认策略的具体详情。

例如,运行下面的接口,查看指定策略的详细信息:

starfish::facplfBasic::facplf_get_backtest_detail({
    "id": "45f4ee13-4555-4ce1-3c3f-4039c04d8f73"
})

返回结果如下图所示:

2.2 回测预设

2.2.1 新建回测预设

首先,使用 starfish::facplfBasic::facplf_create_strategy_setting 接口来新建回测预设。新建成功,将会返回一个包含该回测预设的 id 的字典。可以通过这个 id 进行后续的编辑和获取预设。

例如,新建一个股票策略的回测预设,数据类型为快照,以字典形式接受行情数据,备注和标签为空:

starfish::facplfBasic::facplf_create_strategy_setting({
    "name": "API_demo",
    "strategy_group": "stock",
    "data_type": 1,
    "type": 1,
    "tags": "",
    "comment": ""
})

返回结果为:

{"id": "9228ac2a-7de8-0903-e52b-013164c10fb6"}

2.2.2 编辑回测预设

在创建完一个新的回测预设或者需要对已有回测预设进行编辑时,可以使用starfish::facplfBasic::facplf_edit_strategy_setting 接口来编辑回测预设。具体来说,就是用字典构造好回测参数,然后添加到具体的回测预设中。

例如,为上一小节新建的回测预设设置参数,可以写为:

config = {
    "date": [
        [
            "2022.04.11",
            "2022.04.11"
        ]
    ],
    "cash": [
        100000000
    ],
    "commission": [
        0.00015
    ],
    "tax": [
        0.001
    ],
    "matchingMode": [],
    "benchmark": [],
    "frequency": [
        0
    ],
    "latency": [],
    "symbolList": [],
    "msgPartition": [],
    "orderBookMatchingRatio": [],
    "matchingRatio": [],
    "enableSubscriptionToTickQuotes": [],
    "outputQueuePosition": [],
    "configTables": [
        {
            "configure": false
        },
        {
            "configure": false
        }
    ],
    "msgTables": [
        {
            "configure": true,
            "tableName": "snapshot",
            "mode": "code",
            "code": '
colName=["symbol","symbolSource","timestamp","lastPrice","upLimitPrice",
"downLimitPrice","totalBidQty","totalOfferQty","bidPrice","bidQty","offerPrice",
"offerQty","signal","prevClosePrice"]
colType= ["STRING","STRING","TIMESTAMP","DOUBLE","DOUBLE","DOUBLE","LONG",
	"LONG","DOUBLE[]","LONG[]","DOUBLE[]","LONG[]","DOUBLE[]","DOUBLE"]
messageTable=table(10000000:0, colName, colType)

insert into messageTable values("000001.XSHE","XSHE",2022.04.11 10:10:00.000,7,15,
5,10000,10000,
arrayVector([10],[6.9, 6.8, 6.7, 6.6, 6.5, 6.4, 6.3, 6.2, 6.1,6.0]),
arrayVector([10],[800,900,1000,1100,1200,1000,1000,1000,1000,1000]),
arrayVector([10],[7.1,7.2,7.3,7.4,7.5,7.6,7.7,7.8,7.9,8.0]),
arrayVector([10],[1000,1000,1000,1000,1000,1000,1000,1000,1000,1000]),,6.5)
insert into messageTable values("000001.XSHE","XSHE",
2022.04.11 10:10:03.000,7.5,15,5,10000,10000,
arrayVector([10],[7.4, 6.8, 6.7, 6.6, 6.5, 6.4, 6.3, 6.2, 6.1,6.0]),
arrayVector([10],[800,900,1000,1100,1200,1000,1000,1000,1000,1000]),
arrayVector([10],[7.6,7.7,7.8,7.9,8.0,8.1,8.2,8.3,8.4,8.5]),
arrayVector([10],[1000,1000,1000,1000,1000,1000,1000,1000,1000,1000]),,7)

result = messageTable  
                '
        }
    ],
    "attribution": false
}


starfish: :facplfBasic: :facplf_edit_strategy_setting(dict(`id`config,
[
    "9228ac2a-7de8-0903-e52b-013164c10fb6", toStdJson(config)
]))

2.2.3 获取回测预设列表

使用 starfish::facplfBasic::facplf_get_strategy_setting_list 接口,可以查看已有的回测预设列表。返回值为字典,其中 items 的值为一个表格,包含了当前用户的所有策略预设 id、预设名称、预设类型、策略类型、数据类型、创建更新时间、备注和标签。

例如,运行该接口:

starfish::facplfBasic::facplf_get_strategy_setting_list()

返回结果为:

{
    "items": [
        {
            "id": "9228ac2a-7de8-0903-e52b-013164c10fb6",
            "name": "API_demo",
            "strategy_group": "stock",
            "data_type": 1,
            "create_time": "2024.10.22 15:26:41.276",
            "update_time": "2024.10.22 15:37:04.979",
            "comment": "",
            "tags": "",
            "creator": "admin",
            "type": 1
        }
    ],
    "total": 1
}

2.2.4 查看回测预设详情

使用 starfish::facplfBasic::facplf_get_strategy_setting_detail 接口,可以查看回测预设的详细信息。包含创建者、预设类型、基本属性、预设参数、策略类型、行情类型、预设名称和预设 id。用户可以使用这个接口来确认回测预设的具体详情。

例如,运行下面的接口,查看指定回测预设的详细信息:

starfish::facplfBasic::facplf_get_strategy_setting_detail({
    "id": "9228ac2a-7de8-0903-e52b-013164c10fb6"
})

返回结果如下图所示:

2.3 运行策略

2.3.1 运行历史回测

先运行 use starfish::facplfRun,再调用 starfish::facplfRun::facplf_run_backtest 接口,可以运行指定的历史回测。

例如,使用预设运行,将预设详情中的 config 转为字典:

use starfish::facplfRun

config = starfish::facplfBasic::facplf_get_strategy_setting_detail({
  "id": "9228ac2a-7de8-0903-e52b-013164c10fb6"
})
config  = fromStdJson(config["config"])
param = dict(`id`type`config, ["45f4ee13-4555-4ce1-3c3f-4039c04d8f73", 0, config])
starfish::facplfRun::facplf_run_backtest(param)

或者不使用预设,而是在运行是设定参数,可以参考 API 手册中的运行参数,例如:

use starfish::facplfRun

starfish::facplfRun::facplf_run_backtest({
    "id": "45f4ee13-4555-4ce1-3c3f-4039c04d8f73",
    "type": 0,
    "config": {
        "date": [
            [
                "2022.04.11",
                "2022.04.11"
            ]
        ],
        "cash": [
            1000000
        ],
        "commission": [
            0.00015
        ],
        "tax": [
            0.001
        ],
        "matchingMode": [],
        "benchmark": [],
        "frequency": [
            0
        ],
        "latency": [],
        "symbolList": [],
        "msgPartition": [],
        "orderBookMatchingRatio": [],
        "matchingRatio": [],
        "enableSubscriptionToTickQuotes": [],
        "outputQueuePosition": [],
        "configTables": [
            {
                "configure": false
            },
            {
                "configure": false
            }
        ],
        "msgTables": [
            {
                "configure": true,
                "tableName": "snapshot",
                "mode": "code",
                "code": '
colName=["symbol","symbolSource","timestamp","lastPrice","upLimitPrice",
"downLimitPrice","totalBidQty","totalOfferQty","bidPrice","bidQty","offerPrice",
"offerQty","signal","prevClosePrice"]
colType= ["STRING","STRING","TIMESTAMP","DOUBLE","DOUBLE","DOUBLE","LONG",
	"LONG","DOUBLE[]","LONG[]","DOUBLE[]","LONG[]","DOUBLE[]","DOUBLE"]
messageTable=table(10000000:0, colName, colType)

insert into messageTable values("000001.XSHE","XSHE",2022.04.11 10:10:00.000,7,15,
5,10000,10000,
arrayVector([10],[6.9, 6.8, 6.7, 6.6, 6.5, 6.4, 6.3, 6.2, 6.1,6.0]),
arrayVector([10],[800,900,1000,1100,1200,1000,1000,1000,1000,1000]),
arrayVector([10],[7.1,7.2,7.3,7.4,7.5,7.6,7.7,7.8,7.9,8.0]),
arrayVector([10],[1000,1000,1000,1000,1000,1000,1000,1000,1000,1000]),,6.5)
insert into messageTable values("000001.XSHE","XSHE",
2022.04.11 10:10:03.000,7.5,15,5,10000,10000,
arrayVector([10],[7.4, 6.8, 6.7, 6.6, 6.5, 6.4, 6.3, 6.2, 6.1,6.0]),
arrayVector([10],[800,900,1000,1100,1200,1000,1000,1000,1000,1000]),
arrayVector([10],[7.6,7.7,7.8,7.9,8.0,8.1,8.2,8.3,8.4,8.5]),
arrayVector([10],[1000,1000,1000,1000,1000,1000,1000,1000,1000,1000]),,7)

result = messageTable  
                '
            }
        ]
    }
})

执行后,将会返回一个包含历史回测运行结果 id 的 dict:

{"id": "eaafd1e4-242c-d648-e40a-c226e8752207"}

2.3.2 查看历史回测运行详情

根据上一小节得到的历史回测运行结果 id,可以调用 starfish::facplfRun::facplf_get_backtest_result 接口,查看运行详情:

starfish::facplfRun::facplf_get_backtest_result({
    "id": "eaafd1e4-242c-d648-e40a-c226e8752207",
    "backtest_type": 1
})

返回结果是一个 dict,包含回测任务进度、策略id、策略类型、策略名称、行情类型、回测运行参数和回测子任务 job id 等。结构如下图所示:

需要注意的是,这个接口返回的是整个历史回测的运行详情,并没有具体结果。如果需要查看某个回测子任务的具体结果,需要根据子任务的 job id,调用下一小节的接口进行查看。

2.3.3 查看单个历史回测运行子任务运行结果

根据上一小节得到的历史回测子任务的 job id,可以调用 starfish::facplfBasic::facplf_get_single_backtest_result 接口,查看单个历史回测运行子任务的运行结果,如每日持仓、收益率等。

例如:

// 提取上一小节的历史回测子任务的 job id
job_id = starfish::facplfRun::facplf_get_backtest_result({
  "id": "eaafd1e4-242c-d648-e40a-c226e8752207","backtest_type": 1
}).jobs.job_id[0]

// 查看单个历史回测运行子任务的运行结果
starfish::facplfBasic::facplf_get_single_backtest_result(dict(["job_id"],[job_id]))

返回结果是一个 dict,结构如下图所示:

其中,result 包含了历史回测运行的所有结果表:

2.3.4 运行实时回测

先运行 use starfish::facplfRun,再调用 starfish::facplfRun::facplf_run_real_time_backtest 接口,可以运行指定的实时回测。

例如,在运行时设定参数,运行指定的实时回测:

use starfish::facplfRun

config = {
    "date": [
        "2023.01.31",
        "2023.02.03"
    ],
    "cash": 10000000,
    "commission": 1.5,
    "tax": 0.0,
    "frequency": 0,
    "depth": 5
}

config["msgTables"] = {"streamTableName": "testData"}
config["configTables"] = [{"configure": true,"tableName": "basicInfo",
  "mode": "code","code": '
tb = select * from loadTable("dfs://Backtest", "future_minData")
symbol=distinct(tb.symbol)

result = table(symbol as symbol, take(100.,size(symbol)) as multiplier, 
take(0.2,size(symbol)) as marginRatio,take(0.01,size(symbol)) as tradeUnit, 
take(0.02,size(symbol)) as priceUnit, take(0.03,size(symbol)) as priceTick, 
take(1.5,size(symbol)) as commission, 
take(1,size(symbol)) as deliveryCommissionMode)
  '
}]

// 运行实时回测
starfish::facplfRun::facplf_run_real_time_backtest(dict(`id`type`run_params,
[
    "1a5d079b-eb10-9b7c-42e1-d356c1009fdf",
    0,config
]))

执行后,将会返回一个包含实时回测运行结果 id 的 dict:

{"id": 14afe87e-bc0c-e6f9-7f81-d0e6cbbb2cd8}

2.3.5 查看实时回测运行详情

根据上一小节得到的实时回测运行结果 id,可以调用 starfish::facplfRun::facplf_get_backtest_result 接口,查看运行详情:

starfish::facplfRun::facplf_get_backtest_result({
  "id": "14afe87e-bc0c-e6f9-7f81-d0e6cbbb2cd8","backtest_type": 2
})

返回结果是一个 dict,包含回测子任务 job id、回测任务状态、任务开始时间、回测运行参数、行情类型、策略名称、策略类型、策略 id 等。结构如下图所示:

2.3.6 查看实时回测流表名称

因为实时回测任务的结果为流表,如果想进一步查看这些结果流表,可以使用 starfish::facplfBasic::facplf_get_real_time_backtest_stream_tbs 接口。

例如,查看指定实时回测任务的流表名称:

starfish::facplfBasic::facplf_get_real_time_backtest_stream_tbs({
    "job_id": [
        "14afe87e-bc0c-e6f9-7f81-d0e6cbbb2cd8"
    ]
})

返回结果如下图所示,用户可以根据这些流表名称,实时地从对应流表中获取回测结果:

2.4 绩效归因

对于所有的历史回测结果,用户可以使用绩效归因模板对策略结果进行评价,帮助用户更好地理解收益的组成。

2.4.1 新建绩效归因模板

首先,使用 starfish::facplfBasic::facplf_create_new_attribution_template 接口来新建绩效归因模板。新建成功,将会返回一个包含该绩效归因模板的 id 的字典,可以通过这个 id 进行后续的编辑和运行。

例如,新建一个因子评价模板,标签和备注均为空:

starfish::facplfBasic::facplf_create_new_attribution_template({
    "name": "API_demo",
    "tags": "",
    "comment": ""
})

返回结果为:

{"template_id": e0fc2ce3-4c59-cf3f-78ae-e1ce4bf55620}

2.4.2 编辑绩效归因模板

在创建完一个新的绩效归因模板或者需要对已有的绩效归因模板进行编辑时,可以使用 starfish::facplfBasic::facplf_edit_attribution_template 接口来修改绩效归因模板的基本属性、模板参数或模板代码。

下面以上一小节新建的绩效归因模板为例,进行编辑。

首先,构造模板参数,需要将模板使用的参数变成一个 dict 向量。该例中,模板参数设置为 3 个入参,分别是策略回测结果、开始时间和结束时间,每一个参数字典的组成部分为 idx(序号)、name (参数名称)、control_type(控件类型)、value(默认值)。可以写为:

custom_params = [
    {
        "idx": 0,
        "name": "backtestResult",
        "control_type": "strategy_run_record_select",
        "value": "admin_979e2854_e0ce_e6bb_a4e0_17fc8d034cee_1"
    },
    {
        "idx": 1,
        "name": "start_date",
        "control_type": "date",
        "value": "2023.10.01"
    },
    {
        "idx": 2,
        "name": "end_date",
        "control_type": "date",
        "value": "2024.10.01"
    }
]

随后,构造模板代码。因为绩效归因模板是一个函数,因此需要在最后 return 结果,并且结果必须为 dict 类型:

code = '
    res = select * from backtestResult.getDailyTotalPortfolios 
          where tradeDate between start_date:end_date
    return dict(["daily_portfolio"], [res])
'

最后,合并这两部分,并调用 starfish::facplfBasic::facplf_edit_attribution_template 接口保存:

starfish::facplfBasic::facplf_edit_attribution_template(dict([
    "name",
    "tags",
    "comment",
    "template_id",
    "custom_params",
    "code"
],
[
    "API_demo",
    "portfolio",
    "",
    "e0fc2ce3-4c59-cf3f-78ae-e1ce4bf55620", custom_params, code
]))

2.4.3 获取绩效归因模板列表

绩效归因模板是所有平台用户公用的,使用 starfish::facplfBasic::facplf_attribution_template_list 接口,可以查看已有的绩效归因模板列表。返回值为字典,其中 items 的值为一个表格,包含了所有绩效归因模板 id、绩效归因模板名称、标签、是否为自定义模板、创建时间、更新时间、创建者、备注、模板代码和运行记录数。

例如,运行该接口:

starfish::facplfBasic::facplf_attribution_template_list()

返回结果如下图所示:

2.4.4 查看绩效归因模板详情

使用 starfish::facplfBasic::facplf_attribution_template_detail 接口,可以查看绩效归因模板的详细信息。包含绩效归因模板 id、绩效归因模板名称、基本属性、模板参数和模板代码等。用户可以使用这个接口来确认绩效归因模板的具体详情。

例如,运行下面的接口,查看指定绩效归因模板的详细信息:

starfish::facplfBasic::facplf_attribution_template_detail({
    "template_id": "e0fc2ce3-4c59-cf3f-78ae-e1ce4bf55620"
})

返回结果如下图所示:

2.4.5 运行绩效归因模板

先运行 use starfish::facplfRun,再调用 starfish::facplfRun::facplf_run_attribution 接口,可以运行指定的绩效归因模板。例如:

use starfish::facplfRun

starfish::facplfRun::facplf_run_attribution(dict(`template_id`custom_params,
[
    "e0fc2ce3-4c59-cf3f-78ae-e1ce4bf55620",
    [
        {
            "idx": 0,
            "name": "backtestResult",
            "control_type": "strategy_run_record_select",
            "value": "admin_979e2854_e0ce_e6bb_a4e0_17fc8d034cee_1"
        },
        {
            "idx": 1,
            "name": "start_date",
            "control_type": "date",
            "value": "2020.06.01"
        },
        {
            "idx": 2,
            "name": "end_date",
            "control_type": "date",
            "value": "2024.10.28"
        }
    ]
]))

执行后,将会返回一个包含绩效归因作业 id 的 dict:

{"attribution_job_id": "facplf_7f5e2f8b_f163_9e1a_fd41_da122bb636c1"}

2.4.6 查看绩效归因模板运行结果

根据上一小节得到的绩效归因作业 id,可以调用 starfish::facplfBasic::facplf_get_attribution_record_detail 接口,查看运行结果:

starfish::facplfBasic::facplf_get_attribution_record_detail({
    "attribution_job_id": "facplf_7f5e2f8b_f163_9e1a_fd41_da122bb636c1"
})

返回结果是一个 dict,结构如下图所示:

3. 数据导入模板

因子开发管理平台提供了数据导入模板功能,用户可以用内置模板导入数据,也可以自定义数据导入模板,从而确保数据导入的便捷性和准确性。

3.1 新建数据导入模板

首先,使用 starfish::facplfBasic::facplf_create_new_data_import_template 接口来新建数据导入模板。新建成功,将会返回一个包含该数据导入模板的 id 的字典,可以通过这个 id 进行后续的编辑和运行。

例如,新建一个数据导入模板,标签和备注均为空:

starfish::facplfBasic::facplf_create_new_data_import_template({
    "name": "apitest_dataImport",
    "tags": "",
    "comment": ""
}) 

返回结果为:

{"template_id": 9e9fdb94-35ff-55a6-0db8-63a4315c25cb}

3.2 编辑数据导入模板

在创建完一个新的数据导入模板或者需要对已有的数据导入模板进行编辑时,可以使用 starfish::facplfBasic::facplf_edit_data_import_template 接口来修改数据导入模板的基本属性或模板代码。

例如,对上一小节新建的数据导入模板进行编辑,可以写为:

starfish::facplfBasic::facplf_edit_data_import_template({
    "template_id": "9e9fdb94-35ff-55a6-0db8-63a4315c25cb",
    "name": "apitest_dataImport",
    "tags": "loadCsv",
    "comment": "",
    "code": "
    def apitest_dataImport(dbName, tbName, csvFile){\r\n    pt = loadTable(dbName, tbName)\r\n    t = loadText(csvFile, schema=pt.schema().colDefs)\r\n    pt.append!(t)\r\n}"
})

3.3 获取数据导入模板列表

数据导入模板是所有平台用户公用的,使用 starfish::facplfBasic::facplf_data_import_template_list 接口,可以查看已有的数据导入模板列表。返回值为字典,其中 items 的值为一个表格,包含了所有数据导入模板 id、数据导入模板名称、标签、运行记录数、是否为自定义模板、创建时间、更新时间、创建者、备注和模板代码。

例如,运行该接口:

starfish::facplfBasic::facplf_data_import_template_list()

返回结果如下图所示:

3.4 查看数据导入模板详情

使用 starfish::facplfBasic::facplf_data_import_template_detail 接口,可以查看数据导入模板的详细信息。包含数据导入模板 id、数据导入模板名称、基本属性和数据导入模板代码等。用户可以使用这个接口来确认数据导入模板的具体详情。

例如,运行下面的接口,查看指定数据导入模板的详细信息:

starfish::facplfBasic::facplf_data_import_template_detail({
  "template_id": "9e9fdb94-35ff-55a6-0db8-63a4315c25cb"
})

返回结果如下图所示:

3.5 运行数据导入模板

先运行 use starfish::facplfRun,再调用 starfish::facplfRun::facplf_run_data_import ,可以运行指定的数据导入模板。例如:

use starfish::facplfRun
starfish::facplfRun::facplf_run_data_import({
    "template_id": "9e9fdb94-35ff-55a6-0db8-63a4315c25cb",
    "template_params": [
        {
            "name": "dbName",
            "type": "string",
            "value": "dfs://factor_test"
        },
        {
            "name": "tbName",
            "type": "string",
            "value": "data"
        },
        {
            "name": "csvFile",
            "type": "string",
            "value": "testImport.csv"
        }
    ]
})

执行后,将会返回一个包含导入作业 id 和导入记录 id 的 dict:

{
    "import_job_id": "admin_apitest_dataImport_444f0d37_f128_5763_37f2_16177e899692",
    "import_record_id": "444f0d37-f128-5763-37f2-16177e899692"
}

3.6 查看数据导入模板运行结果

根据上一小节得到的导入记录 id,可以调用 starfish::facplfBasic::facplf_get_data_import_record_detail 接口,查看运行结果:

starfish::facplfBasic::facplf_get_data_import_record_detail({"
  import_record_id": "444f0d37-f128-5763-37f2-16177e899692"
})

返回结果是一个 dict,结构如下图所示:

4. 工作流

因子开发管理平台中包含了从数据导入到因子开发,策略开发等任务类型。工作流功能可以帮助用户将不同类型的 任务进行串联,实现任务之间的顺序以及依赖关系。

4.1 获取工作流列表

使用 starfish::facplfBasic::facplf_get_workflow_list 接口,可以查看已有的工作流列表。返回值为字典,其中 items 的值为一个表格,包含了当前用户的所有工作流 id、工作流名称、更新时间、备注和运行记录数。

例如,运行该接口:

starfish::facplfBasic::facplf_get_workflow_list()

返回结果如下图所示:

4.2 运行工作流

先运行 use starfish::facplfRun,再调用 starfish::facplfRun::facplf_workflow_run 接口,可以运行指定的工作流。例如:

use starfish::facplfRun

starfish::facplfRun::facplf_workflow_run({
  "workflow_id": "f245b916-973b-cece-d65f-70ca077fb02c
"})

5. 任务监控

按照任务类型,将因子开发管理平台中的任务分为了因子、因子评价、策略回 测、绩效归因、工作流、数据导入等部分。在各个部分中,运行的任务都可以调用对应的任务监控接口查看任务状态、任务耗时等信息。

5.1 查看因子任务监控信息

例如,调用 starfish::facplfBasic::facplf_get_test_records 查看因子模块的任务监控信息:
starfish::facplfBasic::facplf_get_test_records()
通过返回的任务列表中的 test_id, 可以调用 starfish::facplfBasic::facplf_get_test_detail 接口,查看当前因子任务的运行详情:
starfish::facplfBasic::facplf_get_test_detail({"test_id": "311fc710-a592-6ba9-bd3a-77e0677309a1"})
其中 jobs 字段中即包含了因子任务中的所有子任务的 test_id,调用 starfish::facplfBasic::facplf_get_single_test_detail 接口,查看运行结果(具体参考1.1.6节)。例如,
starfish::facplfBasic::facplf_get_single_test_detail({
  "test_id": "admin_apitest_factorModule2_apitest_311fc710_a592_6ba9_bd3a_77e0677309a1"
})

5.2 查看因子评价任务监控信息

调用 starfish::facplfBasic::facplf_get_analysis_records 查看因子评价的任务监控信息:
starfish::facplfBasic::facplf_get_analysis_records()

通过返回的任务列表中的 analysis_record_id, 可以调用 starfish::facplfBasic::facplf_get_analysis_record_detail 接口,查看当前评价任务的运行详情(具体参考 1.3.6 节)。

5.3 查看回测任务监控信息

调用 starfish::facplfBasic::facplf_backtest_run_record_list 查看策略回测的任务监控信息:
starfish::facplfBasic::facplf_backtest_run_record_list()

通过返回的任务列表中的 id 和 backtest_type, 可以调用 starfish::facplfRun::facplf_get_backtest_result 接口,查看当前回测任务的运行详情(具体参考 2.3 节)。

5.4 查看绩效归因任务监控信息

调用 starfish::facplfBasic::facplf_attribution_run_record_list 查看绩效归因的任务监控信息:

starfish::facplfBasic::facplf_attribution_run_record_list()

通过返回的任务列表中的 job_id, 可以调用 starfish::facplfBasic::facplf_get_attribution_record_detail接口,查看当前绩效归因任务的运行详情(具体参考 2.4.6 节)。

5.5 查看工作流任务监控信息

调用 starfish::facplfBasic::facplf_get_workflow_records 查看工作流的任务监控信息:
starfish::facplfBasic::facplf_get_workflow_records()
通过返回的任务列表中的 ryn_id, 可以调用 starfish::facplfBasic::facplf_get_workflow_run_detail接口,查看当前工作流任务的运行详情。
starfish::facplfBasic::facplf_get_workflow_run_detail({'run_id': 'admin_f245b916_973b_cece_d65f_70ca077fb02c_20241028T165428975'})

返回的 items 里即包含了当前工作流任务中的所有的子任务以及运行状态。

5.6 查看数据导入任务监控信息

调用 starfish::facplfBasic::facplf_get_data_import_records 查看数据导入的任务监控信息:

starfish::facplfBasic::facplf_get_data_import_records()

通过返回的任务列表中的 import_record_id, 可以调用 starfish::facplfBasic::facplf_get_data_import_record_detail接口,查看当前数据导入任务的运行详情(具体参考 3.6 节)。

6. 总结

用户可以参照本文档,在不借助于因子管理开发平台的前端页面的情况下,完成平台的绝大部分功能,实现因子开发和策略研究的全流程。