ashare-ai-research:把 A 股投研做成可复现、可审计的系统

ashare-ai-research 是我刚整理好并开源的新项目:github.com/dengrb1/ashare-ai-research

它做的事情很直接:在每个交易日结束后,对 A 股做一次可复现的投研流程——从候选池、确定性打分、模拟组合,到事件驱动的回测,并把这些过程全部留成可审计的快照。AI 在里面只负责解释已有的数字结果,不能改公式、不能改风控阈值、也不能动指数快照。

为什么做这件事

之前我写过 txt-2fa-vault2Fauth-Cloudflare 这些偏“安全 + 边缘”的项目。这次想试一个完全不同的方向:把 AI 加速试错这件事延伸到量化研究里。

之前我做投研笔记主要在本地,过程是:拉数据、跑公式、写评论、截图存证。几次下来发现两个明显问题:

  • 过程不可复现:同一只股票,换一天重算,结论会漂移,因为公式版本、市场环境、指数快照都不固定。
  • AI 角色模糊:直接让模型“帮我选股”很危险,但完全不用又浪费。所以这次干脆把边界画死——AI 只能解释已经算好的数字。

系统能力

仓库 README 里写了一句话总结:“Auditable, reproducible A-share post-market AI investment research, scoring, simulated portfolio, and event-driven backtesting platform.”

落到具体能力上:

  • 后市研究 + 候选池:每天盘后拉数据,过滤出当天的关注列表。
  • 确定性打分公式:当前版本 composite-35-35-20-10-dividend-news-market-v3
    • 基本面 35%
    • 技术面 35%
    • 事件 / 情绪 20%
    • 质量置信度 10%
    • 叠加分红、事件风险、冻结的市场环境调整
  • 模拟组合与事件驱动回测:每一步操作都有据可查。
  • 市场环境分类:基于沪深 300 (000300)、中证 500 (000905)、中证 1000 (000852) 的 1/5/20 日收益率,把环境分成 RISK_ON / NEUTRAL / RISK_OFF / UNKNOWN,影响打分和风险乘数。
  • AI 问答:基于已有研究报告做解释,不会越界。

一些设计取舍

1. 指数快照必须冻结

研究报告生成的那一刻,系统会冻结当天的三大指数收益率和分类(benchmark_returnsmarket_state),后续的实盘涨跌不会反过来修改这份报告。

旧的公式和没有快照的报告会被默认按 NEUTRAL 处理,兼容历史数据。

2. AI 只能解释,不能改东西

AI 这块被严格限制:

  • API Key、Organization、模型、Base URL 都在后端加密存储,不会写到前端 localStorage、日志或报告里。
  • AI 的输出仅限于“解释已有的确定性结果”,不能修改打分公式、不能调整风控阈值、不能动指数快照。
  • 后台会做模型探活、版本管理和审计。

这样做的好处是:AI 的输出再离谱,也不会让系统“算错”——它只能解释,没有算的能力。

3. 默认轻量启动

LIGHTWEIGHT 是默认模式,启动时不预热 AKShare、量化模型或非必要 worker,市场数据和搜索按需加载。想接 SearXNG 自托管搜索时,用 docker compose --profile search up 启用。

Docker 和原生(Windows / Linux)部署共用同一份 FastAPI、打分配置和 Alembic 迁移,行为一致。

技术栈

  • 后端:Python + FastAPI,打分逻辑在 src/ashare_ai/,数据库迁移走 Alembic。
  • 前端:React + Vite,工作台在 web/ 目录。
  • 打包:Docker Compose(compose.yaml / compose.ghcr.yaml),也有 Windows / Linux 原生 Control Center。
  • 文档docs/ 下有部署、API、Edge Gateway 等说明。

启动方式(Windows)

Copy-Item .env.local.example .env
Copy-Item .env.docker.example .env.docker
docker compose -p ashare-ai-src -f compose.yaml up -d --build

启动后访问 http://localhost 即可。原生部署、数据库迁移、API Key 配置等细节都写在仓库文档里。

边界声明

仓库 README 明确写了:

  • 不连接实时自动交易
  • 不构成投资建议

打分公式、回测、模拟组合都是研究工具,不是下单系统。这一条对个人项目尤其重要——不能让工具的“自动化感”模糊了“这只是研究”这层边界。

后续想做的

目前还在持续打磨,主要是这几块:

  • 继续细化打分公式的版本管理,让“换一次公式就回看一次历史快照”这件事更顺。
  • 丰富研究报告导出(PDF、Markdown 笔记)。
  • 在不破坏“AI 只解释”原则的前提下,加一些更顺手的问答模板。
  • 接入更多指数和资产类别。

欢迎在 GitHub 提 issue 或讨论公式设计、接口选择——尤其是对打分公式权重和指数快照冻结机制有想法的朋友。