金融深度学习 2024-12

预期协同效应分析工具

基于多agent强化学习的预期协同效应分析研究,以及相应研究系统

投资者预期协同的资产定价研究——基于AI-Agent视角·研究与系统实现

一、研究概述

1.1 研究目的

本研究旨在构建基于AI-Agent的预期分散度因子(AED, Agent-based Expected Dispersion),作为基准研究《投资者预期协同的资产定价研究——基于多特征机器学习视角》中IED(Investor Expected Dispersion)因子的改进版本。

核心目标: - 使用AI-Agent模拟不同投资者的异质性预期 - 通过Agent的决策差异构建AED因子 - 检验AED因子在资产定价中的有效性

1.2 核心创新点

  1. Agent替代神经网络:使用AI-Agent代替随机初始化的神经网络,通过更灵活的异质性设计模拟投资者差异
  2. 异质性设计
  3. 信息能力,包括获取的数据量、窗口大小、分析能力等
  4. 网络异质性,使用不同的神经网络结构,如MLP,TCN,LSTM,Transformer-llm等
  5. 端到端学习:采用强化学习直接学习交易策略,而非预测收益率后再决策

二、参考项目

本研究参考了以下开源项目和技术框架:

2.0 基准研究

  • 网络结构:单层感知机
  • 训练方式:单证券 + 单月份 + 滚动窗口训练
  • 异质性来源:初始化权重矩阵,模拟对不同因子的注意力

2.1 Agent-Lightning

  • 用途:RL训练LLM的框架,用于Agent的强化学习训练
  • 参考点:Agent训练流程、RL算法集成

2.2 AI-Hedge-Fund

  • 用途:多LLM-Agent投资系统
  • 参考点
  • Agent设计模式
  • 决策机制(离散动作+置信度)
  • 多Agent协同工作方式
  • 问题:没有训练的信息

2.3 TwinMarket

  • 用途:LLM驱动的市场模拟系统
  • 参考点
  • 单AI决策(信息->belief->决策)
  • 模拟交易市场
  • 问题:同样没有训练信息

2.4 HuggingFace / Transformer

  • 用途:基于torch的llm模型框架,是可以调参的模型
  • 参考点
  • LLM模型加载和训练(如Qwen2.5-1.5B)
  • Transformer架构理解
  • 模型微调方法

2.5 FinRL

  • 用途:金融强化学习框架
  • 参考点
  • 多证券决策
    • 输入:(m只证券 * 每个证券n个特征 + 现金)展品为单维向量
    • 输出:m只证券+现金的决策空间
  • 建模方式:单层感知机 + RL(DPO,PPO等算法)
  • 奖励函数:资产组合收益率,风险,夏普等组合

2.6 Stable Baselines3 (SB3)

  • 用途:强化学习算法库
  • 参考点
  • PPO、SAC等RL算法实现
  • MLP策略网络设计
  • 训练流程标准化

三、Agent设计

3.1 agent工作流程

agent流程:agent由数据输入,网络和决策和奖励强化四个部分组成,具体流程为:

flowchart TD Start([Agent启动]) --> LoadData[滚动窗口<br/>数据输入<br/>从Redis加载因子数据<br/>和收益率数据] LoadData --> Preprocess[数据预处理<br/>标准化/归一化<br/>构建状态向量] Preprocess --> Network[网络处理<br/>MLP/TCN/LSTM/Transformer等策略网络<br/>输入: 状态向量<br/>输出: 交易动作] Network --> Decision[决策输出<br/>采样动作<br/>执行交易决策] Decision --> Execute[执行交易<br/>买入/卖出/持有] Execute --> Observe[观察环境<br/>获取新状态<br/>计算即时奖励] Observe --> Reward[奖励计算<br/>基于收益率<br/>风险调整收益] Reward --> Store[存储经验<br/>状态-动作-奖励<br/>存入经验回放缓冲区] Store --> Train{是否训练?} Train -->|达到批次大小| Update[网络更新<br/>PPO/SAC算法<br/>梯度反向传播<br/>更新策略参数] Train -->|未达到| NextStep[下一步] Update --> NextStep NextStep --> CheckEnd{训练完成?} CheckEnd -->|否| LoadData CheckEnd -->|是| SaveModel[保存模型<br/>保存策略网络参数] SaveModel --> End([结束]) style Start fill:#e1f5ff style End fill:#e1f5ff style LoadData fill:#fff4e1 style Network fill:#e8f5e9 style Decision fill:#f3e5f5 style Reward fill:#ffebee style Update fill:#e3f2fd

3.2 数据预处理

  • 每次加载一个窗口(一般为12个月)的全量证券(如3500个)数据,共12 * 88 * 3500 个数据
  • 标准化:以月为单位,横向标准化(证券,因子)
  • eg. 202501-qr因子,求所有证券的qr均值\(\mu\)和标准差\(\sigma\),对于某个证券i,标准化其\(qr_{i,stan} = \frac{qr_i - \mu}{\sigma}\)

3.3 输入

3.3 输入方式

尝试不同的输入方式,探索最优的特征表示:

类型 数据形状 示例 特征维度
1. 单月单证券向量 (1, 88) 证券000001在202501月的88个因子 88
2. 多月单证券序列 (T, 88) 证券000001在T个月窗口内的因子序列 T×88
3. 多月单证券矩阵 (T, 88) 同上,但以矩阵形式组织 T×88
4. 多月多证券张量 (T, N, 88) T个月窗口内N个证券的因子数据 T×N×88
  • 1. 单月单证券向量(形状:\((88,)\)
  • 示例:\(202501\text{-}000001\text{-}(qr, mom36, \ldots)\)
  • 数学表示:\(\mathbf{x}_{t,s} \in \mathbb{R}^{88}\),其中 \(t\) 为月份,\(s\) 为证券代码

  • 2. 多月单证券序列(形状:\((T, 88)\)

  • 示例:\(000001\text{-}(qr_{202501}, mom36_{202501}, \ldots, qr_{202502}, \ldots)\)
  • 数学表示:\(\mathbf{X}_s = [\mathbf{x}_{t_1,s}; \mathbf{x}_{t_2,s}; \ldots; \mathbf{x}_{t_T,s}] \in \mathbb{R}^{T \times 88}\)

  • 3. 多月单证券矩阵(形状:\((T, 88)\)

  • 与方式2相同,但以矩阵形式组织:\(\mathbf{M}_s \in \mathbb{R}^{T \times 88}\)

  • 4. 多月多证券张量(形状:\((T, N, 88)\)

  • 数学表示:\(\mathcal{T} = [\mathbf{X}_{s_1}; \mathbf{X}_{s_2}; \ldots; \mathbf{X}_{s_N}] \in \mathbb{R}^{T \times N \times 88}\)
  • 其中 \(T=12\)(月数),\(N=3500\)(证券数),\(88\)

3.4 输出

3.4 输出

Agent的输出格式根据任务类型分为以下四种:

输出类型 数据形状 数学表示 输出内容 应用场景
1. 单证券收益预测 \((1,)\) \(\hat{r}_s \in \mathbb{R}\) 单个证券的预期收益率(标量) 回归任务,预测单个证券未来收益
2. 多证券收益预测 \((N,)\) \(\hat{\mathbf{r}} = [\hat{r}_{s_1}, \hat{r}_{s_2}, \ldots, \hat{r}_{s_N}]^T \in \mathbb{R}^{N}\) \(N\) 个证券的预期收益率向量 批量预测,同时预测多个证券收益
3. 单证券决策 \((3,)\)\((1,)\) \(\mathbf{a}_s \in \{0, 1, 2\}\)\(\mathbf{a}_s \in [0, 1]\) 离散动作:买入/持有/卖出,或连续动作:持仓权重 单证券交易决策,动作空间为3类或连续
4. 多证券+现金决策 \((N+1,)\) \(\mathbf{w} = [w_0, w_1, w_2, \ldots, w_N]^T \in \mathbb{R}^{N+1}\)
约束:\(\sum_{i=0}^{N} w_i = 1, w_i \geq 0\)
投资组合权重向量,\(w_0\) 为现金权重,\(w_{1:N}\) 为各证券权重 投资组合优化,包含现金配置

详细说明

  • 1. 单证券收益预测
  • 输出:\(\hat{r}_s \in \mathbb{R}\),表示证券 \(s\) 的预期收益率
  • 示例:\(\hat{r}_{000001} = 0.025\) 表示证券000001预期收益率为2.5%
  • 网络输出层:单神经元,线性激活

  • 2. 多证券收益预测

  • 输出:\(\hat{\mathbf{r}} \in \mathbb{R}^{N}\),向量形式
  • 示例:\(\hat{\mathbf{r}} = [0.025, -0.01, 0.03, \ldots]^T\) 表示各证券的预期收益
  • 网络输出层:\(N\) 个神经元,线性激活

  • 3. 单证券决策

  • 离散动作\(\mathbf{a}_s \in \{0, 1, 2\}\),其中 \(0\)=卖出,\(1\)=持有,\(2\)=买入
    • 网络输出层:3个神经元 + Softmax,采样得到动作
  • 连续动作\(\mathbf{a}_s \in [0, 1]\),表示持仓权重(0=空仓,1=满仓)

    • 网络输出层:单神经元 + Sigmoid
  • 4. 多证券+现金决策

  • 输出:\(\mathbf{w} \in \mathbb{R}^{N+1}\),投资组合权重向量
  • 约束条件: $$ \sum_{i=0}^{N} w_i = 1, \quad w_i \geq 0 \quad \forall i $$
  • 其中 \(w_0\) 表示现金权重,\(w_{1:N}\) 表示各证券权重
  • 网络输出层:\((N+1)\) 个神经元 + Softmax(自动满足权重和为1)
  • 示例:\(\mathbf{w} = [0.2, 0.3, 0.1, 0.15, 0.25, \ldots]^T\) 表示20%现金,30%证券1,10%证券2,...

3.5 奖励函数

多种奖励函数,根据任务类型和评估目标选择:

类别 奖励函数 公式 说明
预测准确率 预测误差 \(R = \hat{r} - r\) 负绝对误差,预测越准确奖励越高
方向准确率 \(R = \text{sign}(\hat{r} \cdot r)\) 预测方向正确为+1,错误为-1,关注方向而非精确值
相关系数 \(R = \text{Corr}(\hat{\mathbf{r}}, \mathbf{r})\) 预测值与真实值的相关系数,评估多证券预测整体相关性
单证券-现金组合 收益 \(R = w_s r_s + w_0 r_f\) \(w_s\)为证券权重,\(r_s\)为证券收益,\(w_0\)为现金权重,\(r_f\)为无风险利率
风险 \(R = -\sigma_p\)\(\sigma_p = w_s \cdot \sigma_s\) \(\sigma_s\)为证券波动率,风险惩罚项,波动越大奖励越低
夏普比率 \(R = \frac{R_p - r_f}{\sigma_p}\) \(R_p\)为组合收益,\(r_f\)为无风险利率,\(\sigma_p\)为组合波动率,衡量风险调整后收益
Alpha \(R = R_p - (r_f + \beta(R_m - r_f))\) \(\beta\)为Beta系数,\(R_m\)为市场收益,衡量超越基准的超额收益
加权组合 \(R = \sum_i \lambda_i R_i\) \(\sum_i \lambda_i = 1\)为权重系数,多指标加权,平衡收益与风险
多证券-现金组合 收益 \(R = \sum_{i=1}^{N} w_i r_i + w_0 r_f\) \(w_i\)为证券\(i\)权重,\(r_i\)为证券\(i\)收益,计算多证券组合总收益
风险 \(R = -\sqrt{\mathbf{w}^T \boldsymbol{\Sigma} \mathbf{w}}\) \(\boldsymbol{\Sigma}\)为协方差矩阵,\(\mathbf{w}\)为权重向量,考虑证券间相关性的组合风险
夏普比率 \(R = \frac{R_p - r_f}{\sigma_p}\) \(R_p = \sum_{i=1}^{N} w_i r_i + w_0 r_f\)\(\sigma_p = \sqrt{\mathbf{w}^T \boldsymbol{\Sigma} \mathbf{w}}\),多证券组合的风险调整收益
Alpha \(R = R_p - (r_f + \boldsymbol{\beta}^T \mathbf{w}(R_m - r_f))\) \(\boldsymbol{\beta}\)为各证券Beta向量,衡量多证券组合的超额收益
最大回撤 \(R = -\max_t \text{DD}_t\)\(\text{DD}_t = \frac{\text{Peak}_t - \text{Value}_t}{\text{Peak}_t}\) 回撤惩罚项,控制下行风险,\(\text{Peak}_t\)为历史峰值
信息比率 \(R = \frac{R_p - R_b}{\sigma_{\text{active}}}\) \(R_b\)为基准收益,\(\sigma_{\text{active}}\)为主动风险,衡量相对基准表现
加权组合 \(R = \sum_j \lambda_j R_j\) \(\sum_j \lambda_j = 1\)为权重系数,\(R_j\)为各项指标,多指标综合评估

注意
- 1.在使用加权组合作为奖励函数时,需要横向标准化(如对于证券i窗口t,分别求t窗口所有证券的收益率、风险、夏普、回撤等的均值和标准差,然后对i的各个指标进行标准化)
- 2.agent持有资产组合,收益、风险、夏普的计算基于agent持有资产组合的历史价值来计算,而非某个证券的价值

四、系统架构设计

4.1 整体架构

系统采用分布式节点架构,包含以下组件:

  • 主机(Master):负责数据管理、任务调度、结果收集
  • 训练节点(Node):运行Agent训练任务,通过Docker容器化部署
graph TB Master["中央节点<br/>读数据库<br/>数据轮询<br/>控制节点<br/>收集结果"] Node1["训练节点Node1<br/>访中央节点数据<br/>训练<br/>写回结果<br/>保存模型"] Node2["训练节点Node2"] Node3["训练节点Node3"] Master <-->|提供数据<br/>返回结果| Node1 Master <-->|提供数据<br/>返回结果| Node2 Master <-->|提供数据<br/>返回结果| Node3 style Master fill:#e1f5ff style Node1 fill:#fff4e1 style Node2 fill:#fff4e1 style Node3 fill:#fff4e1

4.2 数据流水线(重点)

数据流水线是中央系统的核心,需求是避免一次性加载过量数据到内存,符合滚动窗口的训练需求,为节点提供足够的数据:
- 1.采用事件驱动
- 2.使用redis作为中间件

具体流程如下:

graph TB MB["消息总线<br/>(MessageBus)"] DBLoader["数据库读取器<br/>读取窗口数据→DataFrame→Redis"] Updater["更新器<br/>DataFrame→ym:code数据片"] Monitor["监控器<br/>监控计数器"] DBLoader -->|DataLoaded| MB MB-->|LoadRequest| DBLoader MB -->|DataLoaded| Updater Monitor -->|LoadRequest| MB style MB fill:#e1f5ff style DBLoader fill:#fff4e1 style Updater fill:#fff4e1 style Monitor fill:#fff4e1
- 监控器负责监控redis,维护数据数据片数量(数量需略大于窗口,保证冗余,不阻塞node)
- 1.以ym:code作为数据片
- 2.node访问后,为ym:code计数器+1
- 3.当所有节点访问数据片后,将其踢出redis
- 一旦数据片数量低于阈值,发送加载数据请求给MB
- 数据读取器接受加载请求,加载数据到redis,并发布更新请求
- 更新器处理df(标准化,null处理),然后分割为数据片
- 所有接受请求和处理异步线程执行,不会阻塞系统

4.3 节点结构

4.3.1 docker初始化

节点使用docker初始化,docker初始化流程为:

flowchart TD Start([开始]) --> Base[基础镜像<br/>python:3.12-slim] Base --> SysDep[安装系统依赖<br/>apt-get工具包] SysDep --> WorkDir[工作目录<br/>/Node] WorkDir --> User[创建用户<br/>agentuser + sudo] User --> Copy[复制代码<br/>COPY . .] Copy --> Dirs[创建目录<br/>logs, data<br/>设置权限] Dirs --> Perm[设置执行权限<br/>scripts, frpc] Perm --> StartSh[复制启动脚本<br/>start.sh] StartSh --> Switch[切换用户<br/>USER agentuser] Switch --> Python[安装Python依赖<br/>pip install<br/>清华源] Python --> Env[环境变量<br/>PYTHONPATH等] Env --> Port[暴露端口<br/>8192-8220] Port --> Entry[启动入口<br/>ENTRYPOINT] Entry --> End([完成]) style Start fill:#e1f5ff style End fill:#e1f5ff style Base fill:#fff4e1 style User fill:#e8f5e9 style Python fill:#f3e5f5

4.3.2 启动流程

使用frp反向代理,容器会暴露一个端口,这个端口负责接受
- 1.中央节点的启动命令
- 2.中央节点的状态查询

flowchart TD Start([容器启动]) --> InitDocker[初始化Docker环境<br/>加载配置<br/>设置工作目录] InitDocker --> FrpConnect[连接frps服务器<br/>端口分配微服务<br/>获取可用端口] FrpConnect --> RegisterFrpc[注册frpc代理<br/>配置端口转发<br/>建立反向代理连接] RegisterFrpc --> WaitCommand[循环等待启动命令<br/>监听中央节点请求] WaitCommand --> ReceiveCmd{收到启动命令?} ReceiveCmd -->|否| WaitCommand ReceiveCmd -->|是| StartThreads[启动线程<br/>• 状态监控线程<br/>• 训练线程] StartThreads --> GetData[访问中央节点<br/>获取训练数据<br/>从Redis加载] GetData --> Training[执行训练<br/>Agent训练循环] Training --> StatusCheck{训练中} StatusCheck -->|中央节点查询| ReturnStatus[返回状态<br/>训练进度<br/>资源使用情况] StatusCheck -->|训练完成| SaveResult[保存训练结果<br/>计算指标<br/>准备结果数据] SaveResult --> PushModel[推送模型到远程仓库<br/>Git推送<br/>保存模型参数] PushModel --> WriteBack[写回结果到中央节点<br/>上传训练结果<br/>更新状态] WriteBack --> ReleasePort[释放端口<br/>注销frpc代理] ReleasePort --> CloseFrp[关闭frp连接<br/>清理资源] CloseFrp --> End([结束]) ReturnStatus --> StatusCheck style Start fill:#e1f5ff style End fill:#e1f5ff style InitDocker fill:#fff4e1 style RegisterFrpc fill:#e8f5e9 style Training fill:#f3e5f5 style PushModel fill:#ffebee


五、当前进度

5.1 已完成模块

✅ Redis连接管理

  • 文件: src/manager/redis/connection.py
  • 功能:
  • Redis连接自动管理
  • 健康检查机制(每30秒)
  • 自动重连(最大重试3次)
  • YAML配置支持
  • 连接池支持(可选)
  • 状态: 已完成并测试

✅ 消息总线

  • 文件: src/manager/service/bus.py
  • 功能:
  • 异步消息发布/订阅
  • 消息类型路由
  • 守护线程处理
  • Redis队列实现
  • 状态: 已完成并测试

✅ 数据库加载器

  • 文件: src/manager/service/database_loader.py
  • 功能:
  • 从PostgreSQL加载因子数据(88个表并行查询)
  • 从PostgreSQL加载收益率数据
  • 数据序列化存储到Redis
  • 响应初始化请求
  • 状态: 已完成,支持初始化数据加载

✅ 因子数据查询模块

  • 文件: src/manager/database/factors.py
  • 功能:
  • 并行查询多个因子表
  • 支持时间范围查询
  • Polars DataFrame处理
  • 数据合并和清洗
  • 状态: 已完成

✅ frp端口分配微服务

  • 文件docs/过程资料/说明文档/基于flask的frp端口自动分配微服务/checkapp.py.backup
  • 功能:访问端口,获取一个没被占用的frps端口
  • 状态:已经完成,启动服务

✅ 节点基础设施

  • 文件: Node/DockerFile, Node/start.sh
  • 功能:
  • Docker容器化部署
  • frp反向代理集成
  • 自动启动脚本
  • 日志管理
  • 状态: 已完成,支持一键部署

5.2 进行中模块

🔄 数据轮询机制

  • 需求: 按窗口大小(12个月)和时间步(1个月)自动加载数据
  • 进度: 数据加载器已实现,需要完善轮询逻辑
  • 待完成:
  • 实现TrainDataUpdater
  • 实现滑动窗口数据更新
  • 实现Redis数据清理机制

🔄 节点通信

  • 需求: TCP通信协议,用于发送Agent配置和接收训练结果
  • 进度: frp已配置,TCP服务器框架已搭建
  • 待完成:
  • 完善TCP通信协议
  • 实现Agent配置发送
  • 实现训练结果收集

🔄 Agent配置管理

  • 需求: 根据节点数量生成Agent配置(JSON格式)
  • 进度: 配置结构已设计
  • 待完成:
  • 实现配置生成逻辑
  • 实现配置验证
  • 实现配置分发

5.3 待完成模块

⏳ Agent训练模块

  • 需求: 基于强化学习的MLP策略网络训练
  • 技术方案:
  • 使用Stable Baselines3框架
  • MLP网络结构:输入层(88因子+持仓+现金) → 隐藏层(512→256→128) → 输出层(决策深度-10~10)
  • PPO算法训练
  • 多种奖励函数(Sharpe最大化、收益最大化、风险调整等)
  • 状态: 未开始

⏳ AED因子计算

  • 需求: 基于Agent决策差异计算AED因子
  • 方法:
  • 收集所有Agent的决策值
  • 计算决策方差或标准差
  • 生成AED因子序列
  • 状态: 未开始

⏳ 因子有效性检验

  • 需求: 检验AED因子的定价能力
  • 方法:
  • 多空组合检验(高AED vs 低AED)
  • Fama-MacBeth回归
  • CAPM Alpha检验
  • 异质性分析
  • 状态: 未开始

文档版本: v1.0
最后更新: 2025年1月8日