目录

AITrade - AI量化交易系统

基于ClassRoom课程的插件化、可扩展量化交易平台。

项目状态

阶段 状态 完成时间
Phase 1: 用户认证完善 + 回测引擎完善 ✅ 已完成 2026-04-26
Phase 2: analysis分析模块 ✅ 已完成 2026-04-26
Phase 3: LangGraph工作流 + Kris风控 + RL策略 ✅ 已完成 2026-04-26
Phase 4: V3.0 深度学习预测 ✅ 已完成 2026-04-26

Phase 4 完成内容(部分)

LSTM股价预测模型 - ✅ 已完成

  • ✅ LSTMPredictor(PyTorch LSTM + 线性回归降级)
  • ✅ 数据准备与归一化
  • ✅ 训练循环(MSE Loss + Adam优化器)
  • ✅ 多步预测(自回归预测)
  • ✅ 模型保存/加载
  • ✅ 单元测试:6个测试用例全部通过

Transformer时间序列预测 - ✅ 已完成

  • ✅ TransformerPredictor(PyTorch Transformer + 移动平均降级)
  • ✅ 位置编码(Positional Encoding)
  • ✅ 多头自注意力机制
  • ✅ 训练循环(MSE Loss + Adam优化器)
  • ✅ 多步预测(自回归预测)
  • ✅ 模型保存/加载
  • ✅ 单元测试:6个测试用例全部通过

Phase 3 完成内容

LangGraph交易团队工作流 - ✅ 已完成

  • ✅ State定义(TradingState TypedDict)
  • ✅ Charles节点(投研情报官)
  • ✅ Zoe节点(信号官)
  • ✅ Kris节点(风控官)
  • ✅ Human节点(人在回路)
  • ✅ Ethan节点(交易员)
  • ✅ 图编排(StateGraph + Conditional Edge)
  • ✅ 重试/熔断机制

Phase 2 完成内容

  • ✅ 技术指标:MACD、RSI、KDJ、布林带、均线系统
  • ✅ K线形态识别:十字星、锤子线、吞没形态
  • ✅ 趋势分析:趋势判断、支撑/压力位计算
  • ✅ API接口:7个技术分析API
  • ✅ 单元测试:16个测试用例全部通过

Phase 3 完成内容(部分)

Kris风控体系(8条核心规则)- ✅ 已完成

事前风控(Pre-Trade):

  • ✅ MaxOrderAmountRule - 单笔金额上限
  • ✅ ConcentrationLimitRule - 集中度限制
  • ✅ ATRPositionRule - ATR动态仓位控制
  • ✅ EventKeywordRule - 新闻/研报风险词扫描

事中风控(Intra-Trade):

  • ✅ MaxDrawdownRule - 最大回撤
  • ✅ MaxDailyLossRule - 最大日亏损
  • ✅ MaxTradeCountRule - 交易频率限制

事后风控(Post-Trade):

  • ✅ CircuitBreakerRule - 熔断机制(连续亏损/冷却期)

  • ✅ MacroGateRule - 宏观门控(VIX/失业率/通胀率)

  • ✅ 单元测试:23个测试用例全部通过

强化学习交易策略 - ✅ 已完成

  • ✅ DQN智能体(经验回放 + epsilon-greedy)
  • ✅ RL策略(状态空间:技术指标+持仓+现金)
  • ✅ 动作空间:持有/买入/卖出
  • ✅ 奖励函数:基于投资组合价值变化
  • ✅ 模型保存/加载
  • ✅ 单元测试:12个测试用例全部通过

生产化路线(M0–M3)

在 Phase 1–4 功能骨架之上,按”先安全、再数据、再撮合、最后实盘”的顺序分四个里程碑推进生产化:

  • M0 密钥与访问收敛:开发默认凭据全面治理——JWT 签名密钥读取链(JWT_SECRET_KEY > SECRET_KEY > 仓库默认值,仍为默认值时启动打 error 日志)、compose 敏感值统一 ${VAR:-默认值} 口径、MySQL 备份/恢复脚本 scripts/backup_mysql.ps1(gzip 导出 + 保留 N 份 + 计划任务)、全业务端点 JWT 鉴权与 CORS 收敛(豁免清单见「已知限制」)。操作手册见本文「安全与备份」小节。
  • M1 数据与审计生产化(Phase9):复权管道(wp-adjust,前/后复权因子计算与 get_dailyadjust 参数契约)、行情/新闻/回测结果落库(wp-datawrite)、交易动作审计旁路(wp-audit,monitor/audit.py 落盘留痕)、日度数据校验与下载任务状态机(Redis 后端 + 孤儿任务回收)。同期接入 ENSO 气候风险管道:NOAA CPC ONI → macro_daily 表 → EnsoGateRule 风控门控与 LangGraph 工作流气候上下文,详见 doc/17-ENSO气候风险集成.md
  • M2 撮合统一:回测引擎与模拟盘/模拟券商共用同一撮合判定层 aitrade/execution/matching.py(T+1、一字涨跌停、停牌、量约束、手数取整、板块分档),回测接入事前风控,并以”同一数据、同一策略、两侧引擎”的一致性验收(scripts/consistency_check.py)锁住语义,详见 doc/18-M2撮合统一.md
  • M3 实盘装配TRADING_MODE 三档开关(dry_run 默认 / paper / live)+ 双条件安全红线(live 需 AITRADE_CONFIRM_LIVE=YES 口令,缺一降级 paper)、只读预检脚本 scripts/live_readiness_check.py、急停端点 POST /api/live/halt、每日对账(券商持仓 ↔ positions 表)与工作流人工审批;灰度上线 checklist 与回滚步骤详见 doc/19-M3实盘装配.md
  • A类遗留清零(2026-09-08):对抗审查列出的 A 类问题集中清零——positions 表有了交易写入方(execution/position_store.py 成交旁路落库:paper 档写入,dry_run 档不写(内存账户重启即重建,防漂移),live 档成交回报通道待接入);两个 WebSocket(/ws/market/api/download/ws/download)握手鉴权(查询参数 ?token=<JWT>,失败先 accept 再 close(4401) 使关闭码真实到达浏览器,前端对 4401 停止自动重连);DB 驱动交易日历(data/trading_calendar.py,调度守卫按 stock_daily 指数 bar 判历史节假日,当日/未来回退 weekday——当日 bar 收盘后才落库;增量同步已并入指数代码保证 bar 有写入方,见 doc/20 §8.1);dragon/grid 策略前视偏差修复(逐 bar 因果计算,滚动窗口);策略组合同标的双腿去重与权重真正生效;急停响应新增成功撤单计数 cancelled_count;qmt-agent 同步任务异步 job 化(POST /sync/* 立即返回 job_idGET /sync/jobs/{job_id} 轮询取结果,容器不再挂一小时长连接,见 doc/20);日线清洗成交量缺失行剔除、下载任务 Redis 断连指数退避等杂项。
  • 每日信号引擎(Phase16):全市场多因子信号扫描——aitrade/signal_engine.py 纯 DB 计算(不经 QMT,容器内可跑):近 120 根 qfq 日线的 MACD(0.35)/RSI14(0.2)/MA5×MA20(0.25)/量能(0.2) 四因子加权打分([-100,100]),叠加近 7 日新闻情绪(±20 封顶,SentimentAnalyzer 固定中文词典模式)与 ENSO 宏观门控(敏感行业 ONI≥warn 减半、≥block 剔除 buy,与 EnsoGateRule 共用 enso_* 配置);另产大盘择时三态(strong/neutral/weak,双指数 MA20/MA60 + 全市场宽度)与仓位帽(1.0/0.8/0.5)。信号落 daily_signals 表(只存 buy/sell 行,UNIQUE(trade_date,symbol),幂等覆盖),交易日 15:40 调度任务 daily_signal_scan 自动扫描 + 告警摘要(strong/weak 才推送)+ 日报 reports/signals_YYYYMMDD.md;API 挂 /api/signalPOST /signal/scan 同步全量 / GET /signal/latest / GET /signal/history),前端 /signal 页新增「每日信号扫描」页签(大盘状态横幅 + 买卖榜单 + 重新扫描)。信号仅供研究参考,不构成投资建议;详见 doc/22-每日信号引擎.md
  • 持仓 API 全家(Phase17)GET /api/monitor/positions 增强——每行附中文名(stock_info)与最新前复权收盘现算的市值/盈亏(last_close/market_value/pnl/pnl_pct,无行情或成本未知为 null,库内估值字段以 current_price/market_value_db/pnl_db 兼容保留);POST /api/monitor/positions 手工按 symbol upsert(未知代码/非正数量 422)、DELETE /api/monitor/positions/{symbol}(404 语义)、POST /api/monitor/positions/import-qmt 从 miniQMT 券商持仓导入(agent/direct 双模式,只写数量/可用、成本不动,桥不可达/未配账户/空持仓 502+中文提示);/api/signal 的 scan/latest 买/卖信号项新增 held 持仓标注、latest 顶层新增 held_symbols

项目结构

aitrade/
├── aitrade/
│   ├── __init__.py          # 包初始化
│   ├── config/              # 配置管理
│   │   ├── __init__.py
│   │   └── settings.py      # Pydantic配置
│   ├── core/                # 核心模块
│   │   ├── __init__.py
│   │   └── container.py     # 依赖注入容器
│   ├── utils/               # 工具模块
│   │   ├── __init__.py
│   │   └── logger.py        # 结构化日志
│   ├── db/                  # 数据库
│   │   ├── __init__.py
│   │   ├── session.py       # 数据库会话
│   │   └── models.py        # 数据模型
│   ├── data/                # 数据采集
│   │   ├── __init__.py
│   │   ├── base.py          # 数据源基类
│   │   ├── tushare_source.py # Tushare数据源
│   │   ├── akshare_source.py # AKShare数据源
│   │   ├── cleaner.py       # 数据清洗
│   │   └── storage.py       # 数据存储
│   ├── strategy/            # 策略引擎
│   │   ├── __init__.py
│   │   ├── base.py          # 策略基类
│   │   ├── registry.py      # 策略注册中心(@register_strategy 装饰器)
│   │   └── macd.py          # MACD策略(技术指标/趋势/网格/AI/RL等分组见各文件)
│   ├── backtest/            # 回测引擎
│   │   ├── __init__.py
│   │   └── engine.py        # 回测引擎
│   ├── risk/                # 风控引擎
│   │   ├── __init__.py
│   │   ├── base_rules.py    # 基础风控规则(回撤/仓位/日亏损/频次)
│   │   └── advanced_rules.py # 高级风控(宏观门控 MacroGateRule、ENSO气候门控 EnsoGateRule)
│   ├── execution/           # 交易执行
│   │   ├── __init__.py
│   │   ├── broker.py        # 券商抽象与模拟
│   │   └── live.py          # 实盘引擎(LiveTradingEngine)
│   ├── analysis/            # 分析模块(指标/K线形态/趋势)
│   ├── ai/                  # AI能力(LSTM/Transformer等预测器、情绪、多模态、信号、新闻采集)
│   ├── workflow/            # LangGraph交易工作流(Charles→Zoe→Kris→Human→Ethan)
│   ├── web/                 # FastAPI应用(web/api/ 下按业务域拆分子路由,websocket行情推送)
│   ├── scheduler/           # 定时任务(全量/增量数据下载、实时行情、新闻刷新、日报)
│   ├── monitor/             # 监控告警(Prometheus指标、InfluxDB时序、飞书/钉钉webhook)
│   ├── auth/                # JWT认证与用户/角色
│   └── services/            # 业务服务层(回测服务、策略服务)
├── frontend/                # React前端(Vite + Antd + Zustand)
├── alembic/                 # 数据库迁移
├── tests/                   # 测试
├── doc/                     # 文档
├── pyproject.toml           # 项目配置
├── docker-compose.yml       # Docker编排(全栈;基础设施见 docker-compose-infra.yml)
├── Dockerfile               # Docker镜像
└── .github/workflows/       # CI/CD

快速开始

1. 环境准备

# 克隆项目
git clone <repo-url>
cd aitrade

# 创建虚拟环境
python -m venv .venv
source .venv/bin/activate

# 安装依赖
pip install -e ".[dev]"

2. 配置环境变量

cp .env.example .env
# 编辑.env文件,填入实际配置

3. 启动服务(两种部署模式 QMT_MODE

direct 模式(默认,单机直跑 = 现状):基础设施进 Docker,后端留在宿主机本地跑, xtquant 直连 miniQMT(本地 IPC + userdata_mini,无法进容器):

# 基础设施(MySQL/Redis/InfluxDB)进 Docker,后端本地跑
docker-compose -f docker-compose-infra.yml up -d
# 或仅起最小集
docker-compose up -d mysql redis

# 后端(宿主机,持有 xtquant)
uvicorn aitrade.web.app:app --reload --host 0.0.0.0 --port 8000

# 前端开发服务器(端口 3000,/api 代理到 :8000)
cd frontend && npm run dev

agent 模式(方案A,业务容器化):前后端 + 数据库全进 docker-compose.yml, 宿主机只跑一个 qmt-agent 桥(aitrade/qmt_agent,默认 0.0.0.0:8001), 容器内 api 经 QMTGatewayhttp://host.docker.internal:8001 访问 QMT 能力, agent 直连 localhost:3306 写库:

# 0) .env 配置 QMT_AGENT_TOKEN(openssl rand -hex 16;缺失时 compose 直接拒绝启动)
# 1) 基础设施(等 mysql healthy)
docker-compose up -d mysql redis influxdb
# 2) 宿主机 agent(必须先于 api 启动;PowerShell,仓库根)
#    推荐用脚本(隐藏窗口后台常驻 + /health 探活 + 日志/PID 文件):
powershell -NoProfile -File scripts\start_qmt_agent.ps1
#    等价手动前台:.venv\Scripts\python.exe -m aitrade.qmt_agent --port 8001
# 3) api + 前端(compose 已注入 QMT_MODE=agent / QMT_AGENT_URL / 强制 token)
docker-compose up -d api frontend
# 验证链路(容器内打到宿主机 agent)
curl http://localhost:8001/health
docker-compose exec api python -c "from aitrade.data.qmt_gateway import get_gateway; print(get_gateway().qmt_status())"

安全默认:下单端点默认禁用(QMT_AGENT_ALLOW_ORDERS 默认 false,需容器与 agent 双侧同时开启才可用,并叠加实盘双条件,见 doc/19);agent 除 GET /health 外全部 要求 X-Agent-Token 鉴权。启动顺序、防火墙收紧、模式切换与故障排查详见 doc/20-QMT桥接与容器部署.md

4. 数据库迁移

# 初始化数据库
alembic upgrade head

核心数据表

用途 主要写入方
stock_info 股票基本信息(symbol/name/market + industry 行业列,Phase14 新增,NULL=未回填) 股票列表同步;行业列由 aitrade industry-backfill 回填(qmt 优先、东财兜底,见 doc/21
stock_daily 日线行情(不复权 raw + 前复权因子 adj_factor 日线下载/增量同步(QMT)
stock_minute 分钟线(Phase14 新增)symbol + trade_date(bar时间) + period 唯一,volume 单位手;默认保留 90 天(minute_retention_days POST /sync/minute 管道 / 调度任务 minute_sync(交易日 16:00),宇宙=指数+当前持仓或 minute_sync_symbols 固定清单
stock_delisted 退市名单(Phase14 新增):akshare 沪深退市股合并去重,月度刷新(delisted_refresh aitrade/data/delist.py::refresh_delisted_list
macro_daily 宏观月度指标(ENSO ONI 等) EnsoService(NOAA CPC,见 doc/17
positions 本地持仓镜像(paper/live 成交旁路落库) execution/position_store.py
daily_signals 每日信号(Phase16 新增)trade_date+symbol 唯一,action(buy/sell/hold) + score + factors/reasons(JSON) + 大盘状态快照 market_regime signal_engine.persist_signals(15:40 任务 daily_signal_scan / POST /api/signal/scan,见 doc/22

使用示例

数据采集

from aitrade.data import TushareSource, DataCleaner, DataStorage

# 创建数据源
source = TushareSource(token="your_tushare_token")

# 获取日线数据
df = source.get_daily("600519.SH", start_date="20230101", end_date="20231231")

# 清洗数据
cleaner = DataCleaner()
df = cleaner.clean_daily(df)

# 存储数据
storage = DataStorage()
storage.save_daily(df)

策略回测

from aitrade.data import TushareSource
from aitrade.strategy import MACDStrategy
from aitrade.backtest import BacktestEngine

# 获取数据
source = TushareSource(token="your_tushare_token")
data = source.get_daily("600519.SH", start_date="20230101", end_date="20231231")

# 创建策略
strategy = MACDStrategy(fast_period=12, slow_period=26, signal_period=9)

# 运行回测
engine = BacktestEngine(initial_cash=1000000, commission=0.0002, slippage=0.01)
result = engine.run(strategy, data)

# 查看结果
print(f"总收益率: {result.total_return:.2%}")
print(f"年化收益率: {result.annual_return:.2%}")
print(f"夏普比率: {result.sharpe_ratio:.2f}")
print(f"最大回撤: {result.max_drawdown:.2%}")
print(f"胜率: {result.win_rate:.2%}")

风控管理

from aitrade.risk.rules import RiskManager, MaxDrawdownRule, MaxPositionRule

# 创建风控管理器
manager = RiskManager()

# 添加规则
manager.add_rule(MaxDrawdownRule(threshold=0.1))
manager.add_rule(MaxPositionRule(max_ratio=0.3))

# 检查风控
context = {
    "current_drawdown": 0.05,
    "position_value": 200000,
    "total_value": 1000000,
}
reason = manager.check(context)
if reason:
    print(f"风控触发: {reason}")

开发

运行测试

pytest

代码检查

ruff check aitrade/

代码格式化

black aitrade/

已知限制

以下是当前版本的已知问题与边界,使用前请知悉(不构成投资建议):

  1. 退市股:名单已入库,历史行情需外部数据源stock_delisted 表已落地 akshare 沪深退市名单(月度刷新 delisted_refresh,见 doc/21),选股/下载可据其排除退市标的;但退市标的的历史行情(尤其本系统开始下载数据前已退市、从未入库的部分)QMT/akshare 无稳定回补渠道——量化幸存者偏差或做含退市股的全市场回测需外部采购(tushare 退市日线积分、商用数据)。stock_info 仍只增不删、存量 stock_daily 中退市股行保留(历史事实数据)。
  2. 实盘引擎为装配占位,live 档需双条件web/app.py 启动时按 TRADING_MODE 三档开关装配实盘引擎并注入 set_live_engine()(默认 dry_run/api/live/* 正常可用;仅装配异常时才 503”实盘引擎未初始化”)。装配挂的是 AssemblyPlaceholderStrategy/DataSource(无信号、无行情),POST /api/live/start 后引擎空转,绑定真实策略/数据源属后续工作。live 档必须同时满足 TRADING_MODE=live 与环境变量 AITRADE_CONFIRM_LIVE=YES(严格等于 YES),缺一即拒绝并降级 paper;急停 POST /api/live/halt,档位核对 GET /api/live/mode,完整操作手册见 doc/19-M3实盘装配.md
  3. 业务路由已全端点 JWT 鉴权(含两个 WebSocket 握手鉴权)web/api/__init__.py 对 data/strategy/backtest/ai/portfolio/analysis/monitor/live/settings/workflow/macro/download(HTTP)等业务路由组统一挂了 require_authenticated——缺失/伪造/过期 token 一律 401(/api/auth/me 自带 get_current_user,仍受保护)。有意豁免(保持匿名):/api/health*/api/auth/login|register、根 /health。两个 WebSocket /ws/market/api/download/ws/download 因浏览器 WS 无法携带 Authorization 头,改为握手阶段校验查询参数 ?token=<JWT>web/websocket.py::authenticate_websocket,与 HTTP 共用同一解码校验,失败 close(4401, unauthorized),前端 getWebSocketUrl 已自动附带 token);本地调试可用 WS_AUTH=false 关闭该握手鉴权(默认开)。另注意 JWT 签名密钥仍是仓库公开默认值时任何读过源码的人可伪造 token,生产必须在 .env 配置 SECRET_KEY(启动时检测到默认值会打 error 日志,见「安全与备份」)。
  4. 宏观门控指标缺数据源MacroGateRule 所需的 vix / unemployment_rate / inflation_rate 目前没有任何管道写入,规则实际处于”无数据即放行”的空转状态;ENSO 管道(NOAA CPC ONI → macro_daily 表)是第一条真正落地的宏观指标数据链路,后续补齐其余宏观指标时可参考其模式(详见 doc/17-ENSO气候风险集成.md)。
  5. **qmt.py / qmt_real.py 已弃用,实盘统一走 xtquant_trader**:这两份早期 miniQMT 封装是”幻觉客户端”——下单调用的是 xtquant XtTrader 上并不存在的 buy/sell kwargs 便捷 API,connect() 也只是裸构造即置已连接(qmt_real 还缺 AITRADE_CONFIRM_LIVE 实盘双条件护栏),接真实 miniQMT 必挂。现已整体弃用:保留仅为兼容既有 import(实例化会抛 DeprecationWarning 并打醒目日志),观察期后删除;实盘下单/撤单/持仓/账户查询统一使用 aitrade/execution/xtquant_trader.py(唯一真实客户端),编排与安全护栏走 live.pyLiveTradingEngine

安全与备份

默认凭据清单(开发默认值,生产必须覆盖)

两个 compose 文件(docker-compose.yml / docker-compose-infra.yml)中的敏感值均以 ${VAR:-默认值} 形式从环境变量或根目录 .env 读取,变量名与默认值两边完全一致(口径统一)。默认值与已初始化的数据卷保持一致,仅供本地开发:

服务 环境变量 默认值 说明
应用(FastAPI) SECRET_KEY / JWT_SECRET_KEY change-me-in-production(Settings 默认)/ 仓库公开常量 JWT 签名密钥:优先读 JWT_SECRET_KEY 环境变量,缺省回落 SECRET_KEY(.env 即可);仍是已知默认值时启动打 error 日志,任何读过源码的人可伪造 admin token
MySQL MYSQL_ROOT_PASSWORD aitrade123 aitrade_mysql-data 首次初始化时生效,之后以库内实际密码为准
Redis REDIS_PASSWORD aitrade123 两个 compose 均以 --requirepass 启动
InfluxDB INFLUXDB_USERNAME / INFLUXDB_PASSWORD admin / aitrade123 aitrade_influxdb-data 首次初始化时生效
InfluxDB INFLUXDB_BUCKET / INFLUXDB_ORG market_data / aitrade 两个 compose 已统一为同一变量
Grafana GRAFANA_ADMIN_PASSWORD admin grafana-data 首次初始化时生效
Langfuse DB LANGFUSE_DB_PASSWORD langfuse PostgreSQL(仅 docker-compose-infra.yml)
Langfuse LANGFUSE_NEXTAUTH_SECRET / LANGFUSE_SALT 内置固定字符串 SALT 用于加密已入库 trace,卷初始化后修改会导致历史数据无法解密

生成强密钥(生产覆盖默认值时使用):

openssl rand -base64 32    # 通用密钥(NEXTAUTH_SECRET / SALT / SECRET_KEY / JWT_SECRET_KEY)
openssl rand -hex 16       # 数据库/缓存密码

其中 SECRET_KEY(及可选的 JWT_SECRET_KEY,优先级更高)是后端 JWT 签名密钥:api/migrate 容器已做透传,写入根目录 .env 即生效;轮换后所有存量 token 立即失效(30 分钟有效期窗口,影响可忽略)。

将生成的值写入根目录 .env(参考 .env.example 的「Docker 基础设施密钥」小节),docker compose 会自动读取。

密码轮换步骤

注意:直接改 .env 里的 MYSQL_ROOT_PASSWORD 不会改变已初始化 MySQL 卷里的真实密码(该变量只在数据卷首次初始化时生效)。正确顺序是先改库内密码,再同步 .env

# 1) 先备份(见下节)
powershell -NoProfile -File scripts\backup_mysql.ps1

# 2) 修改库内 root 密码(把 <新密码> 换成实际值)
docker exec -it aitrade-mysql-1 mysql -uroot -paitrade123 \
  -e "ALTER USER 'root'@'%' IDENTIFIED BY '<新密码>'; ALTER USER 'root'@'localhost' IDENTIFIED BY '<新密码>'; FLUSH PRIVILEGES;"

# 3) 同步 .env(三项保持一致,密码含特殊字符时 DATABASE_URL 里需 URL 编码)
#    MYSQL_ROOT_PASSWORD=<新密码>
#    DATABASE_URL=mysql+pymysql://root:<新密码>@localhost:3306/aitrade

# 4) 重启使 compose 内的服务(migrate/api)拿到新值
docker compose -f docker-compose-infra.yml up -d --force-recreate migrate
# 或全栈: docker compose up -d --force-recreate migrate api

其他服务的轮换:

  • Redis:修改 .envREDIS_PASSWORD(同时更新 REDIS_URL / CELERY_BROKER_URL / CELERY_RESULT_BACKEND 中的密码),docker compose -f docker-compose-infra.yml up -d redis 即生效(密码不涉及数据卷)。
  • InfluxDB:进入 influx 容器执行 docker exec -it aitrade-influxdb-1 influx user password --name admin(同时更新 .envINFLUXDB_PASSWORD);API Token 建议在 Web UI(http://localhost:8086 → Load Data → API Tokens)生成后更新 .envINFLUXDB_TOKEN
  • LangfuseLANGFUSE_NEXTAUTH_SECRET 轮换会使已登录会话失效(可接受);LANGFUSE_SALT 轮换会导致历史加密数据无法解密,如必须轮换请先备份 aitrade_langfuse-db-data 卷并评估影响。

备份与恢复

备份(Windows,导出 gzip 到 ./backups/,默认保留最近 7 份):

# 默认: 备份 aitrade 库到 <仓库根>/backups/,保留 7 份
powershell -NoProfile -File scripts\backup_mysql.ps1

# 保留 30 份 / 指定容器与库 / 显式密码
powershell -NoProfile -File scripts\backup_mysql.ps1 -Keep 30 -Container aitrade-mysql-1 -Database aitrade

脚本要点:docker exec 在容器内执行 mysqldump | gzip,再 docker cp 拷回,避免 PowerShell 重定向损坏二进制流;密码默认读容器内 MYSQL_ROOT_PASSWORD,不落在命令行参数里;输出目录会自动生成 .gitignore 防止误提交。可注册 Windows 计划任务每日执行:

schtasks /Create /TN "AITrade-MySQL备份" /SC DAILY /ST 02:30 /TR "powershell -NoProfile -File D:\code\aitrade\scripts\backup_mysql.ps1 -Keep 30"

恢复(一条龙,<文件> 换成实际备份文件名):

# 1) 解压并灌回容器(覆盖式恢复,目标库会被重写,操作前先停应用写入)
gzip -dc backups/<文件>.sql.gz | docker exec -i aitrade-mysql-1 mysql -uroot -p"$MYSQL_ROOT_PASSWORD" aitrade

# 2) 校验
docker exec aitrade-mysql-1 mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "USE aitrade; SHOW TABLES; SELECT COUNT(*) FROM stock_daily;"

Git Bash 下 $MYSQL_ROOT_PASSWORD 可换成实际密码;PowerShell 下用 -p"密码"

文档

详细设计文档请参考 doc/ 目录。

License

MIT

关于
338.0 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号