零成交量市场 - 我的AI炒股实验

项目概述

“零成交量市场”(Zero Volume Market, ZVM)是我开发的一个基于 AI 的股票分析和模拟交易系统。这个项目尝试使用大语言模型(LLM)进行股票分析,生成投资策略,并通过虚拟盘系统验证策略效果。

项目地址:github.com/jifanchn/zero-volume-market

在线演示:

当前状态:亏损中 😅

系统架构

技术栈

后端:

  • Go 1.24+ - 高性能的静态类型语言
  • Gin - 轻量级 HTTP 框架
  • SQLite - 轻量级数据库
  • Docker - 容器化部署

前端:

  • React 18 + TypeScript
  • Vite - 快速的构建工具
  • Tailwind CSS + shadcn/ui - 现代化 UI 组件
  • pnpm - 包管理器

AI 分析:

  • 智谱 AI (GLM) - 通过 Claude Code MCP 集成

核心功能模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
zero-volume-market/
├── backend/ # Go 后端服务
│ ├── internal/
│ │ ├── analyzer/ # AI 分析器
│ │ ├── api/ # REST API
│ │ ├── service/ # 业务逻辑
│ │ ├── repository/ # 数据访问层
│ │ └── worker/ # 后台任务处理
│ └── migrations/ # 数据库迁移
├── frontend/ # React 前端
│ └── src/
│ ├── components/ # UI 组件
│ ├── pages/ # 页面
│ └── lib/ # API 客户端
├── vs/ # 虚拟盘服务(独立 Go 程序)
│ ├── main.go # 虚拟盘主程序
│ ├── calculator.go # 持仓计算逻辑
│ └── trading_cost.go # 交易成本计算
└── scripts/ # AI 分析脚本

核心功能

1. 股票管理

支持 A 股市场的股票基本信息管理,包括:

  • 股票代码、名称、交易所
  • 实时价格同步
  • PE、PS 等估值指标
  • 默认分析渠道配置

2. 多渠道 AI 分析

系统支持为每只股票配置多个分析渠道,每个渠道可以:

  • 使用不同的分析方法(如基本面分析、技术面分析、新闻分析)
  • 调用不同的 LLM 模型
  • 设置独立的参数和提示词

分析器类型

目前实现的分析器:

  1. cc_stock_analyze - 综合股票分析

    • 分析基本面、技术面、市场情绪
    • 输出目标价和买入评级
  2. cc_stock_news - 新闻分析

    • 获取最新新闻
    • 分析新闻对股票的影响
  3. cc_all_glm - 全市场分析

    • 综合多个维度的分析
    • 生成更全面的评估

3. 综合分析

当所有渠道分析完成后,系统会调用综合分析 LLM,将各渠道的分析结果整合:

  • 汇总各渠道观点
  • 生成综合投资建议(买入/持有/卖出)
  • 评估风险等级

4. 策略生成

基于所有股票的分析结果,系统可以生成投资组合配置策略:

  • 资产配置建议(各股票权重)
  • 预期收益率
  • 风险等级评估
  • 策略说明

5. 虚拟盘交易系统

这是项目的核心创新点——一个完全独立实现的虚拟盘服务。

功能特点

组合管理:

  • 初始资金设置(默认 100 万)
  • 现金和持仓管理
  • 实时总资产计算
  • 盈亏统计

交易执行:

  • 自动应用策略生成买卖指令
  • 支持部分调仓(不是全部卖出后再买入)
  • 交易记录完整保存

交易成本模拟:

系统精确模拟真实的 A 股交易成本:

1
2
3
4
5
6
7
8
9
10
// 买入成本计算
买入总花费 = 成交金额 + 佣金 + 过户费

// 卖出成本计算
卖出净收入 = 成交金额 - 印花税 - 佣金 - 过户费

费率:
- 印花税:0.05%(仅卖出)
- 佣金:0.01%(最低 5 元)
- 过户费:0.001%

A 股交易规则:

  • 最小交易单位:100 股(1 手)
  • 买入必须是 100 股的整数倍
  • 卖出可以包含零股
  • 满仓策略下的整手再分配逻辑

6. 定时任务调度

系统内置了 Cron 定时任务功能:

  • 自动同步市场数据
  • 定时触发股票分析
  • 自动更新虚拟盘价格
  • 自动应用最新策略

AI 分析流程

完整的工作流

1
2
3
4
5
6
7
8
9
10
11
12
13
graph TD
A[添加股票] --> B[同步市场数据]
B --> C[触发渠道分析]
C --> D1[渠道1分析]
C --> D2[渠道2分析]
C --> D3[渠道3分析]
D1 --> E[综合分析]
D2 --> E
D3 --> E
E --> F[生成投资策略]
F --> G[应用到虚拟盘]
G --> H[模拟交易]
H --> I[盈亏统计]

任务队列系统

所有分析任务都通过任务队列管理:

  • 防止重复分析(同一股票同一时间只能有一个分析任务)
  • 支持任务重试
  • 任务日志记录
  • 实时进度更新

LLM 提示词工程

系统精心设计了各类提示词模板:

渠道分析提示词:

1
2
3
4
5
6
7
8
9
10
11
你是一个专业的金融分析师。请分析股票 {STOCK_SYMBOL} ({STOCK_NAME})。

数据:
{MCP_DATA}

请输出 JSON 格式:
{
"targetPrice": <目标价>,
"buyRating": <0-1的评分>,
"description": "<分析描述,100字以内>"
}

综合分析提示词:

1
2
3
4
5
6
7
8
9
10
11
12
你是一个高级投资顾问。请综合以下各渠道的分析结果,
给出股票 {STOCK_SYMBOL} 的综合投资建议。

各渠道分析:
{CHANNEL_ANALYSES_JSON}

请输出 JSON 格式:
{
"summary": "<综合分析摘要,200字以内>",
"recommendation": "<操作建议: 买入/持有/卖出>",
"riskLevel": "<low/medium/high>"
}

策略生成提示词:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
你是一个组合投资策略师。请基于以下股票池的分析结果,
生成投资组合配置建议。

股票池:
{STOCK_ANALYSES_JSON}

投资风格: {RISK_PREFERENCE}

请输出 JSON 格式:
{
"summary": "<策略概述>",
"allocation": [
{"symbol": "...", "name": "...", "weight": <0-100>, "reason": "..."}
],
"riskLevel": "<low/medium/high>",
"expectedReturn": <预期年化收益率>
}

为什么会亏损?

这是最有趣的部分。让我分析一下可能的亏损原因:

1. AI 分析的局限性

市场是不可预测的:

  • LLM 基于历史数据训练,但市场在不断变化
  • 黑天鹅事件无法预测
  • 羊群效应和情绪波动难以量化

分析质量的波动:

  • 不同模型的分析质量差异大
  • 提示词微调可能导致完全不同的结论
  • 数据来源的准确性和及时性

2. 交易成本的侵蚀

虽然系统已经精确计算了交易成本,但频繁交易的累积成本不容忽视:

例子:

  • 买入 100 万股票:佣金 100 元 + 过户费 10 元 = 110 元
  • 卖出 100 万股票:印花税 5000 元 + 佣金 100 元 + 过户费 10 元 = 5110 元
  • 一轮完整交易成本:5220 元(0.522%)

如果策略频繁调仓,这些成本会快速累积。

3. 整手交易的限制

A 股的 100 股整数倍规则导致:

  • 高价股(如茅台 1800 元)一手需要 18 万
  • 100 万资金最多只能买 5 手
  • 剩余资金无法充分利用
  • 实际仓位可能低于目标配置

系统实现了”满仓整手再分配”逻辑来缓解这个问题,但无法完全解决。

4. 策略参数不当

可能的问题:

  • 风险偏好设置不合适
  • 调仓频率过高或过低
  • 选择的股票池质量不佳
  • 权重分配逻辑有缺陷

5. 市场环境因素

  • 整体市场下跌(系统性风险)
  • 行业轮动
  • 风格切换(价值↔成长)

项目亮点

1. 完整的系统设计

从数据获取、AI 分析、策略生成到虚拟盘验证,形成了一个完整的闭环。

2. 精确的成本计算

交易成本的精确模拟让虚拟盘结果更接近真实交易。

3. 灵活的架构

  • 分析器可插拔设计
  • 支持多个 LLM 提供商
  • 渠道配置灵活

4. 完善的测试

  • 单元测试覆盖核心逻辑
  • E2E 测试验证完整流程
  • 边界情况测试

5. 现代化的技术栈

  • Go 后端保证高性能
  • React + TypeScript 前端体验良好
  • Docker 容器化部署方便

未来改进方向

1. 策略优化

  • 增加止损止盈逻辑
  • 实现动态仓位管理
  • 加入市场情绪指标
  • 优化调仓触发条件

2. 风险控制

  • 最大回撤控制
  • 单股持仓上限
  • 行业分散度要求
  • 波动率目标

3. 数据增强

  • 接入更多数据源
  • 增加技术指标计算
  • 新闻情感分析
  • 机构持仓追踪

4. 回测系统

  • 历史数据回测
  • 参数优化
  • 策略对比
  • 绩效归因

5. 监控告警

  • 实时盈亏告警
  • 异常交易告警
  • 系统健康监控
  • 定期生成报告

技术难点与解决方案

1. LLM 输出的结构化

问题: LLM 输出的 JSON 格式不稳定

解决:

  • 设计严格的提示词模板
  • 实现输出解析和重试机制
  • 添加输出格式验证

2. 并发控制

问题: 多个分析任务同时运行可能导致资源耗尽

解决:

  • 实现 LLM 级别的并发控制
  • 任务队列去重机制
  • 依赖检测(综合分析等待渠道分析完成)

3. 数据一致性

问题: 虚拟盘和主系统的价格同步

解决:

  • 实现价格同步 API
  • 定时自动更新
  • 缓存机制减少调用

4. 浮点数精度

问题: 金额计算需要精确到分

解决:

  • 使用四舍五入函数
  • 统一精度处理
  • 增加单元测试验证

部署架构

Docker Compose 部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
services:
backend:
image: zero-volume-market:latest
ports:
- "8080:8080"
volumes:
- zero-volume-market-data:/app/data

vs:
image: zero-volume-market-vs:latest
ports:
- "8090:8090"
volumes:
- vs-data:/app/data
environment:
- MARKET_API_BASE=http://backend:8080

反向代理配置

使用 Nginx 反向代理:

  • s.jifan.space → 后端服务
  • vs.jifan.space → 虚拟盘服务

开源协议

MIT License

欢迎交流和建议!

总结

“零成交量市场”是一个将 AI 应用于金融投资领域的尝试。虽然目前还在亏损,但这个项目让我学到了:

  1. AI 不是万能的 - 金融市场的复杂性远超 LLM 的理解能力
  2. 系统设计的重要性 - 完整的闭环系统能够快速验证想法
  3. 交易成本的威力 - 频繁交易的成本是策略盈利的重要障碍
  4. 持续迭代的必要性 - 需要不断优化策略和系统

最重要的教训: 即使是 AI,也无法战胜市场均值回归的规律。投资仍然需要谨慎和理性。


项目地址:github.com/jifanchn/zero-volume-market

在线体验:

欢迎 Star 和 Fork!

Author

吉凡

Posted on

2026-01-25

Updated on

2026-01-25

Licensed under

Comments