一、开篇
要踏入量化投资的复杂领域,本需艰难拼凑编程、交易实操、高阶数学、AI 算法、金融市场等知识拼图。但掌握已专业定制的“工作流” 这一核心绝技,就能直接复用专业投资者的经验路径 —— 像搭积木般调用现成流程,把复杂任务拆解成清晰步骤,让新手也能快速对齐专业视角,少踩坑、少绕路,高效逼近量化投资的核心能力 。
在2025年这个智能体元年的浪潮中,掌握工作流做量化投资是你抢占财富先机的绝技——从数据捕捉到策略执行,一键自动化,让AI智能体为你加倍收益,轻松驾驭市场风险。
我们一起开始快速入门量化AI工作流!
二、Panda AI 工作流介绍
相比市面上的 Coze、Dify、N8n 等支持工作流功能的智能体平台,我们Panda AI 工作流更易快速上手。尽管内置大模型(LLM),且支持工作流创建时的交互设计,但其核心定位仍是专注于工作流本身的工具(而非复合型智能体)。
为了在量化投资领域更好地运用 Panda AI 工作流,大家应该先对工作流建立整体认知。我们先从工作流的定义与使用方法讲起。
(一)、什么是工作流?
工作流就像是一条"智能生产线",通过连接各种功能模块来完成特定任务。想象一条自动化的生产线,每个工人负责特定的任务,按顺序完成产品制造。这就是工作流的基本概念。
工作流不只是冰冷的技术流程,而是一种解决问题的思维方式和核心能力。 一切任务都能拆解成清晰的工作流。所以工作流是一种流程编排的能力。在工作流中我们可以编排各种节点,让各个功能节点配合完成某一项功能。
在我们Panda AI这条“生产线”帮助你把各种节点功能组合在一起,实现你想要的量化分析功能。
1、为什么要用工作流?
在GPT等大模型提示词里都有 Workflow 了,为什么还得专门用「工作流」呢?
大模型虽然擅长语义理解和文本生成,但存在不少短板:外部功能集成难度高,没法直接调用数据库、访问第三方 API,也不支持文件上传下载;数据处理能力有限,很难保证输出格式统一,更没法自主完成数据存储和分析;流程确定性差—— 要是单纯靠大模型跑工作流,结果就跟 “开盲盒” 似的,生产环境根本没法接受这种不确定性。
而我们PandaAI 工作流,刚好能补上这些缺口:能把多个模型节点串起来协同工作,还能灵活调用各类外部服务;流程管控很扎实,可以给步骤 “上枷锁”—— 设定严格执行逻辑,做输入验证、错误处理。
更贴心的是,工作流配了 直观的可视化界面 ,就像给你一张 “万能画布”:
- 📌 拖一拖就能摆好功能模块(跟搭积木一样简单)
- 🔍 改一改能实时看运行效果(不用猜流程咋跑的)
- 📊 瞅一瞅能追数据咋流转的(每一步处理都清清楚楚)
以「番茄炒蛋」为例:
处理食材 => 炒番茄 => 煎鸡蛋 => 混合翻炒 => 装盘上桌
这就是一个最简单的 “工作流”,生活中处处都有工作流的影子:
- 👨 做饭的步骤
- 🏋️ 运动健身的训练计划
- 🎓 学生完成作业的流程
这些都是 有序的步骤组合,帮助我们更高效地完成任务。
💡 工作流最大的魅力在于:
- ✅ 把复杂的任务分解成简单步骤
- ⏳ 确保每一步都按顺序执行
- ✨ 提高工作效率,减少出错
2、工作流思维的核心三要素
工作流有以下三个核心要素:
💡 工作流思维 = 结构化思考 + 模块化设计 + 流程化实现
在量化研究中,完成一次多因子检验的全流程,就非常考验工作流思维的应用。
专业的量化分析师在做因子检验时,行为逻辑完全贴合这三个核心要素:
(1)、结构化思考:把大问题拆解成小问题
如果要完成一套完整的多因子检验,分析师首先会用结构化思考拆解目标:
💡 要点:结构化思考就是把一个大目标分解成清晰的、可管理的小目标。
- ✅ 数据预处理:对原始因子数据做清洗(剔除异常值、填补缺失值)
- ✅ 数据标准化:对因子做中性化(剔除行业/市值影响)和标准化(Z-score处理)
- ✅ 基础验证:开展因子检验(计算IC值、分组收益、单调性等)
- ✅ 因子精选:通过因子筛选(剔除冗余因子、保留有效因子)
- ✅ 组合构建:进行因子合成(如等权/IC加权组合因子)
- ✅ 效果验证:最终做策略回测(检验因子组合的收益与风险)
(2)、模块化设计:独立又能组合的积木
每个检验环节都是独立的模块:
模块的特点:
- 🖥️ 可以独立完成(数据清洗不影响后续的中性化处理,可单独调试)
- 🧩 可以灵活组合(若因子本身已标准化,可省略标准化模块;若只需单因子检验,可跳过合成环节)
- ♻️ 可以重复使用(数据清洗的逻辑适用于所有因子,中性化代码可复用于不同因子池)
💡 模块化设计让因子检验更灵活,某一环节出错时只需调整对应模块,无需重构全流程,复用性极强。
(3)、流程化实现:有序推进的节奏
最后将多因子检验的过程流程化:
步骤轴安排:
第一步:数据清洗(优先处理原始数据的“脏数据”,为后续环节打底)
第二步:中性化、标准化(基于清洗后的数据,统一因子量纲和影响维度)
第三步:因子检验(用标准化后的数据计算IC、分组收益,验证因子有效性)
第四步:因子筛选(根据检验结果,剔除IC低、单调性差的无效因子)
第五步:因子合成(对筛选后的有效因子做加权组合,形成综合因子)
第六步:回测验证(用合成因子构建策略,回测收益、夏普率、最大回撤等指标)
流程化的好处:
- 🕒 避免返工(先清洗再标准化,跳过清洗直接标准化会导致结果失真)
- 🎯 明确执行顺序(因子合成必须在筛选后,否则会纳入无效因子)
- 💻 形成可复现的标准流程(新因子加入时,直接套用流程即可快速检验)
- 📈 提升效率(每个步骤的输出作为下一个步骤的输入,数据流转无缝衔接)
💡 流程化实现确保任务有序推进,提高执行效率。
(二)Panda AI工作流节点:工作流的基础构件
工作流就像一个完整的 Standard Operating Procedure(标准操作程序)中每个步骤都很重要。在工作流中,节点是工作流的基础单元,也是搭建工作流的最小组成单位(积木),每个节点代表一个特定的功能或步骤。它们通过连接形成一个完整的流程,从开始节点到结束节点,数据在这些节点之间传递和处理。每个节点都可以有输入参数和输出返回值,这些参数和返回值用于控制流程的执行和传递数据。
1、开始、结束和中间节点
工作流中的每个节点都有其特定作用:
开始节点:开始节点就像是工作流的"大门",是每个工作流必须的起始点。它的主要作用是接收用户的输入信息,为整个工作流提供初始数据。
- 就像量化分析的启动键,定义策略的初始输入(如数据范围、因子公式等)
- 决定需要什么输入才能启动(回测起始日、因子参数阈值)
特定功能节点:各种处理组件
- 就像量化分析中拆解的各个具体任务(因子构建、选择机器学习模型)
- 每个节点都负责特定的功能(如 “ 因子计算” 节点、“风险平价权重分配” 节点)
结束节点:结束节点是工作流的"出口",用于输出整个工作流的最终结果。
- 就像量化分析的收官环节,输出策略结论(如回测报告、交易信号、IC检验结果)
- 负责输出处理结果(如收益曲线、最大回撤数据)
💡 我们在学习工作流的前期最好学习所有的功能节点的使用。先参考目前PandaAI的节点和功能,日后会持续迭代节点功能和新节点。
以Panda AI工作流的基本节点功能和介绍为例:
分类 | 节点名称 | 功能 |
---|---|---|
01-基础工具 | Python代码输入 | 输入的 Python 代码,可能用于后续的因子计算、模型训练等操作。 |
02-特征工程 | 公式输入 | 输入的因子公式或特征公式,为后续的特征工程或因子构建提供基础。 |
02-特征工程 | 特征工程构建 | 根据输入的特征公式和标签公式,结合指定的时间范围,生成特征值和特征工程模型 |
02-特征工程 | 特征工程构建(旧) | 根据输入的特征公式和标签公式生成特征工程模型 |
03-机器学习 | GRU模型 | 使用特征工程的结果,在指定的时间范围内训练 GRU模型。 |
03-机器学习 | LSTM模型 | 使用特征工程的结果,在指定的时间范围内训练 LSTM模型。 |
03-机器学习 | LightGBM模型 | 使用特征工程的结果,在指定的时间范围内训练 LightGBM 回归模型。 |
03-机器学习 | SVM模型 | 使用特征工程的结果,在指定的时间范围内训练支持向量回归(SVM)模型。 |
03-机器学习 | Xgboost模型 | 使用特征工程的结果,在指定的时间范围内训练 XGBoost 回归模型。 |
03-机器学习 | Xgboost模型(旧) | 使用特征工程的结果训练 XGBoost 回归模型。 |
03-机器学习 | 多任务神经网络 | 根据多个特征工程模型,在指定的时间范围内训练多任务神经网络模型。 |
03-机器学习 | 随机森林模型 | 使用特征工程的结果,在指定的时间范围内训练随机森林回归模型。 |
04-因子相关 | 单因子集合到因子组 | 将多个单因子组合成一个因子组,可能用于后续的因子分析或因子构建。 |
04-因子相关 | 因子分析 | 对输入的因子 DataFrame 进行因子分析,评估因子的有效性和稳定性。 |
04-因子相关 | 因子分析结果 | 根据因子分析的任务 ID,绘制因子分析的结果图表,直观展示因子的性能。 |
04-因子相关 | 因子权重调整(归一化) | 对输入的因子值 DataFrame 进行权重调整,并确保权重归一化,以改变因子在综合因子中的影响力。 |
04-因子相关 | 因子构建(机器学习) | 使用机器学习模型和特征工程的结果,在指定的时间范围内构建因子。 |
04-因子相关 | 因子构建节点 | 未在给定代码中明确体现,但推测是根据输入的模型和特征,构建因子。 |
04-因子相关 | 因子相关性分析 | 对多个因子 / 因子组进行合并操作,并对合并后的因子组进行两两相关性分析,评估因子之间的相关性。 |
04-因子相关 | 因子相关性分析结果 | 展示因子之间的相关性结果 |
04-因子相关 | 因子集合器 | 多个因子dataframe 合并 |
04-因子相关 | 综合因子构建节点 | 根据输入的参数,如开始时间、结束时间、因子代码、市场类型、编码方式和因子方向,构建综合因子。 |
05-回测相关 | 期货回测 | 在指定的时间范围内,对期货交易策略进行回测,评估策略的性能。 |
05-回测相关 | 策略回测结果 | 根据回测任务的 ID,绘制回测结果的图表,直观展示策略的收益、风险等指标。 |
05-回测相关 | 股票回测 | 在指定的时间范围内,对股票交易策略进行回测,评估策略的性能。 |
06-线下课专属 | PCA因子构建 | 使用训练好的机器学习模型和特征工程的结果,在指定的测试和预测时间范围内构建 PCA 因子。 |
06-线下课专属 | Spearman因子构建 | 使用 Spearman 相关系数构建因子,用于评估因子与收益之间的相关性。 |
06-线下课专属 | 因子IC计算 | 计算因子的信息系数(IC),评估因子的预测能力。 |
06-线下课专属 | 因子权重组合 | 根据输入的因子值 DataFrame 和因子权重列表,计算新的因子值,实现因子的加权组合。 |
06-线下课专属 | 因子构建(机器学习-单模型多特征) | 使用单个机器学习模型和多个特征工程模型,在指定的时间范围内构建因子。 |
06-线下课专属 | 多因子构建(机器学习) | 使用多个机器学习模型和特征工程模型,在指定的时间范围内构建多因子。 |
这些是我们目前提供的工作流的“地基”,只有把地基打牢了,我们才能灵活的构建各种需要的工作流
2、输入参数变量和返回值
每个节点(Node)本质上是一个函数或类方法,它有“输入参数”(InputModel/参数变量)和“返回值”(OutputModel/返回值)。每个节点都需要输入参数,也都会返回结果,即使它只是流程中的中间环节。这些输入参数和返回值通常用 Pydantic 的 BaseModel 进行结构化建模,方便类型校验和序列化。
参考下面所有节点的输入和输出值:
啊
节点名称 | 输入参数 | 输出返回值 |
---|---|---|
Python代码输入 | code (str) | code (str) |
公式输入 | 公式 (str) | 公式 (str) |
特征工程构建 | 公式(特征值)、标签值,时间区间 | 因子值 DataFrame, feature_model (包含特征和标签信息的特征工程模型) |
特征工程构建(旧) | 公式(特征值)、标签值 | feature_model (包含特征和标签信息的特征工程模型) |
GRU模型 | 特征工程模型、时间区间、其他模型参数 | 训练好的 GRU模型 |
LSTM模型 | 特征工程模型、时间区间、其他模型参数 | 训练好的 LSTM模型 |
LightGBM模型 | 特征工程模型、时间区间、其他模型参数 | 训练好的 LightGBM 模型 |
SVM模型 | 特征工程模型、其他模型参数 | 训练好的 SVM 模型 |
Xgboost模型 | 特征工程模型、其他模型参数 | 训练好的 XGBoost 模型 |
Xgboost模型(旧) | 特征工程模型、其他模型参数 | 训练好的 XGBoost 模型 |
多任务神经网络 | 特征工程模型(最多5个)、时间区间、模型参数 | 训练好的多任务神经网络模型 |
随机森林模型 | 特征工程模型、其他模型参数,如树的数量、最大深度等 | 训练好的随机森林模型 |
单因子集合到因子组 | 多个单因子的 DataFrame | 合并后的因子组 DataFrame |
因子分析 | 因子 DataFrame、调整周期、分组数量、因子方向 | 因子分析任务的 ID |
因子分析结果 | 因子分析的任务 ID | 图表绘制–生成可视化 |
因子权重调整(归一化) | 因子值的 DataFrame、调整权重 | 经过权重调整和归一化后的因子值 DataFrame。 |
因子构建(机器学习) | 机器学习模型、特征工程模型、时间区间 | 构建好的因子的 DataFrame |
因子构建节点 | 机器学习模型、特征工程模型 | 构建好的因子 |
因子相关性分析 | 最多 5 个因子 、 因子组的 DataFrame | 因子相关性分析 ID |
因子相关性分析结果 | 因子相关性分析 ID | 图表绘制–生成可视化 |
因子集合器 | 最多 5 个因子 、 因子组的 DataFrame | 合并多个DataFrame |
综合因子构建节点 | 时间区间、因子代码、标的类型、编码方式、因子方向 | 构建好的综合因子的 DataFrame |
期货回测 | 期货代码、回测期间、调仓频率、初始资金、佣金率、基准指数、因子数据 | 回测任务的 ID |
策略回测结果 | 回测任务的 ID | 图表绘制–生成可视化 |
股票回测 | 股票代码、回测期间、调仓频率、初始资金、佣金率、基准指数、因子数据 | 回测任务的 ID |
PCA因子构建 | 机器学习模型、特征工程模型、测试时间区间、预测时间区间 | 因子权重/构建好的 PCA 因子的 DataFrame |
Spearman因子构建 | 相关因子数据和收益数据 | 构建好的 Spearman 因子 |
因子IC计算 | 因子 DataFrame、调整周期、分组数量、因子方向 | 因子的 IC 值 |
因子权重组合 | 因子值 DataFrame和权重表 | 包含新因子值的 DataFrame |
因子构建(机器学习-单模型多特征) | 回测时间区间、单个机器学习模型和多个特征工程(最多5个) | 构建好的因子的 DataFrame |
多因子构建(机器学习) | 回测时间区间、机器学习模型和特征工程(最多5个) | 构建好的多因子的 DataFrame |
节点之间的连接:
节点之间的连接就像是传送带,可以把数据从一个节点传递到另一个节点。数据会像接力棒一样一层一层的往下传递。
3、为什么结果导出使用JSON文件?
JSON 的核心是 “连接性” —— 它像桥梁一样,让不同系统、语言、设备之间能高效交换数据。理解和运用 JSON,本质是掌握数据流通的 “桥梁规则”。JSON 是应用程序用来记录或传递信息的文字,类似人类沟通的汉字,是一种约定规范。学习 JSON,本质就是掌握这份规范,不懂编程的朋友们无需畏难较真。
程序间传递信息选择 JSON,源于两大优势:
- 易读易写:语法简洁直观,方便程序员阅读调试;
- 轻量高效:格式紧凑、数据量小,网络传输更高效(相同信息密度下,数据越少越利于传输)。
JSON 核心有两种数据结构是对象与数组,可通过表格类比理解:
- 对象(Object):类似表格的一行,由键值对组成(如记录一名学生信息);
- 数组(Array):类似表格的多行集合,由多个对象组成(如记录多名学生信息)。
用3种例子说明格式:
3.1 Object(对象)的语法结构
对象用 大括号 {}
包裹键值对:
- 确定键值对(如股票信息:
stock_code= 600519
、market_cap=25000
、pe_ratio=28.5
); - 写大括号
{}
; - 填入键值对,格式为
{"键":"值"}
(如{"stock_code":"600519", "market_cap":18, "pe_ratio":28.5}
)。
3.2 Array(数组)的语法结构
数组用 中括号 []
包裹多个对象:
- 放入第一个对象(如
{"stock_code":"600519", "收盘价":18}
); - 放入第二个对象(如
{"stock_code":"300750", "收盘价":20}
);
最终形式json:
[{"stock_code":"600519", "收盘价":18}, {"stock_code":"300750", "收盘价":20}]
3.3 复杂数据结构的精髓:嵌套
JSON 的强大在于 “对象与对象、对象与数组相互嵌套”:
- 例:一个多因子策略(对象)中嵌套多个因子数组,每个因子(对象)又嵌套参数配置(对象)和回测结果(数组):
{ "strategy_name": "多因子选股策略", // 策略名称(对象的键值对) "strategy_type": "量化选股", // 策略类型(对象的键值对) "factors": [ // 选股因子列表(对象嵌套数组) { "factor_name": "动量因子", // 因子1:对象 "param": {"period": 20}, // 因子参数(对象嵌套对象) "weight": 0.4 // 因子权重 }, { "factor_name": "市盈率因子", // 因子2:对象 "param": {"type": "静态PE"}, // 因子参数(对象嵌套对象) "weight": 0.3 // 因子权重 }, { "factor_name": "市值因子", // 因子3:对象 "param": {"unit": "亿元"}, // 因子参数(对象嵌套对象) "weight": 0.3 // 因子权重 } ] }
下面介绍两个JSON可视化工具。学习JSON 或者最后导出结果检查时,可借助工具直观解析:
最后Panda AI工作流结束后导出的json格式如下:
(三)构建工作流的技巧
越是复杂的需求,工作流的拆解就会变得尤其重要:越到后面,阻塞我们的是工作流拆解和构建能力。为了提高构建工作流能力简单梳理了几个技巧:
- 开始设计工作流时,要先想清楚你的流程图(这个能力与PandaAI工作流无关,而是你做成一件事情的能力)
- 根据你的流程图,确定好每一个节点对应的功能节点(确认节点是否可以满足需求)
- 针对每一个节点,想清楚你的输入和输出(非常重要!!)
- 构建好工作流之后,善用调试功能,针对每个节点进行调试,确保每个节点的输入和输出符合预期
- 最后再进行整体测试(即通过不同的输入,观察最后的结果是否符合预期)
每个人每天都在经历各种各样的工作流,而效率的差异往往在于:
效率高的人:将构建和优化工作流当成了一种习惯
这种习惯带来的改变是潜移默化的:
- 从被工作流驱动,到主动设计工作流
- 从简单重复操作,到持续优化提升
接下来,我们就动手用 PandaAI 工作流,一步步实现多因子分析的全流程吧。
三、PandaAI 工作流实践- 多因子检验
我们正式进入 PandaAI 工作流的实操步骤。
(一)、预备知识
在进入实操之前,如前面所述,我们需要有清晰的流程思路,再将这些思路拆解为具体的工作节点。所以第一步是梳理流程。以单因子和多因子检验为例,我们一步步展开实操。首先,我们先明确这方面的思想框架。
1、多因子分析框架
多因子分析流程大致为:先通过 “公式输入” 或 “Python 代码输入” 构建多个单因子;再将单因子合并为因子组,进行 IC 值计算、相关性分析等评估;接着调整因子权重并组合成综合因子;最后通过回测验证效果,输出分析结果。
2、节点组合举例
从节点名称中可判断开始节点和结束节点。目前 PandaAI 有 2 个带 “输入” 字段的开始节点和 3 个带 “结果” 字段的结束节点。其他节点可以认为是中间节点。
节点名称 | 输入参数 | 输出返回值 |
---|---|---|
Python代码输入 | code (str) | code (str) |
公式输入 | 公式 (str) | 公式 (str) |
因子分析结果 | 因子分析的任务 ID | 图表绘制–生成可视化 |
因子相关性分析结果 | 因子相关性分析 ID | 图表绘制–生成可视化 |
策略回测结果 | 回测任务的 ID | 图表绘制–生成可视化 |
“Python 代码输入” 和 “公式输入” 是工作流的原始信息入口,也是核心开始节点;“因子分析结果” 、 “策略回测结果”和“因子相关性分析结果” 以 “结果” 为核心,输出最终呈现内容,最终可查看可视化页面。此外,工作流的所有参数最终可导出为 JSON 格式,方便日后导入复用。设定了开始和结束节点之后,按照流程思路选择相应的中间节点就可以。下面我们具体看看实际操作。
(二)、单因子检验
我们开始创建单因子检验工作流。首先进 PandaAI 官网,点 “AI 工作流” 。
然后点右上角的 “新建”,就能进入新工作流的创建界面了。
按照单因子检验的流程,把 “公式输入→综合因子构建节点→因子分析→因子分析结果” 这些节点依次连起来。
开始节点也能选 “Python 代码输入”;“公式输入” 更适合不会 Python 的用户,具体用法可以看这个链接:
https://www.pandaai.online/community/article/72
这里举个例子,选的因子是 20 日平均换手率。根据自己的需求调完每个节点的参数后,点 “开始” 按钮就可以运行了。等运行结束,“开始” 按钮的进度条会走完变回原来的样子,右上角还会弹出 “运行完成” 的提示。之后在结束节点能看到 “分析结果” 的可视化页面,右侧的导入、导出按钮可以用来操作 JSON 格式的文件。
我们点开 “查看分析结果” 看看。第一个图是用来观察分组效应的。
接着能看到因子收益率、夏普比率、年化收益、IC、Rank_IC、IC_IR 等检验指标,还有分组后的结果。
下一个图是 Normal IC 的衰减图、分布图、累计图和自相关图。
再下一个是 Rank IC 的衰减图、分布图、累计图和自相关图。
最后一个是因子分组收益率和超额收益率图。
(三)、多因子组合检验+策略回测+因子相关性分析
这次我们尝试更复杂的工作流——同时查看三类可视化结果:因子分析结果、策略回测结果与多因子相关性分析。
多因子检验、策略回测及因子相关性分析的完整工作流逻辑如下:
1、代码输入(多个)->综合因子构建节点 -> 因子权重调整(归一化)-> 多因子合并-> 因子分析 -> 因子分析结果 2、代码输入(多个)->综合因子构建节点 -> 因子权重调整(归一化)-> 多因子合并+ 策略交易代码->股票回测 -> 策略回测结果 3、代码输入(多个)->综合因子构建节点 -> 因子权重调整(归一化)-> 因子集合器 ->因子相关性分析 -> 因子相关性分析结果
1、多因子检验
先看整个流程里代码部分的操作方法。选好 3 个相关因子后,在 “公式输入” 或 “Python 代码输入” 中填写好,接着连接到 “综合因子构建节点”。依据自身判断调整权重(进行归一化处理),再把这些因子接入 “多因子合并” 节点 —— 该节点最多可连接 5 个因子。
后续步骤和上面“单因子检验”类似,将节点连接到 “因子分析” 和 “因子分析结果” 即可。
2、策略回测结果
接着看与策略回测结果相关的节点。
先处理代码输入:这里要填写策略相关代码,其中包含量化交易的基本框架,即依靠因子选股、定期调仓来管理投资组合。此代码可根据市场规则和风险控制需求修改,灵活调整。填写好后连接到 “股票回测” 节点,选好基准指数、佣金比例、回测频率等参数,最后接入 “策略回测结果” 节点即可。
策略相关代码可以参考下面的示例:
from panda_backtest.api.api import *
from panda_backtest.api.stock_api import *
import pandas as pd
import numpy as np
import copy
import datetime
import re
import pickle
import sys
def initialize(context):
"""
策略初始化函数,在回测开始前执行一次
"""
# 策略核心参数设置
context.s_top_n = 10 # 每次调仓买入因子值最高的前N只股票
context.s_rb_period = 5 # 调仓周期(单位:交易日)
# 因子数据预处理
# 重置索引以便后续处理
context.df_factor = context.df_factor.reset_index()
# 计算因子值:按股票分组并滞后1期(避免未来函数)
# context.df_factor.columns[3] 为原始因子列名
context.df_factor['factor_value'] = pd.to_numeric(
context.df_factor
.groupby('symbol')[context.df_factor.columns[3]]
.shift(1),
errors='coerce' # 无法转换的值设为NaN
)
# 打印因子数据信息用于调试
print(context.df_factor)
context.account = '8888' # 设置回测账户ID
print(f"因子总行数: {len(context.df_factor)}")
print(f"因子列名: {list(context.df_factor.columns)}")
def handle_data(context, bar_dict):
"""
每个交易日执行的策略逻辑函数
"""
# 判断是否为调仓日(通过日期数值对调仓周期取模)
if int(context.now) % context.s_rb_period != 0:
return # 非调仓日直接返回,不执行任何操作
print(f"调仓日:{context.now}")
today = context.now
# 选股逻辑:筛选当日因子数据并按因子值降序排序
df_today = context.df_factor[context.df_factor["date"] == today]
df_today_sorted = df_today.sort_values('factor_value', ascending=False)
buy_list = df_today_sorted.head(context.s_top_n)['symbol'].tolist()
SRLogger.info(f"买入列表: {buy_list}")
# 获取选股列表的行情数据(收盘价)
quotation_df = stock_api_quotation(
symbol_list=buy_list,
start_date=today,
end_date=today,
period="1d"
)
# 转换为 {股票代码: 收盘价} 的字典结构
per_close = quotation_df.set_index('symbol')['close'].to_dict()
symbols = list(per_close.keys())
# 资金管理:计算每只股票的分配资金
total_value = context.stock_account_dict[context.account].total_value # 获取账户总资产
single_symbol_value = total_value / context.s_top_n # 平均分配资金到每只股票
# 构建下单指令字典 {股票代码: 买入手数}
orders = {}
for symbol in symbols:
if symbol not in per_close:
print(f"缺失数据: {symbol},跳过该股票")
continue
# 计算理论买入手数(未考虑交易单位限制)
hands = single_symbol_value / per_close[symbol]
# 根据股票板块类型(创业板/非创业板)处理交易单位
if symbol.startswith('300'): # 创业板股票(以300开头)
contract_mul = 200 # 假设创业板最小交易单位为200手(实际应为100,此处可能为自定义规则)
hands = np.floor(np.abs(hands)) # 向下取整为整数手
if hands < 200:
hands = 200 # 确保至少买入200手
else: # 非创业板股票
contract_mul = 100 # 非创业板最小交易单位为100手
hands = np.floor(np.abs(hands) / 100) * 100 # 向下取整为100的整数倍
orders[symbol] = hands
print(f"{symbol}: 合约乘数={contract_mul}, 收盘价={per_close[symbol]}, 下单手数={hands}")
# 执行交易指令
# 参数:账户ID、股票与手数的字典、未知参数(可能为交易类型或优先级)
target_stock_group_order(context.account, orders, 0)
因子分析的可视化结果和单因子的差不多,此处不再赘述。
重点看回测结果:能看到年化收益、夏普比率、Alpha、Beta 等核心指标,还有策略收益、超额收益、基准收益的曲线对比,十分清晰。
另外,每笔交易的明细可查询,账户资金的变动情况也能查看,细节呈现得很清楚。
3、相关性分析结果(附 Barra相关性分析)
我们再看看多个因子之间的相关性分析以及 Barra 相关性分析。按照上述起始节点,将调整后权重的这些因子,通过 “因子集合器” 连接后,可继续连接到因子相关性分析节点和结果节点。在此,我们可依据参数查看 Barra 相关性分析结果。
先看第一个结果:相关性热力图,也就是 3 个因子的线性相关性分析结果。多因子相关性分析的核心目的是识别因子间的统计关联,以此优化投资组合构建和风险管理。通过检测因子间的信息冗余(如高度相关的价值与盈利因子),可避免组合过度依赖重复信号;同时,低相关性因子的组合能够有效分散风险(如动量 + 价值 + 质量因子的组合)。
我们观察到,factor1 与 factor3 相关系数达 0.9325,高度正相关,信息重叠严重,若同时纳入模型易引发多重共线性风险,需通过剔除冗余因子或正交化处理;而 factor1 与 factor2(0.0037)、factor2 与 factor3(0.004)的相关系数趋近于 0,线性关联极弱,信息互补性强,可保留以丰富因子体系维度。
再看 Barra 相关性分析。Barra 分析的目的是用 “因子暴露” 解构投资组合的风险 - 收益逻辑,让风险可测、策略可归因、优化可落地,最终支撑更科学的投资决策。
这里列出的 10 个因子相关性结果,覆盖了 Barra 模型核心的风格与风险维度,属于 Barra 分析中最基础、最通用的因子集合,它们是 beta(市场贝塔)、book_to_price_ratio(市净率倒数 - 价值因子)、earnings_yield(盈利收益率 - 价值因子)、growth(成长因子)、leverage(杠杆因子)、liquidity(流动性因子)、momentum(动量因子)、non_linear_size(非线性规模因子)、residual_volatility(残差波动率)、size(规模因子)。
对 10 个因子的 Barra 属性解析
因子名称 | Barra 体系中的定位 | 核心作用 |
---|---|---|
beta |
市场风险因子 | 衡量股票对市场波动的敏感度,是 “市场风险” 向 “风格暴露” 的延伸(不同风格组合的 beta 天然不同)。 |
book_to_price_ratio |
价值风格因子 | 市净率倒数,负值越高 = 成长属性越强(高市净率隐含高增长),正值越高 = 价值属性越强(低市净率)。 |
earnings_yield |
价值风格因子 | 盈利收益率(盈利 / 股价),与 book_to_price_ratio 协同刻画价值风格(从盈利角度补充估值维度)。 |
growth |
成长风格因子 | 直接刻画公司盈利 / 规模增长预期,是成长策略的核心锚点。 |
leverage |
风险风格因子 | 衡量财务杠杆,负值越高 = 财务越保守(风险低),正值越高 = 杠杆越高(风险高)。 |
liquidity |
交易风格因子 | 刻画股票交易活跃性(买卖成本、换手率等),是机构策略的关键约束(大资金需高流动性)。 |
momentum |
动量风格因子 | 捕捉 “强者恒强”(正暴露)或 “反转效应”(负暴露),是趋势 / 反转策略的核心依据。 |
non_linear_size |
规模风格的非线性延伸 | 捕捉规模之外的波动特征(如小盘股的 “溢价波动”),弥补size 线性假设的不足。 |
residual_volatility |
特异性风险因子 | 衡量股票独立于市场和因子的波动(与大盘 / 风格无关的 “个股风险”),高暴露代表 “个股故事性强”。 |
size |
规模风格因子 | 直接刻画公司市值,正值越高 = 大盘股,负值越高 = 小盘股,是最基础的风格划分维度。 |
本文围绕 多因子检验、策略回测与多因子及 Barra 相关性分析 的整合工作流展开,通过构建从 因子挖掘→策略验证→风险拆解 的完整闭环,支撑量化投资的科学决策。
四、总结
我们已经介绍了Panda AI工作流在量化投资中的应用,其核心要素包括结构化思考、模块化设计和流程化实现,也详细说明了节点的功能及节点间通过输入输出参数实现数据传递的逻辑。实操层面,多因子检验流程从单因子构建、合并评估,到权重调整、回测验证,最终输出可视化结果,整体大幅降低了量化投资的技术门槛,助力用户高效完成从因子构建到策略回测的全流程。
相关代码已开源至GitHub,可直接访问获取。
https://github.com/PandaAI-Tech/panda_quantflow
便于有二次开发需求的用户参考使用。借助该工作流,可以快速复现因子检验、回测、机器学习及深度学习等相关研报内容,后续我们将持续分享具体“机器学习”实操案例,敬请期待近期更新!