股票假如买入 · 走势回放网页
这个 skill 做什么
把抖音/财经爆款里很火的「假如 X 年前买入 100 万 XX 股票,现在值多少」做成一个可交互网页:
- 用户输入 股票代码 + 投入金额(默认 100 万)。
- 自动抓取该股票上市至今的每日收盘价。
- 渲染成 16:9 展示区里的折线回放动画:曲线从左到右逐渐画出(红色发光线,A股红涨绿跌)。
- 信息条在图表上方(不压在图上):实时显示日期、市值大数字、涨跌额/涨幅,右侧固定显示投入本金/区间最高/最大回撤。
- 初次打开默认暂停,需手动点「▶ 播放」开始。
- 控制条:▶播放/⏸暂停 · ↺重新开始 · 速度(1x/2x/5x/10x) · 开始日期选择器;键盘 空格=播放暂停、R=重开、←/→=微调。
- 开始日期可改:选择器默认为空(=从上市/数据最早日起回测);用户选一个日期后,以该日为新买入基准重算(本金÷新起点收盘价=新股数,市值/峰值/最大回撤/里程碑全部基于新起点),图表从该日起重新回放;清空又回到最早。对比模式下两只股票都从所选日期起(早于某只上市日的,那只仍从其上市日起)。
- 投入金额可改:金额框默认 100 万(对比页默认两只统一本金);改金额后按新本金重算市值/峰值/盈亏(收益率不变),开始日期和金额任一改动都即时重算重绘。
- 里程碑暂停:播放到「区间最高」和「最大回撤」时会自动停 1 秒、弹出高亮卡片显示收益/回撤,然后继续。
- 结束后标记:自由播放走完停止时,在图上用悬浮卡片标出峰值点和最大回撤点(含数值与日期)。
- 页面底部注明回测口径:仅基于不复权收盘价涨跌,不计分红/送股/配股/手续费,持有期间无买卖;拆股已修正使曲线连续。
- 每只股票一个项目文件夹,过程数据(每日收盘价)也存盘。
设计原则(用户拍板,别擅自改):只看收盘走势、不记分红 → 统一用「不复权收盘价」;为避免美股拆股造成的假跳水,对拆股做回溯修正让曲线连续。
工作流(每次调用都按这个顺序)
1. 解析输入 + 确认(重要:先解析、用户确认后,再抓数)
先从用户原话里识别出股票 + 金额。用户常给的是名称(「腾讯」「茅台」「中国联通」)而不是代码,按下面处理:
(a) 大模型先解析(必须,别跳过直接查接口):凭你自己的知识把名称映射到最可能的具体股票。常见映射:
- 腾讯 → 腾讯控股 港股
00700;茅台 → 贵州茅台 A股600519;苹果 → 美股AAPL - 中国联通 → A股
600050/ 港股00762;中国电信 → A股601728/ 港股00728;比亚迪 → A股002594/ 港股01211 - 名称带「A 股/港股/美股」就按指定市场;没指定就给最主流的上市地(如腾讯默认港股、茅台默认A股),并列出歧义项让用户选。
(b) 用接口校验:跑 python3 <skill>/scripts/resolve_stock.py <名称> 用腾讯 smartbox 校验你解析的代码、补全市场/全称,并列出候选(含 ADR、子品牌等同名项)。注意接口会漏(如「茅台」「贵州茅台」可能搜不到、A股中国联通/电信/比亚迪常只返回港股),所以以你(a)的解析为准、接口只作校验补全,接口没返回不代表不存在。
(c) 给用户确认一次:把解析结果简明列出,请用户拍板后再抓数。例如:
已识别:中国联通(A股 600050),投入 10 万。是这只吗?(港股另有 00762) 对比:中国联通(A股 600050) VS 中国电信(A股 601728),各投 10 万。确认开始?
只有用户确认后,才进入下一步抓数据。 用户若给了明确代码(600519/AAPL/sz000001),可跳过解析直接确认即可。
- 投入金额默认
1000000(100 万);用户说「10W/10万」就100000。 - 可选起始日期(默认自动从上市日起)。
- 对比模式:用户一次给两只股票(最多两只)→ 走对比流程(见下文「对比模式」)。
2. 在【当前工作目录】下建项目文件夹
一股一个文件夹,命名 <股票名>-<代码>(股票名抓到后才知道,可先用代码建,抓到后重命名;或直接先抓再建)。例如:
贵州茅台-600519/
├── data.json # 过程数据:每日收盘价 + 模拟市值 + meta(fetch 产出)
├── closes.csv # 过程数据:纯收盘价,人可读(build 额外产出)
└── index.html # 最终回放网页(build 产出,双击即开)
文件夹建在用户当前 cwd 下,不要建到固定路径或 .claude/ 下。
3. 抓数据(调用内置脚本)
python3 <skill>/scripts/fetch_kline.py <代码> --amount <金额> --out <项目>/data.json
- 脚本自动:识别市场 → 按 [上市日,今天] 拆段 → 多平台轮换抓取(腾讯/东方财富,每次间隔 2 秒防封)→ 组装去重 → 美股/港股拆股修正 → 计算「假如买入」模拟市值。
- 进度会打到 stderr(看到「东财全量成功」=1 次调用搞定;看到「分段」=正在逐段抓)。
- 耐心等:长历史(如茅台 20 年 ≈ 9 段)每段 2 秒,全程可能 30~60 秒,属正常,别中途打断。
4. 渲染网页(调用内置脚本)
python3 <skill>/scripts/build_page.py \
--data <项目>/data.json \
--template <skill>/assets/replay-template.html \
--out <项目>/index.html
--template不传时按数据数量自动选:1 个--data→replay-template.html(单股);2 个 →compare-template.html(对比)。- 自动注入数据、生成 16:9 折线回放网页,并额外输出
closes.csv。
5. 交付
- 告诉用户项目文件夹路径,用
open <项目>/index.html(macOS)打开预览。 - 简述结果:投入多少、最终市值、总收益率、区间最高、最大回撤。
对比模式(两只股票同页对比)
当用户一次给两只股票(最多两只,超过要让用户只选两只):
- 分别解析 + 确认两只(同步骤 1)。两只可不同市场、不同上市日、不同金额。
- 建一个对比项目文件夹,命名
对比-<名A>vs<名B>/(建在当前 cwd 下),分别抓两只数据:python3 <skill>/scripts/fetch_kline.py <代码A> --amount <金额A> --out 对比-XvsY/data_A.json python3 <skill>/scripts/fetch_kline.py <代码B> --amount <金额B> --out 对比-XvsY/data_B.json - 一次性传入两个
--data生成对比页(自动选compare-template.html):
产出:python3 <skill>/scripts/build_page.py \ --data 对比-XvsY/data_A.json --data 对比-XvsY/data_B.json \ --out 对比-XvsY/index.htmlindex.html(对比页)+closes_A.csv+closes_B.csv。
对比页与单股页的不同(这是为对比专门做的样式适配):
- 两条曲线同图:A 青色、B 橙色,各自从上市日起画。
- 纵轴用「累计净值倍数」(相对各自本金,1×=本金)而不是绝对金额——这样一只暴涨(如冲到 5×)不会把另一只(在 1× 附近)压扁成看不见的细线,两只都清晰可比。具体金额仍在上方的两张信息卡里显示。
- 两张信息卡(A/B 各一张)实时显示日期、市值、涨跌额/涨幅、投入、区间最高。
- 领先提示条:按收益率比较,实时显示「🏆 当前领先:X,领先 Y 个百分点」。
- 时间按真实日期对齐:两只上市日不同时,较早的一只先画,较晚的那只在其上市日前显示「未上市」(不画)。
- 无里程碑暂停(两只的峰值/回撤点不同,暂停会打架),改为连续播放;速度/重开/键盘控制同单股。
什么时候读 references
references/data-sources.md 记录了各行情接口的实测行为与坑。正常情况不用读——fetch_kline.py 已内置最优策略。只在以下情况读它:
fetch_kline.py两平台都失败(输出!! 两平台均无数据)→ 按 references「失败时」一节自主找新浪/网易/雅虎等替代源。- 用户问数据来源、复权口径、拆股处理细节。
- 想理解某平台为什么限流/返回空。
关键决策与「为什么」
- 不复权收盘价(而非前复权):用户明确「只看走势、不记分红」。不复权最贴近「真实价格走势」。代价是分红除权日有小幅下跳——用户接受。
- 腾讯为主、东财为辅,但按市场分工(实测结论):
- 腾讯最稳定但单次硬上限 640 条,长历史靠翻页(A股/港股可行)。
- 东财一次拿全量,但①前复权对A股超长历史会算出负价(bug),故用不复权
fqt=0;②短时多次会 HTTP 000 限流。 - 美股腾讯只能拿到 2 个点(不可用),所以美股只能靠东财。
- 因此 A股/美股「东财全量优先」,港股「腾讯分段优先」,详见 references。
- 每次请求间隔 2 秒:用户要求,防平台封禁。
- 拆股修正(仅美股/港股):raw 价在拆股日会假跳水(如苹果 4:1 拆股价从 $500 跳 $125),不修正会让「持有到现在」的曲线断裂、模拟失真。脚本检测接近 1/3、1/4、1/7… 的干净拆股比率并回溯缩放;刻意排除 1/2(与真实暴跌 -50% 无法区分,宁可漏判不误伤)。A股无拆股,跳过。
- 网页零依赖、自包含:纯 HTML+CSS+JS,不引 CDN,双击即开、可离线、无跨域问题。数据由脚本服务端抓取后嵌入 JSON。
项目文件夹位置(强调)
- 始终建在用户当前工作目录下(
pwd),一股一个子文件夹。 - 不要建在
~/.claude/或 skill 自身目录下,不要建固定路径。
金额单位与显示
- 内部统一用「元」计算(如 100 万 = 1000000)。
- 网页自动按 万/亿 缩写显示大数字。
- A股惯例 红涨绿跌(涨=红、跌=绿),网页已内置。
常见问题
- 美股抓不到/有缺口:东财美股易限流。脚本会重试;若仍有缺口,网页会标注「⚠️ 部分区间数据获取受限」。可过几分钟重试,或参考 references 用雅虎/新浪补。
- 代码识别错市场:检查代码写法(见 references「市场与代码识别」);北交所/特殊代码少见,必要时手动指定。
- 历史太短就一闪而过:正常,调慢速度(1x)或点重新开始。
微信扫一扫