# 期货智析(futures_analysis)模块 — 功能与逻辑文档 ## 一、模块概述 期货智析模块是一个集**数据采集、技术分析、AI智能分析、复盘计划生成、交易复盘**于一体的期货分析平台。采用前后端分离架构,前端为 SPA 单页应用,后端提供 RESTful API。 --- ## 二、文件结构 ### 后端 | 文件 | 说明 | |------|------| | `app/api/futures_analysis.py` | 主 API 路由(~970行),前缀 `/api/v1/futures` | | `app/api/review_plan.py` | 复盘计划 API,前缀 `/api/v1/review` | | `app/api/trade_review.py` | 交易复盘 API,前缀 `/api/v1/trade-review` | | `app/analysis_models.py` | 数据模型定义(~325行),14 个 ORM 模型类 | | `app/analysis_db.py` | 独立数据库初始化(SQLite + MySQL 动态切换) | | `app/services/ai_analysis.py` | AI 四维联合分析服务(~513行) | | `app/services/cache.py` | 缓存服务(SQLite/Redis/MySQL 三级存储) | | `app/services/collector.py` | 数据采集服务(封装底层采集脚本) | | `app/services/plan_generator.py` | 复盘计划生成器 | | `app/services/trade_parser.py` | 结算单解析器 | | `app/config_store.py` | 统一配置存储(MySQL 优先 + JSON 文件兜底) | ### 前端 | 文件 | 说明 | |------|------| | `app/static/futures_analysis.html` | 主页面(~1232行) | | `app/static/futures_analysis.js` | 前端逻辑(~3855行) | | `app/static/futures_analysis.css` | 样式表(~3124行) | ### 数据库 | 文件 | 说明 | |------|------| | `data/futures_analysis.db` | SQLite 数据库(兜底存储) | --- ## 三、整体分析逻辑流程 ### 3.1 数据流全链路 ``` 数据采集(collector.py) → 缓存存储(cache.py) → API接口(futures_analysis.py) → 前端渲染(JS) ↓ AI分析服务(ai_analysis.py) ↓ AI结果缓存(AIAnalysisCache表) ``` ### 3.2 品种列表加载流程 1. **前端** `loadFuturesList()` 调用 `GET /api/v1/futures/list` 2. **后端** `get_futures_list()` 执行: - 从 `config_store` 加载品种配置(品种名称 → 合约代码映射) - 遍历每个品种,调用 `get_cached_data()` 从缓存获取 K 线数据 - 对每个品种计算: - 当前价格、涨跌幅 - 操作建议(`_get_suggestion`) - 多周期趋势(`_get_period_trends`) - 成功率(`_calc_success_rate`) - 趋势评分(`_calc_trend_score`) - 压力支撑位(Pivot Point 公式) 3. **前端** 渲染品种卡片网格,同时异步调用 `loadAllAIAnalysis()` 分批加载每个品种的 AI 分析结果 ### 3.3 单品种详情分析流程 1. **前端** `showDetailView(symbol)` 切换到详情视图 2. 并行执行三个请求: - `loadFuturesDetail(symbol)` → `GET /api/v1/futures/detail/{symbol}` — 详细行情和技术指标 - `loadKlineData(symbol, period)` → `GET /api/v1/futures/kline/{symbol}` — K 线数据(图表用) - `loadHistoryListForAnalysis(symbol)` → `GET /api/v1/futures/ai-analysis/{symbol}/history` — AI 分析历史 3. **后端** `get_futures_detail()` 计算完整技术指标: - **MACD**(`_calc_macd`):EMA12/EMA26 → DIF/DEA → 金叉/死叉信号 - **RSI**(`_calc_rsi`):14 周期 RSI → 超买/超卖/正常判断 - **布林带**(`_calc_boll`):20 周期 MA ± 2 倍标准差 → 上轨/中轨/下轨信号 - **KDJ**(`_calc_kdj`):9 周期 RSV → K/D 值 → 偏多/偏空/中性 - **Pivot Point**:PP = (H+L+C)/3,R1/R2/S1/S2 标准公式 4. **前端** 使用 ECharts 渲染 K 线图(含 MA5/MA10/MA20 均线、成交量柱、MACD 子图) ### 3.4 AI 智能分析流程(核心) 1. **前端** `runAIAnalysis()` 调用 `POST /api/v1/futures/ai-analysis/{symbol}` 2. **后端** `AIFuturesAnalyzer.analyze()` 执行完整流程: ``` 步骤1: get_active_model() └─ 从配置中获取当前激活的 AI 模型(支持 OpenAI 兼容接口) 步骤2: prepare_multi_period_data() └─ 准备 5 个周期(5min/15min/30min/60min/daily)的 K 线数据 └─ 每个周期计算技术指标(MA10/MA20/MACD/KDJ/量比等) 步骤3: AIAnalysisPrompt.build_prompt() └─ 构建"四维联合判断分析法(4D-XV)"提示词 └─ 系统角色:20年经验的资深金融分析师 └─ 要求输出 JSON 格式的四维分析结果 步骤4: call_ai_model() └─ 通过 HTTP POST 调用 AI 模型(OpenAI 兼容格式,180秒超时) 步骤5: parse_ai_response() └─ 正则提取 JSON 响应 步骤6: save_analysis_cache() └─ 保存结果到 AIAnalysisCache 表,附带 K 线时间戳 ``` 3. **智能缓存策略**(`should_reanalyze`): - 分析超过 15 分钟 → 重新分析 - K 线数据时间戳比分析时间新 → 重新分析 - 否则返回缓存结果 4. **前端** `displayAIAnalysisResult()` 渲染分析结果,并通过 `syncAIToPanels()` 同步数据到各个面板 ### 3.5 AI 分析输出结构(4D-XV 四维联合分析) AI 分析返回的 JSON 包含以下字段: | 字段 | 说明 | |------|------| | `summary` | 分析摘要 | | `four_dimensional` | 四维分析(MACD趋势、成交量资金、KDJ时机、多周期方向) | | `kdj_diagnosis` | KDJ 诊断详情 | | `pivot_points` | 压力支撑位 | | `red_lines_check` | 红线审查(不可违反的交易纪律) | | `discipline_score` | 纪律评分 | | `trading_suggestion` | 交易建议(方向、置信度、入场区间、止损、仓位) | | `scenario_plans` | 情景预案(突破/震荡/反转/消息影响) | | `risk_warnings` | 风险提示 | | `experience_lessons` | 经验教训 | --- ## 四、全部功能清单 ### 4.1 品种分析(主页面) | 功能 | 描述 | |------|------| | 品种列表展示 | 卡片网格展示所有期货品种,含价格、涨跌、建议、成功率、趋势评分、压力支撑位 | | 分类筛选 | 全部 / 能源 / 金属 / 农产品 / 金融 四大分类 | | 搜索 | 按品种名称或合约代码搜索 | | 趋势筛选 | 点击统计卡片按上涨 / 下跌 / 震荡筛选 | | 数据刷新 | 单个品种刷新或全部刷新(异步后台执行,进度轮询) | | 自选品种 | 添加/取消自选,独立自选页面 | | AI 批量分析 | 一键对所有合约进行 AI 分析(分批 3 个并发,2 秒间隔) | ### 4.2 详情分析页 | 功能 | 描述 | |------|------| | 行情概览 | 品种名称、合约代码、当前价、涨跌、开/高/低/量 | | K 线图表 | ECharts 渲染,支持 5M/15M/30M/1H 四个周期切换,含 MA 均线、成交量、MACD 子图 | | 技术指标面板 | MACD(金叉/死叉)、RSI(超买/超卖)、布林带、KDJ | | 关键点位 | Pivot Point 计算的压力位(R1/R2)、支撑位(S1/S2)、中枢(PP) | | 多周期趋势 | 5/15/30/60 分钟四个周期的趋势方向 | | AI 思维分析 | 四维联合分析结果展示(摘要、方向、置信度、入场区间、止损、仓位) | | AI 分析详情弹窗 | 完整的 4D-XV 信号表、红线审查、纪律评分、情景预案、经验教训 | | 历史分析记录 | 展示该品种的历史 AI 分析记录列表,可点击查看完整报告 | | 情景预案 | 突破/震荡/反转/消息影响四种情景的概率和应对策略 | ### 4.3 复盘计划(V2) | 功能 | 描述 | |------|------| | 生成复盘报告 | 选择日期,调用 `POST /api/v1/review/generate` 自动生成 | | 核心结论 | Hero 区域展示日期、核心结论、数据基准 | | 三档分类 | 绿色(交易机会)/ 黄色(重点关注)/ 红色(规避) | | 交易机会卡片 | 含方向、入场区间、止损、目标位、触发条件、四维评分条 | | 全品种排名表 | 支持按综合评分/活跃度/量比/方向排序 | | 品种详情弹窗 | 评分明细、多周期趋势、枢轴点位、交易计划 | | 板块热度 | 各板块均分、趋势、龙头品种 | | 风险提示 | 全局风险提示横幅 | ### 4.4 交易复盘 | 功能 | 描述 | |------|------| | 结算单导入 | 支持单个/批量导入 .xls/.xlsx 期货结算单 | | 去重校验 | 按交易日+品种+时间+价格逐条去重 | | 6 维统计卡片 | 总盈亏、净盈亏、胜率/盈亏比、交易笔数、最大回撤、日均盈亏 | | 账户权益曲线 | ECharts 折线+柱状图(累计净盈亏 + 每日盈亏) | | 品种盈亏气泡图 | 气泡大小=手续费占比,颜色=净盈亏 | | 每日交易详情表 | 点击日期查看详情弹窗(含 AI 诊断报告、品种盈亏统计、交易流水) | | 品种盈亏排行表 | 含盈亏比异步计算 | | 品种详情弹窗 | K 线走势(多周期切换)+ 该品种交易记录 | | 交易详情弹窗 | 单笔交易详情 + K 线买卖点标注 + AI 交易分析 | | 批次管理 | 查看/删除导入批次 | | 按日期删除 | 删除指定日期的所有交易记录 | --- ## 五、数据模型(14 个 ORM 类) | 模型类 | 表名 | 用途 | |--------|------|------| | `FuturesAnalysis` | `futures_analysis` | 期货分析报告(建议、指标、评分、点位) | | `WatchedSymbol` | `watched_symbols` | 用户关注品种 | | `AIModelConfig` | `ai_model_configs` | AI 模型配置(提供商、密钥、参数) | | `AnalysisSettings` | `analysis_settings` | 分析设置(单例 JSON 配置) | | `AIAnalysisCache` | `ai_analysis_cache` | AI 分析结果缓存(含 K 线时间戳用于智能刷新) | | `ReviewDate` | `review_dates` | 复盘日期(V1) | | `SymbolRanking` | `symbol_rankings` | 品种排名(V1) | | `TradingPlan` | `trading_plans` | 交易计划(V1) | | `SymbolScoreV2` | `symbol_scores_v2` | V2 品种多维度评分(5维度+综合+关键点位+方向标签) | | `TradingPlanV2` | `trading_plans_v2` | V2 交易计划(入场/止损/目标/触发条件) | | `SectorHeat` | `sector_heat` | 板块热度(均分/趋势/龙头/成员) | | `ReviewPlanV2` | `review_plans_v2` | V2 复盘计划总表(元数据+统计) | | `TradeRecord` | `trade_records` | 交易记录(从结算单导入的逐笔明细) | | `TradeImportBatch` | `trade_import_batches` | 导入批次元信息 | --- ## 六、组件连接关系 ``` +-------------------+ | 前端 SPA 页面 | | futures_analysis | | .html / .js / .css| +---------+---------+ | +-------------------+-------------------+ | | | /api/v1/futures/* /api/v1/review/* /api/v1/trade-review/* | | | +---------+--------+ +------+-------+ +--------+--------+ |futures_analysis.py| |review_plan.py| | trade_review.py | +----+------+------+ +------+-------+ +--------+--------+ | | | | | +-------+--------+----------+--------+ | | | +----+----+ +------+-------+ +--------+--------+ |cache.py | |plan_generator| | trade_parser | +----+----+ +--------------+ +-----------------+ | +----+----+ +------------------+ |collector| --> | futures_data_ | | .py | | collector(脚本) | +---------+ +------------------+ | +----+----+ +------------------+ | storage | --> | Redis / MySQL / | | Manager | | SQLite(兜底) | +---------+ +------------------+ | +----+----+ |config | --> symbols_config.json / ai_config.json / MySQL AppConfig |_store | +---------+ | +----+-----------+ |ai_analysis.py | --> 外部 AI 模型 API (OpenAI 兼容) |(AIFuturesAnalyzer) +----------------+ ``` --- ## 七、存储架构 采用**三级降级策略**: 1. **MySQL 优先** — 生产环境主存储 2. **Redis / StorageManager** — 缓存层加速 3. **SQLite 兜底** — 开发/单机环境自动降级 `analysis_db.py` 中的 `get_analysis_db()` 动态检测 MySQL 可用性,透明切换后端,业务代码无需感知底层存储变化。 --- ## 八、路由注册 在 `app/main.py` 中注册三个路由: ```python # 第 179-182 行 app.include_router(futures_analysis.router) # /api/v1/futures app.include_router(review_plan.router) # /api/v1/review app.include_router(trade_review.router) # /api/v1/trade-review ``` 页面入口:`GET /futures-analysis` --- ## 九、技术指标计算说明 ### MACD(Moving Average Convergence Divergence) - EMA12 = 前一日EMA12 × (1 - 2/13) + 今日收盘价 × 2/13 - EMA26 = 前一日EMA26 × (1 - 2/27) + 今日收盘价 × 2/27 - DIF = EMA12 - EMA26 - DEA = 前一日DEA × (1 - 2/10) + 今日DIF × 2/10 - 信号:DIF > DEA → 金叉(看多);DIF < DEA → 死叉(看空) ### RSI(Relative Strength Index) - 14 周期 RSI = 100 - 100 / (1 + RS),RS = 平均上涨幅度 / 平均下跌幅度 - 信号:RSI > 70 → 超买;RSI < 30 → 超卖;30 ≤ RSI ≤ 70 → 正常 ### 布林带(Bollinger Bands) - 中轨 = 20 周期 MA - 上轨 = 中轨 + 2 × 标准差 - 下轨 = 中轨 - 2 × 标准差 - 信号:价格触及上轨 → 压力;价格触及下轨 → 支撑 ### KDJ(随机指标) - RSV = (收盘价 - 9日最低价) / (9日最高价 - 9日最低价) × 100 - K = 2/3 × 前一日K + 1/3 × RSV - D = 2/3 × 前一日D + 1/3 × K - 信号:K > D → 偏多;K < D → 偏空 ### Pivot Point(枢轴点) - PP = (最高价 + 最低价 + 收盘价) / 3 - R1 = 2 × PP - 最低价 - R2 = PP + (最高价 - 最低价) - S1 = 2 × PP - 最高价 - S2 = PP - (最高价 - 最低价)