返回 Skill 列表
extension
分类: 其它无需 API Key

股票回测助手

生成「假如买入 100 万 X 股票,从上市持有到现在值多少」的动态回放网页(抖音/财经爆款那种)。用户给股票代码或名称(如「腾讯」「茅台」)+ 金额,本 skill 先把名称解析成具体股票并让用户确认,再自动抓取该股票上市至今的每日收盘价,渲染成一个 16:9 的折线回放动画网页:大数字随时间跳动显示市值、涨跌额/涨幅(A股红涨绿跌),下方有播放/暂停、速度、重新开始控制。支持「对比模式」——用户给两只股票(如「中国联通、中国电信各投入10万」),同页渲染两条回测曲线(纵轴为累计净值倍数,谁高谁赚得多),最多两只。覆盖 A股、港股、美股。当用户提到「假如买100万股票」「股票历史走势模拟」「股票回测/回放网页」「投资模拟器」「持有到现在值多少」「100万股票走势」「两只股票对比/比较回测」等,或想做任何「投入一笔钱买入某股票并按历史走势回放」的可视化网页时,务必使用本 skill。

person作者: user_1947fccchubcommunity

股票假如买入 · 走势回放网页

这个 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 个 --datareplay-template.html(单股);2 个 → compare-template.html(对比)。
  • 自动注入数据、生成 16:9 折线回放网页,并额外输出 closes.csv

5. 交付

  • 告诉用户项目文件夹路径,用 open <项目>/index.html(macOS)打开预览。
  • 简述结果:投入多少、最终市值、总收益率、区间最高、最大回撤。

对比模式(两只股票同页对比)

当用户一次给两只股票(最多两只,超过要让用户只选两只):

  1. 分别解析 + 确认两只(同步骤 1)。两只可不同市场、不同上市日、不同金额。
  2. 建一个对比项目文件夹,命名 对比-<名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
    
  3. 一次性传入两个 --data 生成对比页(自动选 compare-template.html):
    python3 <skill>/scripts/build_page.py \
      --data 对比-XvsY/data_A.json --data 对比-XvsY/data_B.json \
      --out 对比-XvsY/index.html
    
    产出:index.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)或点重新开始。