Starfish 研报分析和因子衍生教程
因子开发管理平台 Starfish 是面向专业投资团队的一站式量化投研分析平台,其研报分析助手提供了多项实用的功能,涵盖研报文件上传、因子自动解析、手动添加因子,以及基于数据库库表的因子函数生成和因子评价等。通过在上传研报后借助自动解析功能提取关键因子,或手动补充所需因子,再由分析助手调用数据库资源完成函数生成与评价,用户能够高效地开展研报分析工作。
本文将以简单的例子展示如何在 Starfish 因子开发管理平台中使用研报分析助手完成研报分析。研报分析功能依赖于部署在平台中的 AI 助手,因此在进行研报分析之前,需要先部署 AI 助手并进行配置,详细请参考智能助手部署手册。
1. 研报分析与衍生因子整体逻辑
Starfish 平台的研报分析与衍生因子功能,基于 AI Agent + 大语言模型(LLM)的协同工作机制,实现从研报理解、因子构建到因子评价的自动化流程。
1.1 流程速览
整体流程可概括为以下几个阶段:
第一步,研报与因子输入。
用户上传研报文件,并选择或定义需要分析的因子,作为后续因子构建与分析的输入。
第二步,因子公式与解释提取(自动执行)。
AI Agent 将研报全文内容和因子名称传入大语言模型(LLM),由模型从研报中自动提取与该因子相关的信息,包括因子公式(以 LaTeX 形式表示)以及因子的解释说明(经济含义或研究背景)。
第三步,数据源观察与字段理解(自动执行)。
系统读取用户配置的数据源(数据库或数据表),提取数据表结构(schema)以及前 5 行样本数据。这些信息会作为上下文传入 LLM,用于帮助模型理解字段含义,并自动完成字段匹配。如果配置了多个数据源,模型会从中判断并选择因子计算所需的数据表和字段。
第四步,因子计算代码生成与迭代修复。
LLM 根据因子公式、解释以及数据结构生成可执行的因子计算代码。系统会立即运行生成的代码并检查执行结果。若代码运行成功,则进入下一阶段;若运行失败,系统会将错误信息反馈给 LLM,由模型分析失败原因并自动修复代码。该过程会进行多轮迭代,直到生成可正确运行的代码。用户在此过程中也可以手动编辑最后一次生成的代码,直接介入修复流程。
第五步,因子公式与解释同步更新(自动执行)。
在代码迭代过程中,如果模型对原有计算逻辑进行了调整,系统会同步更新因子的公式和解释说明,确保最终的因子描述与实际计算逻辑保持一致。
第六步,最终代码运行校验(自动执行)。
在代码生成完成后,系统会将最终的因子计算代码传入内部执行接口,进行一次实际运行校验,用于确认代码在真实执行环境中可以稳定运行。
第七步,Alphalens 因子评价。
通过最终校验后,系统将因子计算代码与用于评价的资产价格数据表一并传入 Alphalens 因子评价接口,计算并返回因子的 IC 值、IC 统计结果以及因子分组收益表现。如果评价过程中发生错误,系统会将任务标记为“因子生成成功,评价失败”,并仅返回因子计算代码。
第八步,衍生因子多轮优化(可选)。
用户可以在创建任务或任务列表中选择开启衍生因子功能,并设置衍生轮数。每一轮衍生过程中,LLM 会基于当前因子的计算代码,尝试采用不同的计算方式(如标准化、平滑处理、参数调整等)生成新的衍生因子。每一轮衍生因子生成后,系统都会自动运行代码并调用 Alphalens 进行因子评价。在所有轮次完成后,AI Agent 会基于 IC 均值、方差等统计指标,选出综合表现最优的衍生因子。
通过上述流程,Starfish 平台实现了从研报到可运行、可评价、可优化因子的完整研发闭环,帮助研究人员高效完成因子构建与验证工作。
1.2 AI 模型说明
研报分析与衍生因子功能中所使用的 AI 模型,默认等同于当前用户在 AI Chat 中配置的默认模型。研报分析任务在执行时,不会单独指定模型,而是直接使用用户在使用 AI Chat 时所选择并设为默认的模型配置。
因此,在使用研报分析和衍生因子功能之前,需要先在 AI Chat 中确认并设置默认模型,以确保后续任务能够正常调用期望的模型能力。建议用户先进入 AI Chat 页面:
-
确认已有可用的模型配置
-
将期望使用的模型设置为默认模型
否则,研报分析任务可能会使用非预期模型,或因未设置默认模型而无法正常执行。
2. AI 权限配置
在使用研报分析和因子衍生功能之前,管理员需要先为用户配置对应的 AI 权限。AI 权限配置分为两个部分:
-
AI 任务配额:用于控制用户可创建的 AI 任务数量及使用上限;
-
数据源权限:用于控制研报分析和因子衍生功能可访问的数据范围。
配置入口统一位于系统管理的 AI 权限管理页面:
2.1 AI 任务配额
AI 任务配额用于限制用户在研报分析和因子衍生过程中的资源使用情况,避免因用户超额创建任务而导致大模型 API 被限流或产生过高的调用成本。管理员可以通过该功能,对用户可创建的 AI 任务数量进行统一管理和控制。
在 AI 任务配额页面中,管理员可以查看所有用户当前的 AI 任务使用情况,主要包含以下三项信息:
1)研报因子任务数量(已用 / 上限):表示该用户已创建的研报因子任务数量及其最大允许数量。
研报因子任务数量 = 用户在研报中实际创建的因子任务数量。例如:
-
某篇研报中提取出 10 个因子
-
用户选择这 10 个因子并创建任务
则该用户共创建 10 个研报因子任务,使用量为 10。
2)衍生因子任务数量(已用 / 上限)表示该用户已创建的衍生因子任务数量及其上限。
衍生因子任务数量 = 创建衍生任务的母因子数量。例如:
-
对某一个研报因子创建衍生任务
-
设置衍生轮数为 10
则虽然最终生成了 10 个衍生因子,但仅计为 1 个衍生因子任务。
3)衍生因子轮数上限表示单个衍生因子任务允许进行的最大衍生轮数。
-
每一轮会生成一个新的衍生因子
-
轮数越高,生成的衍生因子数量越多
-
该值用于限制单个衍生任务的最大生成衍生因子数量
管理员可以通过以下两种方式修改用户的 AI 任务配额:
-
单用户配置:点击用户操作栏中的编辑按钮,对单个用户进行配额调整。
-
批量配置:选择多个用户后,点击右上角的批量设置,一次性为多个用户配置相同的配额规则。
配额配置保存后,将在用户下一次创建任务时生效,不会影响当前正在运行中的任务。
2.2 数据源权限
数据源权限用于控制研报分析和衍生因子功能可以访问哪些数据库和数据表,防止模型直接访问未授权的大规模数据,从而引发 OOM 或性能问题。通过数据源权限控制,可以实现:
-
仅允许用户选择已授权的数据表进行研报分析
-
防止模型执行不受控的数据查询操作
数据访问控制页面中,管理员可以看到所有可配置的数据源,以及它们当前是否允许被 AI 任务使用。列表中展示了每个数据库表对应的研报分析访问权限状态,便于管理员统一管理。
管理员可以通过以下两种方式调整 AI 任务的数据源访问权限:
-
单数据源配置:点击数据源操作栏中的【新增授权】或【取消授权】,单独控制某个数据库表是否可用于研报分析
-
批量数据源配置:多选多个数据库表后,点击右上角的【批量授权】或【批量取消授权】,统一控制研报分析模块的可访问数据范围
配置完成后,后续创建的研报分析和衍生因子任务将按照最新的数据源权限执行。
2.3 查看 AI 权限用量
在创建研报分析或衍生因子任务之前,普通用户可以先查看自己当前的 AI 权限用量,以确认是否仍有可用配额,避免在创建任务时因超额而失败。
查看入口在研报分析的创建任务页面中,可以看到当前登录用户的 AI 权限用量信息。
3. 研报分析
研报分析作为 Starfish 平台研报分析助手的核心模块,通过 “创建任务 — 任务列表跟踪” 流程适配金融投研、量化交易等场景。创建任务时,用户可快速处理行业研报,提取或补充因子。任务列表支持全流程跟踪,用户可核查因子合理性、用可视化结果论证策略;量化团队能针对性解决任务失败问题,还可暂停调整代码提升因子代码生成效率,形成从因子提取到评价验证的闭环。
3.1 创建任务
点击研报分析助手下拉列表中的创建任务,进入研报分析任务创建界面。用户可以在该页面完成研报上传、因子解析、数据源配置以及任务参数设置等操作。
3.1.1 上传研报并编辑内容
在创建任务页面中,用户首先需要上传研报文件。
-
上传完成后,系统会在研报预览区域自动提取 PDF 中的文字内容并展示
-
用户可根据实际研究需求,对解析出的文本内容进行增删或修改
-
同时可以编辑当前任务的任务名称,以便后续在任务列表中区分和管理
3.1.2 因子解析与手动补充
点击因子解析按钮后,研报分析助手会基于研报内容自动解析因子。
-
若自动解析的因子完整且符合需求,可直接使用
-
若存在遗漏或不符合研究目标的情况,用户可以点击添加因子:
-
手动输入因子名称
-
填写对应的因子描述
-
通过自动解析与手动补充相结合的方式,可以确保因子定义更加准确。
3.1.3 数据源与字段配置
在确认因子后,用户需要选择用于研报分析的数据源。
-
可选一个或多个数据源
-
也可以选择添加全部库表
系统会根据所选因子和数据源,自动解析出因子评价所需的关键字段,包括:
-
时间列
-
资产代码列
-
价格列
若系统自动识别的字段与实际情况存在偏差,用户可在界面中手动调整。全部配置完成后,即可创建任务。任务开始运行后,系统会根据因子公式和描述自动选择实际所需的数据表,无需用户手动干预。
3.1.4 启用知识库(RAG)增强分析能力(可选)
在创建任务时,用户还可以选择知识库,在任务执行过程中引入 RAG(检索增强生成) 机制,以提升因子生成和代码修复的效果。当前支持以下两个 RAG 过程:
-
因子解释增强
-
在因子任务生成解释后
-
系统会将因子解释作为文本输入,在知识库中检索相似的因子实现说明
-
检索结果将作为上下文,传入第一次代码生成的提示词中
-
-
代码错误修复增强
-
当代码生成后出现错误信息时
-
系统会使用错误信息在知识库中进行检索
-
获取可能的解决方案,并将其传入下一轮代码生成的提示词中
-
3.1.5 因子结果入库配置(可选)
在创建任务时,用户还可以选择是否将运行成功的因子结果入库。若选择入库,需指定目标数据库表,并确保表结构满足以下要求:
| 字段名 | 字段类型 |
|---|---|
| securityId | SYMBOL/STRING |
| tradeTime | TIMESTAMP |
| factorName | STRING |
| value | DOUBLE |
| updateTime | TIMESTAMP |
| username | SYMBOL/STRING |
以下示例展示了一种常见的建表方式:
-
按研报任务成功时间(月)进行分区
-
按因子名称进行分区
db1 =database(, partitionType = VALUE, partitionScheme =[2025.01M]);
db2 =database(, partitionType = VALUE, partitionScheme =["factor1"]);
database(directory = 'dfs://factorFromReports', partitionType = COMPO, partitionScheme = [db1,db2], engine= `OLAP)
createPartitionedTable(dbHandle = database('dfs://factorFromReports'),table = table(1:0, ["securityId","tradeTime","factorName","value","updateTime","username"],["SYMBOL","TIMESTAMP","STRING","DOUBLE","TIMESTAMP","STRING"]),tableName = 'result',partitionColumns =["updateTime","factorName"])
这种分区方式适合以下场景:
-
按任务执行时间检查结果
-
按因子名称进行因子级别管理
如果业务场景更偏向于按行情时间或按任务创建人查询数据,则可根据实际需求选择其他分区方案。
3.1.6 启用衍生因子(可选)
对于当前创建的研报因子,用户可以选择是否开启衍生因子功能:
-
若开启,在研报因子任务成功后将自动创建衍生因子任务
-
可根据当前用户的 AI 权限设置,选择衍生因子的轮数
-
每一轮将基于上一轮结果生成新的衍生因子
3.2 任务列表与任务状态说明
在任务列表中可以查看任务的状态,状态为运行中表示正在运行,当状态显示为 “运行中” 时,表明任务正在进行。任何状态的任务都可以点击因子名称进入运行界面,可查看从研报中解析出的因子的解释、公式、生成的运行代码以及代码的迭代过程。这对于研究人员追溯因子的生成逻辑、验证因子的合理性具有重要意义。
3.2.1 因子任务状态说明
每一个因子任务在执行过程中,可能处于以下几种状态。不同状态下,系统支持的操作也有所不同。
| 状态 | 备注 | 支持操作 |
|---|---|---|
|
运行中 |
因子任务正在运行中 |
可以查看详情,包含以下内容:
|
|
中断 |
因子任务被手动暂停 |
可以查看详情,包含以下内容:
并且可以编辑代码并重新启动任务 |
|
失败 |
因子任务失败 AI 请求失败,可能因为以下原因:
|
可以查看生成成功的记录 |
|
生成评价中 |
LLM 认为因子已经生成,进入评价任务 |
可以查看详情,包含以下内容:
|
|
因子函数生成失败 |
评价任务中发现因子未成功生成 |
可以查看详情,包含以下内容:
并且可以重启因子任务,也就是将状态改为运行中; 也可以修改最后一次代码,并重新启动任务 |
|
评价任务失败 |
评价任务中运行 Alphalens |
可以查看详情,包含以下内容:
可以修改最后一次代码,并重新启动任务 |
|
成功 |
所有任务通过 |
可以查看详情,包含以下内容:
|
3.2.2 任务结果与问题排查说明
当任务全部运行完成后,任务列表中的状态栏会展示最终结果。
-
成功
表示因子代码生成与因子评价均已通过,系统会返回最终代码、给出结论,并以可视化方式展示因子评价结果。
-
评价任务失败或因子函数生成失败
通常是由于数据源缺失、因子定义不清晰、字段不匹配等原因导致。可以点击详情页中的查看错误信息查看具体的报错。
3.2.3 手动干预与代码调整
在因子任务运行过程中,如果用户在任务详情页面中发现自动生成的代码需要人工优化,可以:
-
手动暂停当前任务
-
对生成的代码进行修改
-
提交修改并重新启动任务
该机制为研究人员提供了较高的灵活性。在实际应用中,当研究人员基于经验判断代码仍有优化空间时,可以及时进行调整,从而使因子评价结果更符合研究预期,提高研报分析的整体质量。
4. 衍生因子
衍生因子功能用于在已有研报因子的基础上,自动生成多个改进版本,并通过多轮迭代逐步优化因子表现,帮助研究人员找到 IC 值表现更优的因子方案。系统支持为每个衍生任务设置衍生轮数(根据用户权限)。在任务执行过程中,系统会按轮次依次生成新的衍生因子,并对每一轮结果进行评估。
衍生因子采用逐轮迭代优的方式生成。每一轮衍生因子都会在前一轮结果的基础上进行改进,而不是彼此独立生成。其核心逻辑可以概括为:
第 N 轮衍生因子 = 原始因子 + 第 1 至第 N−1 轮衍生因子的分析报告
系统会将历史轮次中已生成因子的公式和评价结论一并作为上下文输入,指导后续轮次的因子生成。
4.1 创建任务
系统提供三种创建衍生因子任务的方式。每个因子均可创建多轮衍生任务,具体轮数受用户 AI 权限配置限制。
方法一:在研报分析任务创建时,可以直接配置衍生因子
-
创建研报因子任务时,勾选生成衍生因子
-
设置需要的衍生轮数,当研报因子任务成功完成后,系统将自动开启对应的衍生因子任务,无需用户再次操作
方法二:从研报分析助手的因子任务列表中创建
-
在一个已完成的因子任务右侧操作栏中点击衍生因子
-
选择衍生轮数
方法三:从衍生因子任务列表中继续衍生
-
在列表中选择一个完成的衍生因子任务,在操作栏点击衍生因子
-
设置衍生轮数
创建成功后的任务结构说明
衍生因子任务创建成功后,任务列表中将展示如下结构:
-
新增一个父节点,表示原始因子及其基本信息
-
在父节点下方,生成 N 条子任务记录,对应 N 轮衍生过程:
-
第一轮:任务立即进入运行中状态
-
后续轮次:初始状态为等待中,前一轮完成后自动激活
-
4.2 任务列表
衍生因子任务的状态体系与研报因子任务保持一致,用户可在任务执行过程中随时查看进度和结果。详情可以参照 3.2。
除了查看单个衍生因子的任务详情外,系统还支持查看整个衍生任务的综合报告。
-
点击原始因子名,进入任务详情;
-
页面内容包括:
-
各轮衍生因子的 IC 值表格
-
不同轮次 IC 表现的对比柱状图
-
系统生成的各轮因子表现总结
-
通过这些信息,用户可以直观地对比不同轮次因子的表现,从而判断哪一轮衍生效果最优,为后续策略研究和落地提供依据。
5. 注意事项与准确性说明
在 Starfish 平台中,一个完整的因子任务不仅包含因子计算代码的生成,还包括后续的因子评价过程。因此,本章中的注意事项同时适用于因子生成阶段和因子评价阶段。在使用因子平台的 AI 研报分析功能时,需要注意 AI 自动生成的因子计算代码,其准确性会受到多方面因素的影响。该功能更适合用于快速原型验证和研究辅助,而不应被视为对研报因子逻辑的完全自动复现。
5.1 因子生成阶段
在因子生成阶段,AI 会基于研报内容、因子描述以及所选数据源结构,自动生成因子计算代码。影响该阶段生成准确性的主要因素包括以下几个方面:
-
模型自身的理解与代码生成能力:AI 对研报内容的理解深度,以及将自然语言描述转化为可执行代码的能力,直接决定了生成结果的上限。
-
因子计算逻辑的复杂程度:当研报中的计算逻辑较为简单、步骤清晰、时间频率单一时,AI 通常能够较准确地生成对应代码。而当因子涉及多层计算、条件分支、滚动窗口或跨频率处理时,理解和还原的难度会显著提升。
-
输入数据源的完整性与字段语义:因子计算往往依赖具有明确经济含义的特定字段。如果输入数据中缺失关键字段,或字段含义不直观,AI 即使生成可运行代码,也可能在经济意义上偏离研报原意。
5.1.1 研报文本信息对模型数据选择的潜在影响
部分研报标题或正文中包含明确的日期信息(如发布日期或研究时间点)。模型在理解研报内容时,可能会将这些日期误认为因子计算所需的数据时间范围,并在生成代码时自动引入时间或标的筛选条件。
当实际数据源中不存在对应时间段的数据,或数据覆盖范围不足时,因子计算阶段可能从一开始就无法获取有效数据,从而导致后续计算或评价失败。
因此,当任务在取数阶段即返回空结果时,建议优先检查生成代码中是否存在不必要的时间或标的过滤逻辑,并根据实际数据覆盖情况进行人工修正。
5.1.2 数据字段缺失带来的逻辑偏差
当研报中的因子定义依赖某些特定字段,而输入数据源未完整覆盖这些字段时,AI 可能会尝试使用其他可用字段进行近似替代。
这类替代方式在程序层面通常是可执行的,但由于缺乏必要的标准化或经济约束,可能会削弱不同资产之间的可比性,从而影响因子评价结果的稳定性与解释性。
因此,即使任务最终状态显示为“成功”,也不应默认生成结果完全符合研报中定义的原始因子逻辑。
5.1.3 复杂因子组合场景的注意事项
对于需要将多个中间因子进行组合、修正或再加工的复杂因子结构,AI 在自动复现完整研报逻辑时面临更高难度。
在这类场景中,生成的代码往往能够正常运行并产出结果,但在聚合频率、计算顺序或数据依赖关系等细节上,仍可能与研报存在系统性偏差,从而影响后续的实证回测表现。
5.2 因子评价阶段
当前因子评价使用的是 Starfish 平台内置的 Alphalens 评价模板。在因子评价阶段,需要重点关注以下几个方面,这些问题往往直接决定评价是否能够顺利完成以及结果是否可靠。
5.2.1 因子结果结构与字段约定
因子评价模块对因子结果表的字段结构存在明确约定。评价阶段要求因子结果表中至少包含以下字段:
| 字段名称 | 类型 | 含义 |
|---|---|---|
| securityId | STRING/SYMBOL | 标的代码 |
| tradeTime | TIMESTAMP/DATE | 时间 |
| factorname | STRING/SYMBOL | 因子名称 |
| value | DOUBLE/INT | 因子值 |
当因子结果表中的列名与评价模块预期不一致时,即使字段含义本身正确,也可能导致评价阶段无法识别关键字段,从而直接失败。此外,如 5.1.1 中提到的错误过滤条件,也可能导致因子结果返回空表。这种情况下,因子生成阶段可能显示为成功,但在评价阶段会直接失败。
因此,在出现字段识别或评价失败问题时,应优先检查因子结果表的结构是否符合平台约定。
5.2.2 因子数据与评价数据源的一致性要求
用于因子评价的历史价格数据,其时间戳需要覆盖因子数据中的所有时间点,并且在时间长度上不应短于因子数据,才能正确计算 IC 值、分组收益等评价指标。
同时,因子数据的时间频率需要与用于评价的历史价格数据频率保持一致。例如,分钟频因子应使用分钟频价格数据进行评价,日频因子应使用日频价格数据。
在平台实现中,因子评价会基于“资产代码 + 时间”两列进行 asof join。这意味着,如果因子表中的部分记录未能准确匹配到对应的价格数据,这种情况并不一定会直接导致评价失败,但可能对最终评价结果产生偏差。因此,当评价结果异常时,建议重点检查因子数据与价格数据在时间维度上的覆盖关系。
5.2.3 横截面样本规模不足的问题
部分因子在某些时间点仅对极少数标的生成了有效值。在这种情况下,即使因子计算阶段成功完成,评价阶段在进行 IC 计算或分层分组时,也可能因横截面样本数量不足而失败。
同样,在进行分层评价时,如果因子值分布过于集中、缺失值较多,或整体样本规模偏小,可能导致分组后无法构建有效的分层区间,从而引发评价失败。
