diff --git a/docs/e2e-finance-benchmark.md b/docs/e2e-finance-benchmark.md new file mode 100644 index 00000000..23f538f9 --- /dev/null +++ b/docs/e2e-finance-benchmark.md @@ -0,0 +1,104 @@ +# Finance Agent-Driven E2E Benchmark + +This benchmark suite is designed for complex financial analysis scenarios and follows the workflow in `docs/e2e-testing-guide.md`. + +## Scope + +- Domain: equity, macro, rates, credit, cross-asset allocation +- Complexity: multi-step planning, data collection, analysis, local artifact generation +- Providers: `kimi-coding` and `claude-code` +- Cases: 10 + +Case prompts are stored in: +- `scripts/e2e-finance-benchmark/cases/` + +## Prerequisites + +1. Credentials are configured (`pnpm multica credentials init` if needed) +2. Dev auth exists for `web_search`/`data` tools (`~/.super-multica-dev/auth.json`) +3. Required env: + +```bash +export SMC_DATA_DIR=~/.super-multica-e2e +export MULTICA_API_URL=https://api-dev.copilothub.ai +``` + +## Run All Cases (Both Providers) + +```bash +scripts/e2e-finance-benchmark/run.sh +``` + +The script defaults: +- Providers: `kimi-coding claude-code` +- Case glob: `case-*.txt` +- Output directory: `.context/finance-e2e-runs//` + +Generated artifact: +- `manifest.tsv`: provider, case id, status, session id, session dir, raw log file + +## Run a Subset + +Run only one provider: + +```bash +PROVIDERS="kimi-coding" scripts/e2e-finance-benchmark/run.sh +``` + +Run only specific cases by glob: + +```bash +CASE_GLOB="case-0[1-3]*.txt" scripts/e2e-finance-benchmark/run.sh +``` + +## Case List + +1. `case-01-top10-financial-reports.txt` + - Top-10 US market cap 3-year filing analysis + workbook + 2026 allocation memo +2. `case-02-ai-value-chain-scorecard.txt` + - AI value-chain factor model and weighted ranking +3. `case-03-us-bank-stress-test.txt` + - US large-bank stress scenarios (mild/severe recession) +4. `case-04-consumer-sector-macro-linkage.txt` + - Consumer sector earnings elasticity vs macro variables +5. `case-05-energy-transport-sensitivity.txt` + - Energy/transport sensitivity and hedge ideas under oil scenarios +6. `case-06-cross-asset-allocation.txt` + - Cross-asset tactical portfolio design with scenario stress tests +7. `case-07-reit-rate-risk.txt` + - REIT screening under rate scenarios and debt maturity pressure +8. `case-08-earnings-quality-forensics.txt` + - Forensic accounting quality framework and red-flag scoring +9. `case-09-post-earnings-drift-study.txt` + - PEAD strategy feasibility study with risk controls +10. `case-10-investment-committee-pack.txt` + - Q2 2026 investment committee pack + devil's advocate memo + +## Evaluation Checklist + +For each run (`session-dir/run-log.jsonl`): + +1. Event completeness + - `run_start` appears before `run_end` +2. Tool pairing + - Every `tool_start` has matching `tool_end` +3. Error handling + - Check `tool_end.is_error`, `error_classify`, `auth_rotate` +4. Compaction health + - If compaction occurs: `compaction.tokens_removed > 0` +5. Performance + - Inspect `llm_result.duration_ms` and tool durations for outliers + +For content quality (`session.jsonl` and output files on Desktop): + +1. Required files are created in target output directory +2. Assumptions are explicit and traceable +3. Sources are listed (`sources.md` with links + dates) +4. Output distinguishes facts vs inferences when requested +5. Strategy conclusions include risk and invalidation conditions + +## Notes + +- Most cases intentionally require web + financial data gathering and local file generation. +- Cases are designed to test planning quality, not only final answer quality. +- You can analyze sessions after batch runs by opening the `session_dir` paths in `manifest.tsv`. diff --git a/scripts/e2e-finance-benchmark/cases/case-01-top10-financial-reports.txt b/scripts/e2e-finance-benchmark/cases/case-01-top10-financial-reports.txt new file mode 100644 index 00000000..51eef71b --- /dev/null +++ b/scripts/e2e-finance-benchmark/cases/case-01-top10-financial-reports.txt @@ -0,0 +1,14 @@ +请完成一个高复杂度投研任务(中文输出): + +目标:分析美股市值排名前十公司在最近三个完整财年的财报与经营质量,并给出 2026 年(2026-01-01 到 2026-12-31)的投资建议。 + +硬性要求: +1. 以“截至 2026-02-01 的美股市值前十”为样本;如果个别公司数据窗口不完整,请注明并用“最近可得完整财年”替代。 +2. 每家公司生成 1 份详细分析,至少包含:收入与利润结构、毛利率/营业利润率趋势、现金流质量、资本开支与回购分红、估值区间、主要风险。 +3. 生成一个 Excel 文件(.xlsx),至少包含:`raw_data`、`company_scorecard`、`valuation`、`risk_matrix` 四个工作表。 +4. 生成一份综合报告,对十家公司做横向比较与分层(核心持仓/观察/回避),并给出 2026 年组合建议(含仓位区间和触发条件)。 +5. 单独输出 `sources.md`,列出关键数据来源链接与抓取时间。 +6. 所有结果统一放到新目录:`~/Desktop/multica-fin-bench/case-01/`。 +7. 如果无法直接生成 xlsx,请说明原因并提供结构等价的 CSV 文件集。 + +执行要求:先给出 8-12 步执行计划,再执行。最后做自检清单,确认文件齐全。 diff --git a/scripts/e2e-finance-benchmark/cases/case-02-ai-value-chain-scorecard.txt b/scripts/e2e-finance-benchmark/cases/case-02-ai-value-chain-scorecard.txt new file mode 100644 index 00000000..3535dbde --- /dev/null +++ b/scripts/e2e-finance-benchmark/cases/case-02-ai-value-chain-scorecard.txt @@ -0,0 +1,15 @@ +请构建“AI 产业链基本面与估值评分”项目(中文输出)。 + +股票池:NVDA、AMD、AVGO、MSFT、GOOGL、AMZN、META、TSM、ASML、ANET。 +时间范围:2023-01-01 到 2025-12-31(不足处用最近可得数据补齐并标记)。 + +任务要求: +1. 构建一个 100 分制评分模型,至少包含 6 个维度:增长、盈利能力、资本效率、研发强度、现金流质量、估值安全边际。 +2. 给出每个维度的权重与打分逻辑,必须可复现。 +3. 生成 Excel(.xlsx):`input_data`、`factor_scores`、`weighted_rank`、`scenario_2026`。 +4. 在 `scenario_2026` 中给出三种情景(乐观/基准/保守)下的目标区间与触发信号。 +5. 产出 `investment_memo.md`(含前 3 名的建仓逻辑和后 3 名的回避逻辑)。 +6. 产出 `sources.md`(来源链接 + 日期)。 +7. 输出目录:`~/Desktop/multica-fin-bench/case-02/`。 + +执行要求:先计划后执行;最后输出“可复现性检查”(别人按你的步骤是否能复现)。 diff --git a/scripts/e2e-finance-benchmark/cases/case-03-us-bank-stress-test.txt b/scripts/e2e-finance-benchmark/cases/case-03-us-bank-stress-test.txt new file mode 100644 index 00000000..6d2bb26a --- /dev/null +++ b/scripts/e2e-finance-benchmark/cases/case-03-us-bank-stress-test.txt @@ -0,0 +1,16 @@ +请做“美国大型银行 2026 压力测试”任务(中文输出)。 + +样本:JPM、BAC、C、WFC、GS、MS。 + +任务要求: +1. 基于最近三个完整财年(优先 2023-2025)整理关键指标:净息差(NIM)、CET1、贷款损失准备、商业地产敞口、存款成本变化、未实现损失等。 +2. 构建两套压力情景: + - Mild Recession:失业率上行 +150bp,联邦基金利率下行 100bp + - Severe Recession:失业率上行 +300bp,联邦基金利率下行 200bp,CRE 违约率显著上行 +3. 估算各银行在两种情景下的利润与资本充足率变化方向,并给出脆弱点排序。 +4. 生成 Excel(.xlsx):`bank_raw`、`stress_assumptions`、`impact_estimate`、`ranking`。 +5. 生成 `risk_brief.md`,包含“最需要警惕的 5 个风险信号”。 +6. 生成 `sources.md`。 +7. 输出到:`~/Desktop/multica-fin-bench/case-03/`。 + +执行要求:先给方法论,再给结果;最后列出你最不确定的 3 个假设。 diff --git a/scripts/e2e-finance-benchmark/cases/case-04-consumer-sector-macro-linkage.txt b/scripts/e2e-finance-benchmark/cases/case-04-consumer-sector-macro-linkage.txt new file mode 100644 index 00000000..13da5aa4 --- /dev/null +++ b/scripts/e2e-finance-benchmark/cases/case-04-consumer-sector-macro-linkage.txt @@ -0,0 +1,15 @@ +请做“美国消费板块与宏观变量联动分析”(中文输出)。 + +样本公司:WMT、COST、TGT、HD、LOW、MCD、SBUX、NKE、DIS、AMZN。 +时间范围:2023-01-01 到 2025-12-31。 + +任务要求: +1. 将公司分为“必需消费/可选消费”两组,比较收入增速、利润率、库存变化、同店销售(如可得)与现金流质量。 +2. 结合宏观变量(CPI、实际工资、失业率、利率)分析各组盈利弹性。 +3. 构建“2026 三情景”盈利弹性矩阵:软着陆/再通胀/衰退。 +4. 生成 Excel(.xlsx):`company_metrics`、`macro_series`、`elasticity_matrix`、`portfolio_actions`。 +5. 生成 `strategy_note.md`,给出 2026 年行业配置建议与再平衡触发条件。 +6. 生成 `sources.md`。 +7. 输出目录:`~/Desktop/multica-fin-bench/case-04/`。 + +执行要求:必须明确写出每个配置建议背后的可验证指标。 diff --git a/scripts/e2e-finance-benchmark/cases/case-05-energy-transport-sensitivity.txt b/scripts/e2e-finance-benchmark/cases/case-05-energy-transport-sensitivity.txt new file mode 100644 index 00000000..816c8a08 --- /dev/null +++ b/scripts/e2e-finance-benchmark/cases/case-05-energy-transport-sensitivity.txt @@ -0,0 +1,18 @@ +请完成“能源价格冲击下的能源与运输行业敏感性分析”(中文输出)。 + +样本:XOM、CVX、COP、SLB、DAL、UAL、FDX、UPS。 +时间范围:2023-01-01 到 2025-12-31。 + +任务要求: +1. 归纳各公司对油价/燃料成本的敏感方向与经营杠杆来源。 +2. 构建三种油价路径(2026 年): + - 情景A:WTI 均价 60 美元 + - 情景B:WTI 均价 80 美元 + - 情景C:WTI 均价 100 美元 +3. 估计不同情景下各公司盈利和估值的相对变化方向(可用区间而非点估计,但要说明依据)。 +4. 生成 Excel(.xlsx):`raw_financials`、`oil_scenarios`、`sensitivity_map`、`trade_ideas`。 +5. 生成 `hedge_plan.md`,提出至少 2 套对冲或配对交易思路,并说明失效条件。 +6. 生成 `sources.md`。 +7. 输出到:`~/Desktop/multica-fin-bench/case-05/`。 + +执行要求:结论必须包含“基准仓位 + 对冲仓位 + 触发阈值”。 diff --git a/scripts/e2e-finance-benchmark/cases/case-06-cross-asset-allocation.txt b/scripts/e2e-finance-benchmark/cases/case-06-cross-asset-allocation.txt new file mode 100644 index 00000000..df381db2 --- /dev/null +++ b/scripts/e2e-finance-benchmark/cases/case-06-cross-asset-allocation.txt @@ -0,0 +1,17 @@ +请做“跨资产战术配置(2026)”项目(中文输出)。 + +资产池:SPY、QQQ、IWM、TLT、IEF、HYG、GLD、DBC、BTC-USD。 +历史区间:2021-01-01 到 2025-12-31(月频即可)。 + +任务要求: +1. 计算并比较关键指标:年化收益、波动率、最大回撤、Sharpe、相关性矩阵。 +2. 设计两种组合: + - 防守型(目标最大回撤尽量低) + - 进攻型(目标风险调整后收益更高) +3. 对两种组合做 2026 三情景压力测试(增长放缓/通胀反复/流动性宽松),给出调仓规则。 +4. 生成 Excel(.xlsx):`price_returns`、`risk_metrics`、`corr_matrix`、`portfolio_defensive`、`portfolio_offensive`、`scenario_test`。 +5. 生成 `allocation_memo.md`,说明为什么这两种组合在 2026 年有可执行性。 +6. 生成 `sources.md`。 +7. 输出目录:`~/Desktop/multica-fin-bench/case-06/`。 + +执行要求:明确列出每个组合的再平衡频率、止损规则和再入场条件。 diff --git a/scripts/e2e-finance-benchmark/cases/case-07-reit-rate-risk.txt b/scripts/e2e-finance-benchmark/cases/case-07-reit-rate-risk.txt new file mode 100644 index 00000000..6dfd754f --- /dev/null +++ b/scripts/e2e-finance-benchmark/cases/case-07-reit-rate-risk.txt @@ -0,0 +1,14 @@ +请做“高利率环境下 REIT 投资筛选”任务(中文输出)。 + +样本:VNQ、PLD、AMT、EQIX、O、SPG、PSA、DLR。 + +任务要求: +1. 整理最近三个完整财年的关键指标:FFO/AFFO 增速、杠杆、利息覆盖、债务到期结构、分红覆盖。 +2. 设计 2026 年三种利率情景(10Y 美债收益率 3.5% / 4.5% / 5.5%),分析估值压力与分红可持续性。 +3. 给出“持有/观察/回避”分类,并解释最关键的 2-3 个驱动因子。 +4. 生成 Excel(.xlsx):`reit_raw`、`debt_profile`、`rate_scenarios`、`selection_result`。 +5. 生成 `reit_investment_note.md`。 +6. 生成 `sources.md`。 +7. 输出到:`~/Desktop/multica-fin-bench/case-07/`。 + +执行要求:如果数据缺失,必须在表中显式标注 NA,不允许静默跳过。 diff --git a/scripts/e2e-finance-benchmark/cases/case-08-earnings-quality-forensics.txt b/scripts/e2e-finance-benchmark/cases/case-08-earnings-quality-forensics.txt new file mode 100644 index 00000000..ac6fc9bb --- /dev/null +++ b/scripts/e2e-finance-benchmark/cases/case-08-earnings-quality-forensics.txt @@ -0,0 +1,14 @@ +请做“财报质量法证分析”(中文输出)。 + +样本:AAPL、MSFT、GOOGL、AMZN、META、NVDA、TSLA、BRK.B、UNH、JPM。 +时间范围:2023-01-01 到 2025-12-31。 + +任务要求: +1. 建立财报质量检查框架,至少包含:应计项目质量、经营现金流与净利润匹配度、股权激励稀释、回购与债务关系、一次性项目影响。 +2. 对每家公司给出 Red/Yellow/Green 评级,并给出可追踪的证据。 +3. 生成 Excel(.xlsx):`quality_raw`、`forensic_flags`、`rating_summary`、`watchlist_2026`。 +4. 生成 `forensic_report.md`,总结最值得警惕的 5 个红旗。 +5. 生成 `sources.md`。 +6. 输出目录:`~/Desktop/multica-fin-bench/case-08/`。 + +执行要求:必须在报告中明确“哪些结论是事实、哪些是推断”。 diff --git a/scripts/e2e-finance-benchmark/cases/case-09-post-earnings-drift-study.txt b/scripts/e2e-finance-benchmark/cases/case-09-post-earnings-drift-study.txt new file mode 100644 index 00000000..1fca7afc --- /dev/null +++ b/scripts/e2e-finance-benchmark/cases/case-09-post-earnings-drift-study.txt @@ -0,0 +1,15 @@ +请做“财报后漂移(PEAD)策略可行性研究”(中文输出)。 + +研究区间:2023-01-01 到 2025-12-31。 +样本:请选取至少 30 只美股大中盘(给出选择标准)。 + +任务要求: +1. 定义一个可执行的 PEAD 信号(例如财报后 1-3 天信息、盈利超预期代理变量或公告后动量代理变量),并说明局限性。 +2. 对样本进行分组比较(高信号/低信号),分析随后 1 个月与 3 个月表现差异。 +3. 加入基础风控规则(仓位上限、止损、行业暴露限制),评估策略在 2026 年是否值得小规模试运行。 +4. 生成 Excel(.xlsx):`universe`、`signal_definition`、`group_performance`、`risk_controls`、`pilot_plan_2026`。 +5. 生成 `pead_study.md`(包含方法、结果、偏差来源、落地建议)。 +6. 生成 `sources.md`。 +7. 输出到:`~/Desktop/multica-fin-bench/case-09/`。 + +执行要求:必须给出“失败场景”与“停止试运行”的客观条件。 diff --git a/scripts/e2e-finance-benchmark/cases/case-10-investment-committee-pack.txt b/scripts/e2e-finance-benchmark/cases/case-10-investment-committee-pack.txt new file mode 100644 index 00000000..fc816686 --- /dev/null +++ b/scripts/e2e-finance-benchmark/cases/case-10-investment-committee-pack.txt @@ -0,0 +1,13 @@ +请制作“2026 年 Q2 投资委员会材料包”(中文输出)。 + +目标:面向一个美元多资产组合,形成可直接开会使用的投委会文件。 + +任务要求: +1. 输出一个总览文件 `committee_pack.md`,结构至少包括:宏观判断、权益、利率、信用、商品、组合风险、执行清单。 +2. 输出一个 Excel(.xlsx)工作簿,至少包含:`macro_dashboard`、`equity_watchlist`、`rates_credit`、`commodity_view`、`portfolio_risk`、`action_tracker`。 +3. 在 `action_tracker` 中给出 2026 年 Q2 可执行动作,每条动作要有:触发条件、目标仓位变化、风控阈值、复盘时间点。 +4. 额外输出 `devil_advocate.md`,专门反驳你自己的核心投资观点,至少给 5 条反方论据。 +5. 额外输出 `sources.md`,列明关键数据来源与日期。 +6. 所有文件放到新目录:`~/Desktop/multica-fin-bench/case-10/`。 + +执行要求:先列计划再执行;最后给“投委会 10 分钟口头汇报提纲”。 diff --git a/scripts/e2e-finance-benchmark/run.sh b/scripts/e2e-finance-benchmark/run.sh new file mode 100755 index 00000000..afecd6fc --- /dev/null +++ b/scripts/e2e-finance-benchmark/run.sh @@ -0,0 +1,71 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOT_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)" +CASES_DIR="${SCRIPT_DIR}/cases" +TIMESTAMP="$(date +%Y%m%d-%H%M%S)" +OUT_DIR="${ROOT_DIR}/.context/finance-e2e-runs/${TIMESTAMP}" + +# Required environment for agent-driven E2E with web_search/data tools. +SMC_DATA_DIR="${SMC_DATA_DIR:-$HOME/.super-multica-e2e}" +MULTICA_API_URL="${MULTICA_API_URL:-https://api-dev.copilothub.ai}" +PROVIDERS_RAW="${PROVIDERS:-kimi-coding claude-code}" +CASE_GLOB="${CASE_GLOB:-case-*.txt}" + +read -r -a PROVIDERS <<< "${PROVIDERS_RAW}" + +mkdir -p "${OUT_DIR}" +MANIFEST="${OUT_DIR}/manifest.tsv" +printf "timestamp\tprovider\tcase_id\tstatus\tsession_id\tsession_dir\tlog_file\n" > "${MANIFEST}" + +mapfile -t CASE_FILES < <(find "${CASES_DIR}" -maxdepth 1 -type f -name "${CASE_GLOB}" | sort) +if [[ ${#CASE_FILES[@]} -eq 0 ]]; then + echo "No case files matched ${CASE_GLOB} in ${CASES_DIR}" >&2 + exit 1 +fi + +echo "Output directory: ${OUT_DIR}" +echo "Using SMC_DATA_DIR=${SMC_DATA_DIR}" +echo "Using MULTICA_API_URL=${MULTICA_API_URL}" +echo "Providers: ${PROVIDERS[*]}" +echo "Cases: ${#CASE_FILES[@]}" + +total=0 +for provider in "${PROVIDERS[@]}"; do + for case_file in "${CASE_FILES[@]}"; do + total=$((total + 1)) + case_base="$(basename "${case_file}")" + case_id="${case_base%.txt}" + log_file="${OUT_DIR}/${provider}-${case_id}.log" + + prompt="$(cat "${case_file}")" + + echo + echo "[${total}] Running ${case_id} with provider=${provider}" + + status="success" + if ! SMC_DATA_DIR="${SMC_DATA_DIR}" \ + MULTICA_API_URL="${MULTICA_API_URL}" \ + pnpm multica run --run-log --provider "${provider}" "${prompt}" > "${log_file}" 2>&1; then + status="failed" + fi + + session_id="$(rg -o "\[session: [^]]+\]" "${log_file}" | tail -n 1 | sed -E 's/\[session: ([^]]+)\]/\1/' || true)" + session_dir="$(rg -o "\[session-dir: [^]]+\]" "${log_file}" | tail -n 1 | sed -E 's/\[session-dir: ([^]]+)\]/\1/' || true)" + + printf "%s\t%s\t%s\t%s\t%s\t%s\t%s\n" \ + "${TIMESTAMP}" \ + "${provider}" \ + "${case_id}" \ + "${status}" \ + "${session_id}" \ + "${session_dir}" \ + "${log_file}" >> "${MANIFEST}" + + echo "status=${status} session=${session_id:-N/A}" + done +done + +echo +echo "Completed. Manifest: ${MANIFEST}"