A股每日复盘视频自动生成。完整工作流:拉取非凸科技真实行情数据 → 抓取热点新闻 → AI 归因分析 → 生成横屏 PPT 幻灯片 → 合成视频+封面图。当用户说「生成今日A股复盘视频」「A股日报」「出今天的复盘」或触发定时任务时使用。
bash
# 1. 安装依赖
bash scripts/setup.sh
# 2. 告诉 AI
「帮我生成今天的A股复盘视频」
依赖安装方式说明Python 3.7+系统自带pillowpip install pillow生成幻灯片fonttools + brotlipip install fonttools brotli字体格式转换(首次自动安装)ffmpegbrew install ffmpeg / apt install ffmpeg合成视频ftshare-market-dataskillhub install ftshare-market-data非凸科技行情接口newsnow-readerskillhub install newsnow-reader热点新闻抓取
或一键安装: bash scripts/setup.sh
text
Step 0 依赖检查 → 确认 ftshare-market-data / newsnow-reader 已安装
Step 1 ftshare-market-data → 拉取涨跌幅榜、成交额榜、大盘指数
Step 2 newsnow-reader → 抓取当日财经热点(华尔街见闻)
Step 3 AI 归因分析 → 交叉比对数据与新闻,生成每只股票归因
🔸 检查点① 展示归因摘要 → 用户确认数据和分析
Step 4 make_slides.py → 生成 7 张 1920×1080 横屏幻灯片
Step 5 用户确认幻灯片 → 发送 7 张预览图,用户确认后才继续
Step 6 make_video.py → 合成 MP4 视频 + 封面 JPG
Step 7 生成发布文案 → 通知用户文件位置 + 完整文案
Step 8 询问是否发送文件 → 直接发送视频和封面给用户
文件默认路径视频(收盘)~/astock-output/YYYY-MM-DD-复盘.mp4视频(盘中)~/astock-output/YYYY-MM-DD-intra-HHMM-复盘.mp4封面(收盘)~/astock-output/YYYY-MM-DD-封面.jpg封面(盘中)~/astock-output/YYYY-MM-DD-intra-HHMM-封面.jpg幻灯片~/astock-output/slides/YYYY-MM-DD/
执行前必须先判断当前属于哪种场景,决定数据日期和标注方式:
当前时间数据日期幻灯片标注说明交易日 15:00 后 ~ 23:59当天YYYY-MM-DD 收盘复盘最佳执行时间0:00 ~ 次交易日 9:30 前上一个交易日YYYY-MM-DD 收盘复盘API 数据仍为上个交易日周末 / 节假日最近一个交易日YYYY-MM-DD 收盘复盘同上交易日 9:30 ~ 15:00当天(盘中)YYYY-MM-DD HH:MM 盘中快报数据为实时快照,非最终结果
判断方法:
获取当前时间(北京时间)
拉取任意一只股票数据,检查 symbol_status.extra 字段:
"CLOSED" / "NOT_OPEN" → 非交易时段,使用最近一个交易日的收盘数据"TRADING" / "CALL_AUCTION" → 盘中,标注为盘中快报"BREAK" 午休等)→ 按盘中处理,标注当前时间根据场景自动设置 --title 参数:
"CLOSED" / "NOT_OPEN" → --title "今日 A 股复盘""TRADING" / "CALL_AUCTION" / 其他 → --title "A 股盘中快报 HH:MM"(HH:MM 为当前北京时间)--date 参数:
"2026-03-16""YYYY-MM-DD-intra-HHMM",如 "2026-03-17-intra-1430",避免与收盘视频文件名冲突,且纯 ASCII 保证目录名兼容性⚠️
--date为必填参数,不能使用系统日期date.today()默认值。 必须由 AI agent 根据以上逻辑判断正确的交易日期后显式传入。错误的日期会导致幻灯片标注与实际数据不符。
⚠️ 盘中数据为实时快照,涨跌幅和成交额会持续变化。幻灯片和视频中必须标注数据截取时间。
路径约定:以下所有脚本路径均使用相对路径。
SKILL_DIR指本 skill 所在目录,运行时由 AI agent 自动解析。
执行前先检查必需的依赖 skill 是否已安装:
检测 ftshare-market-data skill 是否存在(尝试定位其 run.py)
检测 newsnow-reader skill 是否存在(尝试定位其 scripts/fetch_news.py)
如果任一缺失,提示用户: text
⚠️ 缺少必需的依赖 skill,请先运行:
bash scripts/setup.sh
或手动安装:
skillhub install ftshare-market-data
skillhub install newsnow-reader
依赖齐全后,继续 Step 1
1a. 确定交易日期(必须与用户确认)
先拉取任意一只股票,从返回数据中判断市场状态:
检查 symbol_status.extra(参考「执行时机与数据日期判断」章节)
如果是 TRADING / CALL_AUCTION / 其他 → 交易日 = 今天,无需确认
如果是 CLOSED / NOT_OPEN(非交易时段)→ 必须询问用户确认数据日期:
text
当前市场未开盘,API 返回的是最近一个交易日的收盘数据。
请确认:这份数据对应的交易日是哪天?(例如 2026-03-16)
用户回答后,将该日期用于所有 --date 参数。
⚠️ 禁止自动推算交易日期。 中国 A 股有节假日调休(如周末补班交易、春节/国庆长假),纯靠星期几推算会出错。必须让用户确认。
1b. 拉取行情
使用 ftshare-market-data skill 的 run.py:
bash
# 全量 A 股数据(一次拉取,从中提取涨幅/跌幅/成交额 TOP5 + 统计涨跌家数)
python3 <ftshare-market-data>/run.py stock-quotes-list --order_by "change_rate desc" --page_no 1 --page_size 6000 \
--filter '(ex_id = "XSHE" OR ex_id = "XSHG") AND (latest != null)'
# 从全量数据中提取:
# - 涨幅 TOP5:按 change_rate 降序取前5(过滤 change_rate != null)
# - 跌幅 TOP5:按 change_rate 升序取前5(过滤 change_rate != null 且 < 0)
# - 成交额 TOP5:按 turnover 降序取前5
# - 统计:change_rate>0 为上涨,<0 为下跌
# - 涨停:trading_status == "LIMIT_UP"
# - 跌停:trading_status == "LIMIT_DOWN"
# - 全市场成交额:sum(turnover) / 1e8 得"亿"
# 大盘指数
# 收盘场景:用 close 字段(latest 可能为 null)
# 盘中场景:用 latest 字段(此时为实时价格,close 为昨收)
python3 <ftshare-market-data>/run.py stock-security-info --symbol "000001.SH" # 上证指数
python3 <ftshare-market-data>/run.py stock-security-info --symbol "399001.SZ" # 深证成指
python3 <ftshare-market-data>/run.py stock-security-info --symbol "399006.SZ" # 创业板指
<ftshare-market-data>指 ftshare-market-data skill 的安装目录,AI agent 会自动定位。
bash
python3 <newsnow-reader>/scripts/fetch_news.py wallstreetcn 8
<newsnow-reader>指 newsnow-reader skill 的安装目录。
获取到数据后,对每只涨跌异动股票,结合新闻进行归因:
同时提取宏观新闻的市场关联:每条新闻对应受影响的板块或个股。
归因完成后,按以下标准格式展示给用户确认:
text
📊 YYYY-MM-DD A股数据 & AI 归因(收盘复盘 / 盘中快报 HH:MM)
大盘指数
| 指数 | 最新价 | 涨跌幅 |
| 上证指数 | xxxx.xx | ±x.xx% |
| 深证成指 | xxxx.xx | ±x.xx% |
| 创业板指 | xxxx.xx | ±x.xx% |
市场概况
上涨 xxxx 家 | 下跌 xxxx 家 | 涨停 xx 家 | 跌停 xx 家 | 全市场成交额 xxxx 亿
涨幅 TOP5
| 股票 | 代码 | 涨跌幅 | 成交额 | AI 归因 |
| ... | ... | ... | ... | ... |
跌幅 TOP5
(同上格式)
成交额 TOP5
(同上格式)
今日宏观新闻 × 市场关联
| 标签 | 新闻 | AI 关联 |
| ... | ... | ... |
展示后询问用户:「数据和归因是否需要调整?确认后开始生成幻灯片。」
调用本 skill 的 scripts/make_slides.py,传入数据生成 7 张幻灯片:
bash
python3 scripts/make_slides.py \
--date "YYYY-MM-DD" \
--outdir "~/astock-output" \
--up "名称,代码,涨跌幅,成交额,AI归因|..." \
--down "..." --vol "..." \
--news "标签,标题,AI关联|..." \
--idx "上证点位,涨跌幅,深证点位,涨跌幅,创业板点位,涨跌幅" \
--stats "上涨家数,下跌家数,涨停家数,跌停家数,全市场成交额" \
--title "今日 A 股复盘"
--title由 AI agent 根据「执行时机与数据日期判断」章节自动设置,无需用户指定。收盘后传"今日 A 股复盘",盘中传"A 股盘中快报 HH:MM"。
幻灯片结构(固定 7 张):
⚠️ 合成视频前必须先让用户确认幻灯片。 视频合成耗时较长,修改成本高。
流程:
slides/<date>/ 目录下的 7 张图片发送给用户预览( <date> 与 --date 参数一致)bash
python3 scripts/make_video.py \
--slides-dir "~/astock-output/slides/YYYY-MM-DD" \
--outdir "~/astock-output" \
--date "YYYY-MM-DD"
BGM 默认使用 skill 自带的 assets/bgm/eliveta-technology-474054.mp3,也可通过 --bgm 指定其他文件。
💡 建议用户使用自己的 BGM:多人使用同一首 BGM 容易被视频平台判定为搬运内容。推荐从 Pixabay Music 免费下载无版权音乐替换。
视频合成完成后,根据当天的数据自动生成视频号发布所需的全套文案,格式如下:
标题(二选一,各20字以内)
收盘场景:
盘中场景(参考 references/copywriting.md 盘中模板):
标题生成规则:
话题标签(固定 + 动态)
text
固定:#AI量化 #A股复盘 #非凸科技 #OpenClaw
动态:根据当日涨停板块 / 热点事件自动补充2-3个,例如 #AI芯片 #新能源 #央行政策
简短话术(视频号正文,100字以内)
根据当天最大亮点写1-2句引导语,结构:
[今日亮点一句话] + [AI是如何分析的] + [行动号召]
例如:
今天AI存储板块集体爆发,朗科科技涨停。AI交叉比对新闻,5秒告诉你背后原因。 想让AI每天自动给你发这份复盘?评论区有安装方法。
完整输出格式
text
✅ 今日 A 股复盘视频已生成
📁 文件
视频: ~/astock-output/<date>-复盘.mp4
封面: ~/astock-output/<date>-封面.jpg
规格: 1920×1080 横屏 · 30fps · 35s
(<date> 为 --date 参数值,收盘为 YYYY-MM-DD,盘中为 YYYY-MM-DD-intra-HHMM)
📝 发布文案
标题A: [生成的标题A]
标题B: [生成的标题B]
话题: #AI量化 #A股复盘 #非凸科技 #OpenClaw #[动态话题1] #[动态话题2]
正文:
[生成的100字以内话术]
⚠️ 数据仅供参考,不构成投资建议
展示完整输出后,询问用户:「需要我把视频和封面直接发给你吗?」
所有 A 股价格、指数点位、涨跌幅、成交额数据,严禁猜测或估填。
股票行情 → 必须通过 ftshare-market-data 实时拉取
大盘指数 → 通过 stock-security-info 查询真实点位:
000001.SH399001.SZ399006.SZlatest 字段可能返回 null,应使用 close 字段latest 字段为实时价格(不为 null),应使用 latest 字段; close 此时是昨日收盘价上涨/下跌家数、涨停/跌停家数、全市场成交额 → 从 stock-quotes-list 全量数据中统计:
--page_size 6000 --filter '(ex_id = "XSHE" OR ex_id = "XSHG") AND (latest != null)'change_rate > 0 的数量change_rate < 0 的数量trading_status == "LIMIT_UP" 的数量trading_status == "LIMIT_DOWN" 的数量sum(turnover) 除以 1e8 得"亿""暂无,暂无,暂无,暂无,暂无"。 不得填写估计值宁可输出不完整的幻灯片,也不能展示错误的金融数据
静态资产(字体、BGM) 不随 skill 打包分发,首次运行时自动下载到 assets/ 目录。
也可手动预下载:
bash
python3 scripts/ensure_assets.py
assets/bgm/eliveta-technology-474054.mp3(~4.5 MB,首次运行自动下载)assets/fonts/NotoSansSC-Regular.ttf(~2.4 MB,首次运行自动下载)ftshare-market-data(非凸科技行情接口)newsnow-reader(热点新闻抓取)references/data-schema.md — 行情数据字段说明references/copywriting.md — 发布文案生成规范