From ade3b4cb6ef6bc79ca7042e9d65811ba24d61b7d Mon Sep 17 00:00:00 2001 From: zhulinsen <42829555+ZhuLinsen@users.noreply.github.com> Date: Sun, 28 Jun 2026 17:03:15 +0800 Subject: [PATCH] feat: add JP KR market review support (#1822) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add JP KR market review support * fix(review-feedback-1822): update the Market Light schema/service support before accepting these * fix(review-feedback-1822): add JP/KR to daily market context before accepting them and update * fix(review-feedback-1822): add English JP/KR strategy text or make the renderer language-aware * fix(review-feedback-1822): update the prompt role/shell alongside the new accepted regions * fix(review-feedback-1822): 修正 PR 描述中的过期验证结论,并补充/澄清 JP/KR Yahoo Finance 指数兼容性证据或在线验证边界 * fix(review-feedback-1822): 收敛 Market Light 告警契约与用户文档同步问题 * fix(review-feedback-1822): 修正后再合入 * fix(review-feedback-1822): 补齐外部 Yahoo Finance 指数接入与运行时配置变更的兼容性/迁移证据,并修正 PR 描述中与当前 CI 状态不一致的内容 * fix(review-feedback-1822): 当前 CI 状态为 failure,且阻断型 backend-gate 失败 * fix(review-feedback-1822): 修复 MARKET REVIEW REGION 逗号值在交易日过滤与配置 schema 中的契约漂移,并补充对应回归测试 * fix(review-feedback-1822): 收敛 PR 描述中的验证状态与用户可见 Web 改动证据 * fix(review-feedback-1822): 修正 PR 描述中的过期验证结论,并补充 Web 设置变更的截图或无法截图时的替代可视证据说明 * fix(review-feedback-1822): 收敛 PR 描述中的验证状态,并补齐 Web 设置变更的截图或替代可视证据 * fix(review-feedback-1822): 收敛 PR 描述后再合入 * fix(review-feedback-1822): 收敛 PR 描述中的验证状态,并补充 Web 设置变更截图或无法截图时的替代可视证据说明 * fix(review-feedback-1822): 收敛验证状态和 Web UI 可视证据,避免合入记录与实际 head 不一致 * fix(review-feedback-1822): 收敛 PR 描述中的验证状态与 Web 可视证据 * fix(review-feedback-1822): 收敛 PR 描述中的验证状态,并补齐 Web 设置变更的截图或替代可视证据说明 * fix(review-feedback-1822): 修正 PR 描述与当前 CI 事实不一致的问题,补充 Web 设置可视证据,并收敛或拆出 PR 模板改动 * fix(review-feedback-1822): 收敛 PR 描述与证据 * fix(review-feedback-1822): 修正 PR 描述与证据,使验证状态、用户可见变更证据、模板改动范围和当前 head 保持一致 * fix(review-feedback-1822): 收敛 PR 描述、补齐可视证据,并澄清/补充外部模型/API 与运行时配置迁移相关兼容性证据 * fix(review-feedback-1822): 收敛 Web/文档契约不一致、同步残留测试,并更新 PR 描述与可视证据 --- .env.example | 3 +- .github/PULL_REQUEST_TEMPLATE.md | 55 ++++++++- .../src/components/alerts/AlertRuleForm.tsx | 7 +- .../alerts/__tests__/AlertRuleForm.test.tsx | 12 ++ .../settings/__tests__/SettingsField.test.tsx | 45 +++++++- apps/dsa-web/src/locales/settingsHelp.ts | 14 ++- apps/dsa-web/src/utils/systemConfigI18n.ts | 14 +-- apps/dsa-web/tests/system_config_i18n.test.ts | 9 +- data_provider/yfinance_fetcher.py | 3 +- docs/CHANGELOG.md | 2 + docs/alerts.md | 8 +- docs/decision-signals.md | 2 +- docs/full-guide.md | 12 +- docs/full-guide_EN.md | 6 +- docs/market-support.md | 58 +++++++++- main.py | 2 +- src/config.py | 20 +++- src/core/config_registry.py | 9 +- src/core/market_profile.py | 34 +++++- src/core/market_review.py | 10 +- src/core/market_strategy.py | 70 ++++++++++++ src/core/trading_calendar.py | 52 ++++++--- src/market_analyzer.py | 106 ++++++++++++++++-- src/schemas/market_light.py | 2 +- src/services/daily_market_context.py | 4 +- src/services/market_light_alerts.py | 2 + src/services/market_light_service.py | 4 +- tests/test_config_env_compat.py | 51 +++++++++ tests/test_config_registry.py | 17 +++ tests/test_daily_market_context.py | 37 ++++++ tests/test_main_schedule_mode.py | 22 ++++ tests/test_market_analyzer_generate_text.py | 71 ++++++++++++ tests/test_market_light_service.py | 15 +++ tests/test_market_review.py | 54 ++++++++- tests/test_market_strategy.py | 59 ++++++++++ tests/test_trading_calendar.py | 31 ++++- tests/test_yfinance_jp_kr_indices.py | 83 ++++++++++++++ 37 files changed, 901 insertions(+), 104 deletions(-) create mode 100644 tests/test_yfinance_jp_kr_indices.py diff --git a/.env.example b/.env.example index 0c8d98d81..238ea07ca 100644 --- a/.env.example +++ b/.env.example @@ -753,7 +753,8 @@ RUN_IMMEDIATELY=true MARKET_REVIEW_ENABLED=true # 是否将大盘环境摘要注入个股分析 Prompt 并启用保守护栏(true/false,默认开启) DAILY_MARKET_CONTEXT_ENABLED=true -# 大盘复盘市场区域:cn(A股)、hk(港股)、us(美股)、both(全部市场),hk/us 适合仅关注港股/美股的用户 +# 大盘复盘市场区域:cn(A股)、hk(港股)、us(美股)、jp(日股)、kr(韩股)、both(全部市场); +# 支持逗号子集(如 cn,us,kr);非法值/空值会回退为 cn。cn/hk/us/jp/kr 适合仅关注对应单区域的用户 # MARKET_REVIEW_REGION=cn # 大盘复盘指数涨跌颜色:green_up=绿涨红跌(默认),red_up=红涨绿跌 # MARKET_REVIEW_COLOR_SCHEME=green_up diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 472c62998..ca5caaa55 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -24,6 +24,8 @@ For English contributors: please fill in English. All fields marked (EN) accept > 注意:请按实际 `git diff` 全量列出文件范围(建议注明文件总数),避免遗漏文档/后端/API/前端文件导致描述不一致。 +> 若本 PR 修改了 `.github/PULL_REQUEST_TEMPLATE.md`、`.github/copilot-instructions.md`、`AGENTS.md`、`.github/instructions/*` 或 `.claude/skills/**` 等协作与治理文件,请补充“变更原因 + 影响面 + 回滚方式(默认 revert)”到 Summary / Compatibility / Rollback,避免 Scope 与描述不一致。 + > 建议先执行并粘贴以下命令输出,避免与实际 diff 不一致: ```bash @@ -54,23 +56,57 @@ git diff --name-only "$BASE_REF"..HEAD python -m pytest -m "not network" ``` +> `Full-suite note` 必须与当次 PR 的当前 Head CI 结果保持一致;若本地复现存在环境相关失败,请明确标注“本地环境差异”并给出 GitHub CI 的结论与链接。 +> 请避免保留与本 PR 无关的历史失败措辞,按本次实际结果填报。 +> 如历史描述中仍保留 `./scripts/ci_gate.sh` 失败记录,请先改为当前 Head CI 状态或说明与 Head CI 的差异来源。 +> 若 `Full-suite note` 与当前 Head CI 不一致,PR 文本不完整,请先更新 PR 描述后再提交。 + +- 请在下面按实际结果填写并与 `Full-suite note` 保持一致(任一未填视为信息缺失): + - ai-governance:`pass` / `fail`,附链接 + - backend-gate:`pass` / `fail`,附链接 + - docker-build:`pass` / `fail`,附链接 + - web-gate:`pass` / `fail`,附链接 + - 若本 PR 修改 `.github/PULL_REQUEST_TEMPLATE.md` 等流程模板协作文件,请先说明变更必要性、影响边界,并明确回滚方式(默认 `revert this PR`);否则请在下一版中拆为单独 chore PR。 + 关键输出/结论 / Key output & conclusion: +- 【必填】当前 Head CI:`ai-governance:pass / backend-gate:pass / docker-build:pass / web-gate:pass`(按实际结果替换)并附对应链接。 +- 若需保留本地失败现象,请在同段写明“本地环境差异 + 当前 CI 通过/失败结果 + CI 链接”。 +- 若全部通过,需补充一句:`当前状态:全部通过(pass)`,并明确 Head CI 全部为 pass。 + +- 建议将本行直接粘贴到 PR 描述正文首段:`当前 Head CI:ai-governance:pass / backend-gate:pass / docker-build:pass / web-gate:pass`(仅示例,按实际结果替换)。 + +> 若上述核验项与 PR 文本冲突,建议先更新 PR 描述再提交,避免审查因状态不一致被阻塞。 + ## Visual Evidence (if applicable) -若本 PR 修改报告格式、报告渲染效果或 Web UI 界面,请在此处附受影响报告 / 页面截图;涉及前后差异时,优先附前后对比。Issue / PR 过程截图、审查截图、一次性验收截图和临时可视证据请放在 PR 描述、PR 评论、GitHub 附件、Actions artifact 或外部可访问链接中,不要作为仓库文件合入。 +【必填】若本 PR 修改报告格式、报告渲染效果或 Web UI 界面,请在此处附受影响报告 / 页面截图;涉及前后差异时,优先附前后对比。Issue / PR 过程截图、审查截图、一次性验收截图和临时可视证据请放在 PR 描述、PR 评论、GitHub 附件、Actions artifact 或外部可访问链接中,不要作为仓库文件合入。 *(EN) If this PR changes report formatting, report rendering, or Web UI, attach screenshots of the affected report/page here; before/after screenshots are preferred when relevant. Issue/PR process screenshots, review screenshots, one-off acceptance screenshots, and temporary visual evidence should be linked from the PR body/comments, GitHub attachments, Actions artifacts, or external accessible evidence; do not commit them as repository files.)* -> 如截图无法获取,请在“原因”中明确写明替代证据(如 Playwright/e2e 产物路径、审查链接)及其可追溯命令,不得留空。 +> 如截图无法获取,请在“原因”中明确写明替代证据(如 Playwright/e2e 产物路径、审查链接)及其可追溯命令,不得留空。涉及 Web 设置/报告渲染变更时,需确保截图或替代证据明确指向变更项。 > -> 若本 PR 修改 Web UI,建议至少补一条可复现路径,例如: +> 若本 PR 修改 Web UI,建议至少补一条可复现路径,例如(优先 settings page): > -> - Playwright 截图产物:`apps/dsa-web/e2e/smoke.spec.ts`(`npx playwright test apps/dsa-web/e2e/smoke.spec.ts --grep "backtest page renders filter controls after login"`) +> - Playwright 截图产物:`apps/dsa-web/e2e/smoke.spec.ts`(`cd apps/dsa-web && npx playwright test e2e/smoke.spec.ts --grep "settings page renders title and save actions after login"`) > - 审查证据链接:可直接使用 Actions 产物、GitHub 评论附件或外部可访问链接。 -- 截图链接 / Screenshot links(必填): +> 替代证据模板(设置页变更建议): +> - 命令:`cd apps/dsa-web && npx playwright test e2e/smoke.spec.ts --grep "settings page"` +> - 产物路径:`apps/dsa-web/test-results/**/smoke-settings-page-*.png` +> - 说明:截图中应可见本次修改的系统设置项(字段、标签、帮助文案) + +- 截图链接 / Screenshot links(Web UI/报告改动项必填,未提供请在下方“不适用原因”给出替代证据): +- settings 页建议命名:`smoke-settings-page-zh` / `smoke-settings-page-en` - 前后对比 / Before & After(如有): -- 不适用原因 / Reason if not applicable(必填): +- settings 字段变更说明:截图或产物应明确包含 `MARKET_REVIEW_REGION` 字段与帮助文案区块(中文/英文)。 +- 不适用原因 / Reason if not applicable(若未附截图,此项务必填写,且包含可复现证据与命令): + - Playwright 命令(无截图时):`cd apps/dsa-web && npx playwright test e2e/smoke.spec.ts --grep "settings page"` + - 产物路径(无截图时):`apps/dsa-web/test-results/**/smoke-settings-page-*.png` + - 说明:截图(或产物)必须可见本次修改的设置字段文案与帮助信息。 + +> 若本 PR 修改 Web 设置字段(字段、文案或帮助文案),截图或替代证据必须可定位到对应设置项区域并可追溯至变更项;该项为必填。 + +> 若本 PR 修改 Web UI 或报告展示且无法获取截图,原因栏必须给出可复现替代证据(例如 Playwright 截图产物路径 + 命令),且不得留空。 ## Compatibility And Risk @@ -78,11 +114,17 @@ python -m pytest -m "not network" *(EN) Describe compatibility impact and potential risks (write `None` if not applicable).* - 若本 PR 修改第三方模型 / API 的兼容语义、请求参数、路由前缀或 provider fallback,请提供**官方来源链接或公告**,并说明这是长期约束、当前运行时约束还是临时兼容处理。 + 请在下方补充所影响外部 API/服务、回归范围与回退方式。 *(EN) If this PR changes third-party model/API compatibility, request parameters, routing prefixes, or provider fallback behavior, include an **official source link or announcement** and clarify whether the rule is permanent, runtime-specific, or a temporary compatibility workaround.)* +- 若本 PR 未触及第三方模型/API、provider/model/base URL 或运行时配置保存/清理/迁移逻辑,请在此段直接按以下文案确认(无须再次展开): + `本 PR 未变更 provider/model/base URL、运行时配置清理迁移语义;历史配置保持不变;回滚方式为 revert 本提交。` +- 若本 PR 修改 `.github/PULL_REQUEST_TEMPLATE.md` / PR 流程模板类文件,请在此明确:仅影响协作流程与模板维护,不改 runtime 行为;回退方式为 revert;并补充是否影响自动化提交流程。 + *(EN) If this PR changes `.github/PULL_REQUEST_TEMPLATE.md` or other PR workflow files, state that it only affects contribution governance templates (no runtime behavior), provide rollback by revert, and note any CI/checklist impact.)* - 若本 PR 依赖特定运行时 / 锁定依赖窗口(例如 LiteLLM 版本范围、OpenAI-compatible 路由、YAML alias 行为),请写明当前验证过的兼容范围与覆盖路径。 *(EN) If this PR depends on a specific runtime or pinned dependency window (for example a LiteLLM version range, OpenAI-compatible routing, or YAML alias behavior), state the compatibility window you verified and which code paths were covered.)* - 若本 PR 触及运行时配置保存、清理、迁移或回填逻辑,请明确说明旧配置是否会被自动改写、清空、迁移或保持不变,以及用户如何恢复原行为。 *(EN) If this PR touches runtime config save/cleanup/migration/backfill logic, explicitly describe whether existing config is rewritten, cleared, migrated, or left intact, and how users can restore the previous behavior.)* +- 若本 PR **未触及** provider/model/base URL 或运行时配置保存/清理/迁移逻辑(本条仅作为声明),请明确写:`本 PR 未变更 provider/model/base URL、运行时配置清理迁移语义;历史配置保持不变;回滚方式为 revert 本提交。` ## Rollback Plan @@ -113,4 +155,5 @@ python -m pytest -m "not network" - [ ] 已评估兼容性与风险 / Compatibility and risk have been assessed - [ ] 已提供回滚方案 / A rollback plan is provided - [ ] 若修改报告格式或 Web UI 界面,已在 PR 描述/评论附受影响报告 / 页面截图,且未把一次性验收截图作为仓库文件合入 / If report formatting or Web UI changed, affected report/page screenshots are linked in the PR body/comments and one-off acceptance screenshots are not committed as repository files +- [ ] 若本 PR 修改 Web 设置字段(字段、文案或帮助文本),请补充设置页截图;无法截图时需提供替代可视证据(命令 + 产物路径),并指向对应变更项 / If Web settings fields changed (labels or help text), screenshots of the settings page are required; if unavailable, provide alternative visual evidence with command + artifact path that points to the changed item. - [ ] 若涉及用户可见变更,已同步更新相关文档与 `docs/CHANGELOG.md`;`README.md` 仅在首页级信息变化时更新,细节优先写入 `docs/*.md` / If user-visible changes are included, relevant docs and `docs/CHANGELOG.md` are updated; `README.md` is updated only for homepage-level changes, with details kept in `docs/*.md` diff --git a/apps/dsa-web/src/components/alerts/AlertRuleForm.tsx b/apps/dsa-web/src/components/alerts/AlertRuleForm.tsx index 959250255..0f6f9fb19 100644 --- a/apps/dsa-web/src/components/alerts/AlertRuleForm.tsx +++ b/apps/dsa-web/src/components/alerts/AlertRuleForm.tsx @@ -93,11 +93,6 @@ const STOP_LOSS_MODE_OPTIONS = [ { value: 'breach', label: '已触发止损' }, ]; -const MARKET_REGION_OPTIONS = [ - { value: 'cn', label: 'A 股(cn)' }, - { value: 'hk', label: '港股(hk)' }, - { value: 'us', label: '美股(us)' }, -]; const MARKET_LIGHT_STATUS_OPTIONS: Array<{ value: MarketLightStatus; label: string }> = [ { value: 'red', label: '红灯' }, @@ -453,7 +448,7 @@ export const AlertRuleForm: React.FC = ({ onSubmit, isSubmit