金融深度学习 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

2.2 AI-Hedge-Fund

2.3 TwinMarket

2.4 HuggingFace / Transformer

2.5 FinRL

2.6 Stable Baselines3 (SB3)


三、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 数据预处理

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

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}\) 为各证券权重 投资组合优化,包含现金配置

详细说明

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 整体架构

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

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连接管理

✅ 消息总线

✅ 数据库加载器

✅ 因子数据查询模块

✅ frp端口分配微服务

✅ 节点基础设施

5.2 进行中模块

🔄 数据轮询机制

🔄 节点通信

🔄 Agent配置管理

5.3 待完成模块

⏳ Agent训练模块

⏳ AED因子计算

⏳ 因子有效性检验


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