market-review
生成市场指数复盘报告。自动执行iChoice+AKShare数据获取、Excel生成、JSON转换、前端展示和截图保存的完整流程。当用户要求"生成市场复盘"、"市场回顾"、"生成截止某日期的市场复盘"、"市场数据更新"时使用此技能。
SKILL.mdskills/market-review/SKILL.md
GitHub市场指数复盘
自动化生成多资产市场复盘仪表板,包括权益、债券、汇率、商品四大类资产的行情数据和分位数分析。
前置条件
- iChoice 账号 - xylczh0181 / ef465509(已内置于脚本,无需手动配置)
- Python环境就绪 - 需要
pandas, numpy, openpyxl, EmQuantAPI, akshare- AKShare 版本需 ≥1.18.50:
pip3 install --upgrade akshare
- AKShare 版本需 ≥1.18.50:
- 前端依赖已安装 - dashboard 目录需要已运行过
npm install或pnpm install
数据源说明:
- 主数据源:iChoice (EMQuantAPI) — 股指、债指、汇率、商品10个资产、EDB宏观指标
- 补充数据源:AKShare(免费)
fx_swap_quote()— USD/CNY 1Y掉期点实时报价(用于锚定锁汇成本)bond_zh_us_rate()— 中美国债收益率日频(锁汇成本历史走势代理序列)bond_cb_index_jsl()— 集思录转债市场指标(转股溢价率、价格中位数,1年历史)
执行流程
步骤 1: 解析用户请求的日期
从用户输入中提取截止日期。如果未指定,使用当天日期。
日期格式: YYYY-MM-DD
日期范围说明: 近一月走势包含完整31天。例如截止日期为2026-01-24,则起始日期为2025-12-24。
步骤 2: 生成 iChoice + AKShare 数据
cd /Users/fanshengxia/Desktop/市场观点美化/data
python generate_tables_from_ichoice.py --date YYYY-MM-DD
注意: iChoice 登录需要约 30-60 秒初始化时间,设置 timeout=300000。
生成文件:
指标值.xlsx- 36个指标的当前值、历史统计和分位数- 权益9个(含转债:转股溢价率、纯债溢价率占位、价格中位数)
- 债券9个、汇率6个(含锁汇成本、掉期点1Y代理)、商品12个
近1月净值走势.xlsx- 完整31天的日度行情数据(含锁汇成本走势)
步骤 3: 转换 Excel 为 JSON
cd /Users/fanshengxia/Desktop/市场观点美化/data
python excel_to_json_converter.py
输出文件:
data/asset_data.json- 数据备份asset-analysis-real-data/asset-analysis-dashboard/src/assets/asset_data.json- 前端数据
步骤 4: 启动前端服务
重要: 使用 ./node_modules/.bin/vite 而不是 pnpm dev,避免环境变量问题。
cd /Users/fanshengxia/Desktop/市场观点美化/asset-analysis-real-data/asset-analysis-dashboard
./node_modules/.bin/vite --port 5173 --host 0.0.0.0
后台运行时使用 run_in_background: true 参数。
注意: 必须加 --host 0.0.0.0,否则 vite 只监听 IPv6,puppeteer 用 IPv4 连接会超时。
前端服务启动后访问: http://$(ipconfig getifaddr en0):5173(IP 动态获取,勿硬编码)
步骤 5: 截图保存
等待前端完全加载后(约15秒),使用 puppeteer 进行截图:
cd /tmp && npm install puppeteer --no-save 2>/dev/null
// /tmp/screenshot_market.js
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: 'new',
args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-gpu']
});
const page = await browser.newPage();
await page.setViewport({ width: 1920, height: 1080 });
try {
await page.goto('http://LOCAL_IP:5173/', { waitUntil: 'domcontentloaded', timeout: 60000 });
// LOCAL_IP 通过 `ipconfig getifaddr en0` 动态获取,每次执行前替换
} catch(e) { console.log('goto:', e.message); }
await new Promise(resolve => setTimeout(resolve, 15000));
await page.screenshot({
path: '/Users/fanshengxia/Desktop/市场观点美化/市场复盘_YYYY-MM-DD.png',
fullPage: true
});
await browser.close();
console.log('Screenshot saved!');
})();
关键配置:
- URL 使用
ipconfig getifaddr en0动态获取的 IPv4 局域网地址,不要硬编码,不用127.0.0.1或localhost waitUntil: 'domcontentloaded'(不用load,防止超时后空白页)- 等待 15秒(不是5秒),确保 SVG 图表和分位数条全部渲染完成
截图保存路径: /Users/fanshengxia/Desktop/市场观点美化/市场复盘_YYYY-MM-DD.png
步骤 6: 关闭前端服务
使用 TaskStop 工具停止后台运行的前端服务。
项目路径
| 路径 | 说明 |
|---|---|
/Users/fanshengxia/Desktop/市场观点美化 |
项目根目录 |
data/ |
数据脚本和生成的文件 |
data/generate_tables_from_ichoice.py |
iChoice+AKShare 数据生成脚本(当前使用) |
data/excel_to_json_converter.py |
Excel 转 JSON 脚本 |
asset-analysis-real-data/asset-analysis-dashboard/ |
React 前端项目 |
示例用法
用户: "生成截止2026年1月24日的市场复盘"
响应流程:
- 提取日期: 2026-01-24
- 运行数据生成:
python generate_tables_from_ichoice.py --date 2026-01-24- 数据范围: 2025-12-24 至 2026-01-24(完整31天)
- timeout=300000(iChoice 登录初始化需要约60秒)
- 运行 JSON 转换:
python excel_to_json_converter.py - 启动前端:
./node_modules/.bin/vite --port 5173 --host 0.0.0.0(后台运行) - 等待15秒后使用 puppeteer 截图,URL:
http://$(ipconfig getifaddr en0):5173/(动态IP) - 截图保存为:
市场复盘_2026-01-24.png - 停止前端服务
错误处理
| 错误 | 解决方案 |
|---|---|
| iChoice 登录失败 | 检查网络连接,账号 xylczh0181 / ef465509 |
| EDB代码错误 | 检查 iChoice 代码是否有效 |
| AKShare 导入错误 | pip3 install --upgrade akshare(需要 ≥1.18.50) |
| pnpm 未找到 | 使用 ./node_modules/.bin/vite 替代 |
| 前端启动失败 | 运行 npm install 安装依赖 |
| puppeteer 未安装 | 运行 cd /tmp && npm install puppeteer --no-save |
| 截图空白/超时 | IP 可能变了,先 ipconfig getifaddr en0 确认当前 IP,再更新截图脚本中的 URL |
| timeout | 增大 Bash timeout 至 300000ms |
辅助脚本
提供一键执行脚本(含截图):
/Users/fanshengxia/.claude/skills/market-review/scripts/run_market_review.sh 2026-01-24