# PythonProject1 **Repository Path**: kkllll/python-project1 ## Basic Information - **Project Name**: PythonProject1 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-11 - **Last Updated**: 2026-05-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PythonProject1 · A 股收盘智能复盘系统 > **命令行驱动的「数据 + 规则 + 大模型」流水线**:在交易日收盘后,自动聚合行情与题材数据,按「次日竞价半路」框架生成结构化复盘;程序负责**可验证的量化与目录**,语言模型负责**可读的长文叙述**,二者口径由同一套配置与模板锁定。 --- ## 声明与边界 - **用途**:个人研究、记录与方法论演练;**不构成**投资建议,亦不构成任何证券买卖建议。 - **数据**:行情与板块等数据经 **akshare** 等渠道拉取;作者不对第三方源的完整性、实时性与准确性作担保,结论须自行交叉验证。 - **形态**:本仓库**不提供 Web 前端**。根目录 `run.py` 仅保留「前端已移除」的提示并以退出码 `2` 结束,请勿当作服务入口。 - **事实来源**:行为细节以**主分支源码**与 `tests/` 为准;模块契约与排错请阅 **`ARCHITECTURE.md`**,分层演进愿景见 **`docs/six_layer_architecture.md`**。 --- ## 这套系统解决什么问题 短线复盘常见困境,是「数据散、口径乱、文字飘」:东一块西一块的涨停列表,与第二天交易计划之间缺少可复核的桥梁。本仓库将**单日复盘**固化为可重复执行的程序管线:先由 `DataFetcher` 等模块在统一缓存与重试策略下拉取日历、涨跌停池、板块与要闻等;再由 `auction_halfway_strategy` 产出**主线与龙头观察池(`top_pool`)**;随后把程序块、JSON 快照与固定章节 Prompt 一并交给 **DeepSeek**(OpenAI 兼容 `chat/completions`)生成 Markdown 长文;最后经摘要校验、缺章补全、要闻前缀与文末温习区定稿,并可经 **SMTP** 投递邮箱。 **设计上一句化**:程序算清量,模型写得像——KPI、表格与 Prompt、邮件展示**同一套数**,避免「正文与篇首目录各说各话」。 --- ## 目录 1. [环境要求与快速开始](#环境要求与快速开始) 2. [仓库地图](#仓库地图) 3. [业务全景:日度与周度](#业务全景日度与周度)([日度主路径图](#日度主路径示意图)) 4. [日度复盘流水线(编排与步骤)](#日度复盘流水线编排与步骤) 5. [术语与核心对象](#术语与核心对象) 6. [技术栈与依赖](#技术栈与依赖) 7. [数据获取、策略与 KPI](#数据获取策略与-kpi) 8. [大模型客户端](#大模型客户端) 9. [复盘增强包与 LLM 智能层(现状说明)](#复盘增强包与-llm-智能层现状说明) 10. [邮件与 HTML 模板](#邮件与-html-模板) 11. [文末温习与辅助脚本](#文末温习与辅助脚本) 12. [持久化路径](#持久化路径) 13. [周度闭环与策略偏好](#周度闭环与策略偏好) 14. [配置:合并顺序与顶层键](#配置合并顺序与顶层键) 15. [环境变量](#环境变量) 16. [脚本索引](#脚本索引) 17. [测试、CI 与 GitHub Actions](#测试ci-与-github-actions) 18. [部署与运维注意](#部署与运维注意) 19. [延伸阅读](#延伸阅读) 20. [维护约定](#维护约定) --- ## 环境要求与快速开始 **Python**:**3.10+**(持续集成使用 3.11)。 ```bash pip install -r requirements.txt ``` **最小可运行复盘**(需配置 `DEEPSEEK_API_KEY`,或在项目根 `replay_config.json` 中提供等价密钥): ```bash python scripts/nightly_replay.py python scripts/nightly_replay.py --date 20260328 ``` 若未指定 `--date` 且当日**非交易日**,`nightly_replay.py` 会**跳过**复盘并以退出码 `0` 结束,适合挂接 cron 或 GitHub Actions 定时任务。 **配置文件**:默认读取项目根目录 **`replay_config.json`**(可选)。可通过环境变量 **`REPLAY_CONFIG_FILE`** 指向其他路径。合并规则见下文 [配置:合并顺序与顶层键](#配置合并顺序与顶层键)。 **健康检查**: ```bash python scripts/validate.py python scripts/health_check.py ``` --- ## 仓库地图 下表按**职责**划分,便于新人从入口摸到领域与基础设施。 | 路径 | 职责 | |------|------| | `app/services/` | 核心业务:**数据拉取**(`data_fetcher`)、**复盘任务**(`replay_task`)、**半路策略**(`auction_halfway_strategy`)、篇首目录(`replay_catalog`)、报告补全(`report_builder`)、KPI、情绪、仓位、连板统计、邮件通知、LLM 客户端、周报与策略偏好等 | | `app/adapters/` | 外系统适配:如 `email_smtp_adapter`、`llm_deepseek_adapter`、`market_summary_adapter` | | `app/application/` | 用例与规则:`replay_text_rules`;**`llm_intel/`**(审计与结构化决策流水线) | | `app/domain/` | `models`、`ports`(如 `LLMCompletionPort`、`EmailDeliveryPort`) | | `app/orchestration/` | `replay_pipeline.py`:阶段名 `REPLAY_PIPELINE_PHASES` 与 `ReplayTask.run` 对齐 | | `app/output/` | 输出侧组装,如 `replay_email_subject`(邮件主题) | | `app/infrastructure/` | `config_defaults`、`unified_config`、`validation`、**`resilience/`**(熔断、`safe_execute`)、**`observability/`**(日志、事件、告警) | | `app/utils/` | `config`、`logger`、`email_template`、`disk_cache`、`replay_viewpoint_footer`、`output_formatter` 等 | | `config/` | `replay_prompt_templates.py`、`data_source_config.py`、`strategy_preference_config.py` 等 | | `scripts/` | 可执行入口与辅助脚本 | | `tests/` | `pytest` 用例 | | `.github/workflows/` | `ci.yml`、`scheduled-nightly.yml`、`weekly-report.yml`、`weekly-theory-review.yml`、`deploy.yml` | | `docs/` | 如 `smtp_env.md`、`six_layer_architecture.md` | --- ## 业务全景:日度与周度 **日度主线**(概念顺序):拉取市场摘要 → 可选断点续跑 → 分离确认、要闻映射 → 可选风格稳定性探测 → 拼装 Prompt 并调用大模型 → 摘要与固定章节规则 → 可选五/七节补全 → 要闻前缀 → 文末温习 → 龙头池与风格指数持久化 → 可选 SMTP。 **周度主线**:`weekly_performance_email.py` 生成周报 Markdown → 可选 LLM 附录 → `update_from_recent_returns` 等反馈 → 权重异常告警(可配)→ 周报邮件。 **衔接关系**:日度产生的 **watchlist** 记录供周报统计;周末 **五桶权重** 经 `build_prompt_addon` 回注日度 Prompt,形成闭环。 ### 日度主路径示意图 下图概括从数据摘要到成稿投递的主干顺序,与 **`ReplayTask.run`**(`app/services/replay_task.py`)一致;带「可选」的分支依赖配置开关或断点是否命中。GitHub / Gitee 预览原生支持 Mermaid。 ```mermaid flowchart TD Start([日度入口 nightly_replay]) --> Branch{断点续跑 resume?} Branch -->|是| Skip[恢复 fetcher 缓存
跳过 get_market_summary] Branch -->|否| GMS[get_market_summary
DataFetcher · 半路策略 top_pool] Skip --> SC[分离确认 · 要闻映射] GMS --> SC SC --> Style{风格稳定性探测
enable_style_stability_probe} Style -->|开启| Probe[probe_style_stability] Style -->|关闭| BP[build_prompt
addon · dragon JSON · MAIN_REPLAY_PROMPT] Probe --> BP BP --> LLM[call_llm · DeepSeek] LLM --> Rules[ensure_summary · 龙头章节
五/七节补全] Rules --> Prefix[要闻前缀] Prefix --> Footer[文末温习 append_replay_viewpoint_footer] Footer --> Persist[watchlist · 风格指数持久化] Persist --> Mail{SMTP 已配置?} Mail -->|是| Send[send_report_email] Mail -->|否| End([结束]) Send --> End ``` 可选生成**静态 PNG**业务示意图(邮件正文不依赖该图): ```bash python scripts/generate_readme_business_overview_chart.py ``` 输出示例路径:`assets/readme_business_overview.png`。 --- ## 日度复盘流水线(编排与步骤) 编排阶段定义见 **`app/orchestration/replay_pipeline.py`**(`REPLAY_PIPELINE_PHASES`),与 **`ReplayTask.run`**(`app/services/replay_task.py`)主路径一致。下表按**执行顺序**列出关键行为,便于对照日志与断点文件。 | 顺序 | 行为 | |------|------| | 1 | 若开启断点且 **`resume_replay_if_available`**:尝试恢复,**跳过** `get_market_summary` | | 2 | 否则执行 **`data_fetcher.get_market_summary(date)`**,得到 `market_data` 与 `actual_date` | | 3 | 断点开启时保存 **`save_fetcher_bundle`** → `data/replay_status/{date}_market.txt`、`_meta.json` | | 4 | **分离确认**:必要时补拉涨停池,**`perform_separation_confirmation`** | | 5 | **要闻映射**:**`analyze_finance_news`**(携带 `top_pool`) | | 6 | **风格稳定性探测**(`enable_style_stability_probe`,默认关闭):**`probe_style_stability`** → **`effective_weights_from_stability`**;可按 **`replay_llm_spacing_sec`** 间隔后再调主文 | | 7 | **`build_prompt`**:含 `build_prompt_addon`、dragon JSON、分离块、要闻块、**`MAIN_REPLAY_PROMPT`** | | 8 | **`call_llm`** → **`ensure_summary_line`** → **`append_core_stocks_and_plan_if_missing`** → **`ensure_dragon_report_sections`** | | 9 | 截断并前置 **`_last_news_push_prefix`**(财联社要闻摘要,可空) | | 10 | **`append_replay_viewpoint_footer`**(表格式五人理论 + 附录) | | 11 | **`save_signal_report`**:当日复盘正文(**不含**顶部实盘块)写入 `simulated_account.json`,供按信号日检索预案 | | 12 | **`evaluate_exits_after_close`**:按当日 K 线与预案关键词登记「下一交易日开盘卖出」 | | 13 | **`prepend_simulation_to_report_body`**:生成配图与收益汇总,将 **【实盘交易展示】** 置于 **`self.result` 最顶** | | 14 | 若 **`program_completed`** 且存在 **top_pool**:**`append_daily_top_pool`**、**`schedule_next_buys`** | | 15 | 若 **`enable_daily_style_indices_persist`**:**`persist_daily_indices`** | | 16 | **`send_report_email`**(若已配置 SMTP) | 另:在 **`get_market_summary`** 之后、分离确认之前,**`process_session_opens`** 会按交易日历对**已登记**的买卖在**当日开盘价**撮合(与 `replay_task` 源码顺序一致)。 **依赖注入**:**`ReplayTask`** 可传入 **`llm_port`**、**`email_port`**(见 `app/domain/ports.py`),便于单测或替换实现。 ### 复盘报告定稿章节顺序(Markdown 从上到下) 与 **`ReplayTask.run`** 最终写入 **`self.result`** 的拼接顺序一致(节选标题以配置 **`dragon_report_headings`** 为准,见 `app/infrastructure/config_defaults.py`): | 顺序 | 内容 | |------|------| | 1 | **【实盘交易展示】**:配图(若生成)、今日收益 / 实盘至今收益 / 实盘至今收益率、说明与现金/成本口径摘要;无图时仍为表格版展示 | | 2 | **财经要闻前缀**(`_last_news_push_prefix`,若有) | | 3 | **大模型正文**:规范首行 **【摘要】…**;其后为「主线中军趋势交易体系」5 大模块,默认依次为 **大盘与主线环境评估 → 中军标的池筛选 → 逐个标的状态扫描 → 明日具体交易计划 → 持仓标的应对预案**(并在末尾输出一行复盘总结) | | 4 | **每日必看 吾日三省吾身**:文末温习,子块顺序同 **`FOOTER_SECTION_ORDER`**(`replay_viewpoint_footer.py`):炒股养家 → 退学炒股 → Asking → 92科比 → 涅槃重升,再接底部附录文案 | 邮件/网页预览时即为上述从上到下的阅读顺序。 --- ## 术语与核心对象 | 术语 | 说明 | |------|------| | **龙头池 / top_pool** | `auction_halfway_strategy` 按规则输出的程序观察列表,**非**投资建议 | | **信号日** | 复盘成功且 `program_completed` 时写入 `watchlist_records.json` 的交易日 | | **五桶权重** | 打板、低吸、趋势、龙头、其他;存于 `strategy_preference.json`,经 `build_prompt_addon` 注入主 Prompt | | **自然周** | 周报以 ISO 周与锚点交易日组织(`weekly_performance.py`) | | **市场阶段** | `compute_short_term_market_phase` 四象限文案;须与正文摘要及相应章节对齐 | | **建议仓位(程序)** | `position_sizer.calc_position` 给出的区间描述,非固定百分比指令 | | **情绪量化评分** | `sentiment_scorer.calculate_sentiment_score`(0~10),辅助刻度 | | **大面** | 昨日涨停、今日跌幅**低于 -5%**或计入跌停池的家数;与 KPI 及正文口径一致 | --- ## 技术栈与依赖 | 类别 | 说明 | |------|------| | 语言 | Python 3.10+(CI 使用 3.11) | | 数据 | **pandas**、**akshare**;`get_market_summary` 可在 **`market_summary_parallel_fetch`** 为真时以 **ThreadPoolExecutor** 并行拉取 | | 缓存 | `disk_cache`(默认 `data/api_cache/`)、`price_cache`;可选启动时按 mtime 清扫(`disk_cache_sweep_ttl_sec`) | | 大模型 | **requests**;**tenacity** 传输重试;HTTP **429** 在业务层指数退避 | | 邮件 | SMTP;**markdown** + **Jinja2**(`email_template`) | | 配置 | `app/infrastructure/config_defaults.py` 中的 **`DEFAULT_CONFIG`** → **`app/infrastructure/unified_config.py`** 与 **`app/utils/config.py`** | | 质量 | **pytest**、`scripts/validate.py`;CI 额外 **ruff** 对部分路径静态检查 | **`requirements.txt` 主要包**:`akshare`、`pandas`、`requests`、`markdown`、`pygments`、`jinja2`、`beautifulsoup4`、`pytest`、`matplotlib`、`tenacity`(以文件为准)。 --- ## 数据获取、策略与 KPI - **`DataFetcher`**(`app/services/data_fetcher.py`) 封装交易日历、指数与个股快照、涨跌停池、板块与资金流、财联社要闻(经 `news_fetcher`)、龙虎榜、概念/行业资金等。 **`get_market_summary`** 串联篇首目录、溢价、大面、晋级率、情绪推演、龙头快照、半路选股块等,形成注入主 Prompt 的 **`market_data`**。 涨停池等接口对东财字段有**修复与归一**(含 `lb` 连板数),并对磁盘/内存中旧格式缓存做列名兼容,避免「连板梯队」等块因缺列而整表归零。 - **`auction_halfway_strategy`** 产出主线与 **`top_pool`**;与 `meta.program_completed`、`abort_reason` 等字段配合,用于判断是否写入 watchlist、是否追加章节等。 - **`sentiment_scorer`**、**`technical_indicators`**、**`trend_momentum_strategy`** 情绪打分与技术面/动量;具体调用链以源码为准。 - **`config/data_source_config.py`** AK 重试、磁盘缓存 TTL、DataFrame 列约定;环境变量覆盖见该文件及 **`ENV_FLAT_BINDINGS`**。 - **`data_source_errors`** 数据源异常类型(熔断、耗尽等),便于上层统一处理。 - **并行** `market_summary_parallel_fetch` 为真时多路基础拉取并行;**`fetch_parallel_max_workers`** 在代码中有上下限钳制,避免过载。 **能力速查(按主题找模块)** | 能力 | 模块 | |------|------| | 昨日涨停溢价分档 | `market_kpi.premium_analysis` | | 大面 / 亏钱效应 | `DataFetcher.compute_big_face_count`、`market_kpi.big_loss_metrics` | | 要闻过滤 | `news_fetcher` 相关性打分、`filter_news` | | 连板梯队文本条 | `output_formatter.draw_text_bar` | | 建议仓位 | `position_sizer.calc_position` | | 明日情绪推演 | `cycle_analyzer.sentiment_forecast` | | 连板晋级率表 | `ladder_stats.compute_promotion_rates_md` | | 五/七节补全 | `report_builder.append_core_stocks_and_plan_if_missing` | | 主 Prompt | `config/replay_prompt_templates.py`;别名 re-export:`llm_section_generator` | | 篇首目录 | `replay_catalog` | | 分离确认 / 要闻映射 | `separation_confirmation`、`news_mapper` | | 策略权重附加 | `strategy_preference.build_prompt_addon` 等 | --- ## 大模型客户端 - **实现**:`app/services/llm_client.py` 中的 **`ChatCompletionClient`**。 默认 URL 来自 **`llm_default_url`**,或环境变量 **`DEEPSEEK_API_URL`** 的映射逻辑。 - **超时**:**`get_llm_client`** 使用 **`data_source.llm_connect_timeout`** / **`llm_read_timeout`**(连接与读响应拆分)。 环境变量 **`LLM_TIMEOUT_SEC`** 写入顶层 **`llm_transport_timeout_sec`**;**`ChatCompletionClient`** 是否读取该字段,**以当前源码为准**(README 不替代代码)。 - **重试**:**`llm_retry_attempts`**(`LLM_RETRY_ATTEMPTS`)。 - **429**:**`llm_retry_429`**、**`llm_retry_429_wait_sec`**、**`llm_retry_429_wait_max_sec`**;指数退避并尊重 **`Retry-After`**。 - **模型名**:**`llm_model_name`** / **`deepseek_model_name`**,缺省 **`deepseek-chat`**。 - **请求间隔**:**`resilience.llm_min_interval_sec`**(大于 0 时在 `llm_client` 侧节流)。 - **`get_llm_client(api_key)`**:参数优先,否则从配置读取 **`deepseek_api_key`** / **`llm_api_key`**。 --- ## 复盘增强包与 LLM 智能层(现状说明) 以下组件**在代码库中存在且可测**,但与**默认日度主路径**的接法不同,请避免混淆。 | 组件 | 路径 | 与主流程关系 | |------|------|----------------| | **复盘增强四段** | `app/services/replay_llm_enhancements.py`(如 **`run_replay_enhancement_bundle`**) | **`ReplayTask` 日度主路径默认不调用**。周报等场景仍可能使用其中部分函数;配置项 **`enable_replay_llm_*`** 等保留给实验脚本或未来接回。 | | **LLM 智能层** | `app/application/llm_intel/`(**`run_replay_intel_layer`**、确定性审计、结构化决策 LLM、**`render_intel_block`**) | 默认配置中 **`llm_intel.enabled`** 可为真,但 **`ReplayTask` 未接入**;可通过测试或自研脚本调用。见 **`tests/test_llm_intel.py`**。 | --- ## 邮件与 HTML 模板 - **`email_notify`**:**`resolve_email_config`**、**`send_report_email`**、**`send_simple_email`**(环境变量优先于文件配置)。 - **`email_template`**:Markdown 转 HTML、KPI 卡片、要闻截断、周报内嵌图、连板梯队历史表等。 - **常用键**:**`report_title_template`**(支持 `{trade_date}`)、**`email_system_name`**、**`email_news_max_items`**、**`email_news_filter_prefix`**、**`email_max_body_chars`** / **`email_max_subject_chars`**、**`weekly_email_attach_charts`** 等。 --- ## 文末温习与辅助脚本 定稿阶段由 **`append_replay_viewpoint_footer`**(`replay_viewpoint_footer.py`)追加:**表格式**五人框架 + **`replay_footer_commentary`** 附录;**`replay_footer_inline_images()`** 对邮件正文恒为无内嵌 CID 图。周六温习邮件**不包含**「企业级六层架构」演进表(该内容仅见仓库 **`docs/six_layer_architecture.md`**)。 | 脚本 | 用途 | |------|------| | `weekly_theory_review_email.py` | 周六单独发送温习邮件(五人理论表格式) | | `send_flowchart_preview_email.py` | 表格式预览邮件 | | `generate_replay_footer_charts_extended.py` 等 | 本地生成 PNG 示意图(与邮件正文脱钩) | | `register_weekly_theory_review_task.ps1` | Windows 计划任务注册 | --- ## 持久化路径 配置 **`paths`**(`config_defaults`)约定相对路径,由 **`ConfigManager.path(...)`** 解析为绝对路径: | 逻辑文件 | 默认相对路径 | |----------|----------------| | 龙头池档案 | `data/watchlist_records.json` | | 风格指数 | `data/market_style_indices.json` | | 五桶权重 | `data/strategy_preference.json` | | 权重演进日志 | `data/strategy_evolution_log.jsonl` | | 断点 | `data/replay_status/` | | 可观测性日志 | `data/logs/`(见 **`observability`**) | 磁盘 API 缓存默认 **`data/api_cache/`**;数据源侧缓存目录见 **`data_source.cache_dir`**(默认 `data_cache`)。 --- ## 周度闭环与策略偏好 1. **`scripts/weekly_performance_email.py`**:支持 `--anchor`、`--dry-run`、`--plot`(如 `weights_trend.png`)。 2. **`weekly_performance.build_weekly_report_markdown_auto`**:收益、归因、市场快照、`weekly_market_snapshot`、严格涨幅前列等。 3. **`enable_weekly_ai_insight`**:风格诊断 LLM。 4. **`enable_weekly_llm_trend_narrative`**、**`enable_weekly_weight_llm_explanation`**:周度叙事与权重白话(各依赖对应开关)。 5. **`enable_strategy_feedback_loop`**:**`update_from_recent_returns`**;**`enable_weekly_weight_anomaly_email`** 为真时权重异常可另发邮件。 6. **`enable_weekly_performance_email`**:SMTP 发周报。 策略边界与衰减:**`strategy_preference.py`**、**`config/strategy_preference_config.py`**、环境变量 **`STRATEGY_*`**(见 **`ENV_FLAT_BINDINGS`**)。 --- ## 配置:合并顺序与顶层键 **有效配置**构造(`build_effective_config`)顺序如下: 1. 代码内 **`DEFAULT_CONFIG`** 2. **`replay_config.json`**(或 **`REPLAY_CONFIG_FILE`**)——与上一步**深度合并** 3. **`strategy_profiles[active_strategy_profile]`**——再深度合并(profile 内嵌套键递归覆盖) 4. 注入 **`paths.project_root`** 5. 扁平环境变量(**`ENV_FLAT_BINDINGS`**,见 `unified_config.py`) 6. 嵌套环境变量:前缀 **`REPLAY__`**,键路径用 **`__`** 分隔,例如 `REPLAY__data_source__timeout=12` **顶层键(节选;完整以 `config_defaults.py` 为准)** | 分组 | 键(示例) | |------|------------| | LLM | `deepseek_api_key`、`llm_api_key`、`llm_model_name`、`deepseek_model_name`、`llm_api_base`、`llm_default_url`、`llm_transport_timeout_sec`、`llm_retry_*`、`llm_chat_default_*` | | 邮件 | `smtp_*`、`mail_to`、`email_*`、`report_title_template`、`email_system_name` | | 性能 | `market_summary_parallel_fetch`、`fetch_parallel_max_workers`、`disk_cache_sweep_ttl_sec` | | 复盘 / 断点 | `enable_replay_*`、`replay_watchlist_*`、`replay_spot_5d_*`、`enable_replay_checkpoint`、`resume_replay_if_available` | | 周报 / 策略 | `enable_weekly_*`、`strategy_*`、`min_trades_*`、`multi_week_*` | | 复盘 LLM 附加 | `enable_replay_llm_enhancements`、`replay_llm_enhancements_*`、`enable_replay_llm_chapter_qc` 等(主流程未必启用) | | 文本规则 | `llm_failure_markers`、`llm_failure_payload_scan_chars`、`dragon_report_headings`、`replay_summary_line_max_chars`、`replay_text_templates` | | 嵌套 | **`data_source`**、**`paths`**、**`resilience`**、**`observability`**、**`llm_intel`** 等 | --- ## 环境变量 | 变量 | 用途 | |------|------| | `DEEPSEEK_API_KEY` / `LLM_API_KEY` | API 密钥 | | `DEEPSEEK_API_URL` | 映射到 `llm_default_url` | | `LLM_API_BASE` | OpenAI 兼容 Base(与默认 URL 组合逻辑见 `get_llm_client`) | | `LLM_TIMEOUT_SEC` | 写入 `llm_transport_timeout_sec`(详见上文「大模型客户端」) | | `LLM_RETRY_ATTEMPTS`、`LLM_RETRY_429*` | 重试与 429 退避 | | `SMTP_HOST`、`SMTP_PORT`、`SMTP_USER`、`SMTP_PASSWORD`、`SMTP_FROM`、`MAIL_TO` | SMTP(`resolve_email_config` 优先读环境变量) | | `SMTP_SSL` | `email_notify` 直接读取(`true` / `1` 表示 SMTPS) | | `REPLAY_CONFIG_FILE` | 自定义配置文件路径 | | `STRATEGY_*` | 见 `ENV_FLAT_BINDINGS` 与 `strategy_preference_config.py` | | `AK_*`、`API_*` 等 | 见 `config/data_source_config.py` | | `VALIDATE_STRICT` | `validate.py` 严格模式 | | `REPLAY__*` | 嵌套覆盖,见上文 | --- ## 脚本索引 | 脚本 | 说明 | |------|------| | `nightly_replay.py` | 日度复盘入口;`--date YYYYMMDD` | | `weekly_performance_email.py` | 周报;`--anchor`、`--dry-run`、`--plot` | | `weekly_theory_review_email.py` | 周六温习邮件 | | `send_flowchart_preview_email.py` | 温习样式预览邮件 | | `validate.py` | 依赖、权重和、演进日志 JSON 行、环境提示 | | `health_check.py` | 配置与服务导入探测 | | `backtest_weights.py` | 离线权重网格与绘图(见脚本 docstring) | | `generate_readme_business_overview_chart.py` | 生成 README 业务全景 PNG | | `generate_replay_footer_charts_extended.py` | 文末示意图 PNG(多风格) | | `generate_replay_footer_kebi.py`、`generate_replay_footer_tuixue.py` | 单主题脚注图 | | `generate_replay_viewpoint_footer.py`、`generate_replay_viewpoint_footer_asking.py` | 生成/调试 viewpoint 片段 | | `register_weekly_theory_review_task.ps1` | Windows 计划任务 | | `after_rsync.sh` | 部署后 venv 与 `pip install -r requirements.txt` | | `run.py` | 提示 Web 已移除,退出码 2 | --- ## 测试、CI 与 GitHub Actions ### `tests/` 一览 | 文件 | 大致覆盖 | |------|----------| | `test_replay_catalog.py` | 篇首目录 | | `test_replay_summary.py` | 摘要行 | | `test_replay_llm_failure.py` | LLM 失败载荷识别 | | `test_replay_enhancements.py` | 增强包拼接、并行顺序 | | `test_report_builder.py` | 五/七节补全 | | `test_finance_news.py`、`test_news_fetcher.py`、`test_news_mapper_pool.py` | 要闻与映射 | | `test_market_kpi.py`、`test_market_phase.py`、`test_market_style_indices.py` | KPI、阶段、风格指数 | | `test_output_formatter.py`、`test_ladder_utils.py` | 条形图、连板工具 | | `test_strategy_engine.py`、`test_kebi_strategy.py` | 策略引擎相关 | | `test_strategy_preference.py` | 五桶与 profile | | `test_weekly_performance.py`、`test_weekly_attribution.py` | 周报与归因 | | `test_resilience.py` | 熔断与安全执行 | | `test_observability.py` | 可观测性 | | `test_unified_config.py` | 配置合并与环境绑定 | | `test_llm_intel.py` | LLM 智能层单元逻辑 | ### CI(`.github/workflows/ci.yml`) 在 `push` / `pull_request` 至 `main` 或 `master` 时:`pip install -r requirements.txt` → 导入烟测 `ReplayTask` → **`pytest tests/ -q`** → **ruff**(指定文件列表)→ **`validate.py`** → **`health_check.py`**。 ### 定时与手动工作流 | Workflow | 说明 | |----------|------| | `scheduled-nightly.yml` | UTC `0 10 * * *`(约北京时间 **18:00**);`workflow_dispatch` 可选输入 `date`;Secrets:`DEEPSEEK_API_KEY`,SMTP 可选 | | `weekly-report.yml` | UTC `0 2 * * 0`(北京时间 **周日 10:00**);依赖 `data/watchlist_records.json` | | `weekly-theory-review.yml` | UTC `0 1 * * 6`(北京时间 **周六 09:00**);温习邮件 | | `deploy.yml` | 仅 `workflow_dispatch`;rsync + 远端 `after_rsync.sh`;Secrets:`DEPLOY_HOST`、`DEPLOY_USER`、`DEPLOY_SSH_KEY`、`DEPLOY_PATH` | --- ## 部署与运维注意 - 在 **`DEPLOY_PATH`** 放置 **`replay_config.json`** 或仅用环境变量完成密钥与 SMTP 配置。 - 定时任务可选:GitHub **Nightly**、本机 cron 或 Windows 任务计划程序。 - **GitHub 托管 Runner 不持久化 `data/`**:周报依赖的 **`watchlist_records.json`** 需在自托管 Runner 或自有同步策略下积累。 - **常见故障**:无龙头池 / `abort_reason`;周报无邮件;**429**;**`VALIDATE_STRICT`**;摘要或章节异常——详见 **`ARCHITECTURE.md`**。 --- ## 延伸阅读 | 文档 | 内容 | |------|------| | `ARCHITECTURE.md` | 模块边界、数据契约、排错、术语 | | `docs/six_layer_architecture.md` | 六层架构目标与代码映射 | | `docs/smtp_env.md` | 纯环境变量 SMTP 说明 | --- ## 维护约定 新增或变更行为时,请同步更新: - **`app/infrastructure/config_defaults.py`**(若新增配置项) - 本 **README** - **`ARCHITECTURE.md`**(若涉及模块契约或排错) - **`docs/six_layer_architecture.md`**(若涉及分层边界) **行为以主分支源码与 `pytest` 为准。**