
AI 股票分析系统 — 技术方案仅供交流
基于《用 ChatGPT Codex 搭建一套每天自动工作的 AI 股票分析系统》一文整理并落地。有不足之处请多多指点
定位:AI 投资研究与信息处理系统 (不是自动交易、不是涨跌预测)。
本文档与 ai-stock-system/ 代码严格对应,可直接照着部署运行。
1. 已确认决策

2. 整体架构 (6 层)

关键修正 (相对原文):原文把"多模型分工"当卖点,工程上先单模型跑通更稳更省 (四模型 = 四份成本 + 四倍失败面)。多模型扩展位保留在 ai/multi_model.py。
3. 技术选型
3.1 数据源 (双市场,统一抽象)
- 美股:yfinance(免费、无需 key;已装 1.6.0)。备选 Alpha Vantage / Polygon(需 key)。
- A 股:
- AkShare(起步首选,已装 1.18.92 且实测可取真实数据):免费开源、无需 token;接口随上游偶发变动。
- Tushare(生产备选):需 TUSHARE_TOKEN,数据更稳;启用方式见第 7 节。
- 抽象:data/base.py 定义 BaseProvider,各市场实现 fetch_history(symbol, days=250) 与 fetch_quote(symbol),上层只认统一 DataFrame。
3.2 AI 模型
- DeepSeek(deepseek-chat),OpenAI 兼容接口,中文强、便宜。
- 所有调用走 ai/llm_client.py:统一超时 (30s) / 重试 (3 次指数退避) / response_format=json_object / JSON 容错截取。不 eval、不 exec。
3.3 运行调度 (与具体调度解耦)
- 主选:automation/run_daily.yml(GitHub Actions,每日定时)。
- 备选:automation/scheduler_cron.sh(本地 cron / launchd / 任务计划)。
- 解耦点:automation 只依赖"能跑 Python + 有环境变量",不关心谁调度。
3.4 推送渠道 (可配置、可叠加)
- Gmail SMTP(report/notifier.py::send_email,587/STARTTLS)。
- 本地 HTML(report/notifier.py::save_html,输出到 reports/report_YYYY-MM-DD.html)。
- 扩展位:企微/钉钉/飞书 Webhook(尚未实现,接口已抽象)。
4. 目录结构与模块职责(实际代码)

关键接口签名
- BaseProvider.fetch_history(symbol, days=250) -> pd.DataFrame(index=datetime,columns=[open,high,low,close,volume],均 float)
- LLMClient(api_key=None, model="deepseek-chat", base_url="https://api.deepseek.com", timeout=30)
- .chat(system, user, max_tokens, temperature, retries=3) -> str
- .chat_json(system, user, **kw) -> dict(容错截取 {...})
- analyze(client, context) -> dict(调用 build_analysis_prompt 后 client.chat_json)
- weighted_score(ai_result: dict, weights: dict) -> float
- generate_html(results, config) -> str
- save_html(html, config) -> str;send_email(html, config)
5. 核心数据流 (对照 main.py::run_once)
- 加载配置:CONFIG = load_config()(config.yaml)+ load_dotenv(".env")。
- 初始化客户端:LLMClient(model, temperature, max_tokens),缺 DEEPSEEK_API_KEY 直接报错退出。
- 遍历 watchlist 每项 {symbol, market, name}:
- 选数据源 get_provider(market, provider_name):
- market=="us" → YFinanceProvider
- provider_name=="tushare" → TushareProvider
- 其余 (默认 A 股)→ AkShareProvider
- 取数 provider.fetch_history(symbol, days=250) → 标准化 OHLCV。
- 算指标 compute_all(df) → 指标 dict(含 close 最新价)。
- 构造 context {symbol, name, market, indicators(文本), latest_price}。
- AI 分析 analyze(client, context) → 结构化 JSON(见第 6 节 Schema)。
- 评分 weighted_score(ai_result, weights) → 0–100。
- 失败隔离:单只异常 catch 后打印到 stderr,不中断整体,继续下一只。
- 排序:按评分降序;若 batch.enabled,给前 top_n 只打 highlight 标记。
- 出报告:generate_html(results, cfg) → save_html() 落盘 + send_email() 推送 (邮件失败也不影响报告)。
6. 评分体系 (公式 + 映射)
AI 返回 5 个维度评级 + 风险等级,映射为分数后加权:

评分 = 系统内部评价体系,≠ 涨跌概率,≠ 投资建议。 文档与提示词均已明示。
7. 配置说明
7.1 config.yaml(可提交,不存密钥)
https://x.com/ai_goge/status/2089683136313794595?s=467.2 .env(不提交,密钥只走这里)

8. 运行与部署
8.1 环境准备 (必须用项目 venv 的 Python,否则找不到 akshare/yfinance)

8.5 定时
- GitHub Actions:automation/run_daily.yml,在仓库 Secrets 配置同名环境变量 (DEEPSEEK_API_KEY 等),工作流每日触发。
- 本地 cron:automation/scheduler_cron.sh 示例,用绝对路径指向 venv 的 python。 8.6 已验证记录
- 指标单测 9/9 通过(tests/test_indicators.py)。
- 全部模块导入 OK;HTML 报告渲染 OK(mock 数据)。
- akshare 真实取数 OK:茅台 600519 取到 2026-08-18~20 真实行情。
- akshare 1.18.92 经 pip index 确认是 PyPI 当前最新版。
完整跑通还需:填 .env 密钥 (第 8.2 节)→ python main.py。
9. 安全与密钥边界 (主线项目关注点)
- 密钥不入库:全部走 .env / 调度平台 Secrets;.env 在 .gitignore;.env.example 仅占位。
- AI 输出只解析 JSON:chat_json 用 json.loads,失败仅做 {...} 容错截取,绝不 eval/exec。
- 失败不静默:单只取数/分析失败 catch 后打印 stderr 继续;邮件失败不影响报告生成。
- 限流与超时:LLMClient 统一 30s 超时 + 3 次指数退避,防单点拖垮全任务。
- 权限最小:当前只读行情 + 发邮件,无交易、无写文件到系统目录。
10. 关键风险 / 原文的过度承诺
- 多模型 ≠ 更好:先单模型跑通,按需再加 (扩展位已留)。
- 评分 ≠ 涨跌概率:已多处明示。
- 数据源稳定性:AkShare 接口随上游偶发变动 (已留 Tushare 备援);yfinance 非官方、易因 Yahoo 改版失效 (建议后续加 Finnhub 免费备援)。
- 成本:批量 × 每日调用,需关注 token 费用;max_tokens 已限 1500。
11. 实施状态

12. 与主线项目 (Codex 式 Agent 桌面应用) 的关联
你正在做的 Electron 全栈 Agent 桌面应用(权限分级 + 插件沙盒 + 文件/网络/浏览器控制) 里,本系统可直接作为参考插件 / 能力模块:
- 数据获取 → 复用 Agent 的文件系统/网络权限沙盒;
- AI 分析 → 复用统一 LLM 调用层 (超时/重试/密钥管理);
- 定时任务 → 复用 Agent 的调度能力; 安全边界(密钥不落地、AI 输出不 eval、插件沙盒逃逸防护)——正是你最关心的点。可先在本项目把"AI + 外部数据 + 自动执行"的最小安全范式跑通,再搬进主项目。
写在最后:数据库需要根据自己的使用情况自己搭建,以下仅供参考 AkShare(A股/国内,免费,首选起步)
文档站:https://akshare.akfamily.xyz/
PyPI:https://pypi.org/project/akshare/
安装:pip install akshare
社区库,接口常随上游改版变动,正式用要留意备援
Tushare(A股,更稳但需注册拿 token + 积分)
官网:https://tushare.pro/
注册后在"个人主页 → 接口 TOKEN"拿到 key,填 config.yaml 的 tushare_token
基础行情要积够积分才能调(注册送的够日常用)
yfinance(美股,基于 Yahoo Finance)
库地址:https://pypi.org/project/yfinance/
安装:pip install yfinance