给 DSH 的 A 股持仓贡献卡:今日盈亏与组合涨跌幅和上证指数并排,按金额列出贡献前五并标出个股相对上证的强弱(pp),15:00 后可一键导出含贡献榜、上证分时图与只陈述数字的自动摘要的收盘小结 PNG。持仓读本地 holdings.csv/holdings.json,行情取自腾讯公开行情接口,不读 Cookie、不碰券商凭据。要求 DSH 0.2.x;浮卡与导出都有 CI 跑的测试覆盖。
安装
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:dingchenhui0618-arch/dsh-pnl-attribution
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
给 DeepSeek Harness 的 A 股持仓贡献卡:不只知道今天赚了多少,还知道这些钱是哪几只票赚的;收盘后一键导出可发群里的 PNG 收盘小结。
灵感来自 pm25000/dsh-ths-holdings(同花顺投资账本悬浮盈亏卡)。本项目是独立实现:没有 fork、没有 clone 后改、没有复制它的代码。原仓库是 MIT,思路可以借鉴,代码没有搬运。具体差异见文末。
截图
悬浮卡(构建产物 lib/client.js 在无头 Chrome 中加载,真实演示持仓与真实行情渲染):

收盘后导出的 PNG 长图(同一份数据,1080×1680 @2x):

它解决什么
原版 README 的功能表停在「今日盈亏 + 上证指数 + 分时图」——回答的是“总共赚了多少”。做产品文档和汇报时,下一个问题一定是“哪些票贡献的、谁跑赢了指数、有没有一张能直接发出去的图”。
这张卡把三件事放进同一个浮层:
- 今日盈亏:金额与组合涨跌幅,和上证指数并排。
- 贡献前五:逐只计算今日盈亏贡献金额,按金额降序取前五,同时标出相对上证的强弱(个股涨跌幅 − 上证涨跌幅,单位 pp)。
- 收盘小结 PNG:15:00 后一键导出,含贡献榜、上证分时图和一段只陈述数字的自动摘要。
与灵感来源的差异
| 能力 | pm25000/dsh-ths-holdings(按公开 README) | dsh-pnl-attribution |
|---|---|---|
| 今日盈亏 / 上证 / 分时 | 有 | 有 |
| 逐只贡献金额 + 相对指数强弱 + 前五排序 | 无 | 有 |
| 收盘后导出 PNG 小结 | 无 | 有(贡献榜 + 分时 + 摘要) |
| 自动摘要 | 无 | 有,只给数字,不给买卖建议 |
| 持仓来源 | 同花顺投资账本 Cookie 会话 | 本地 holdings.csv / holdings.json,不读任何 Cookie |
| 凭据 | 保存同花顺 Cookie | 不接触任何凭据 |
| 设置面板 / 自动获取 Cookie | 有 | 无(本项目刻意不做券商会话) |
差异的取舍:原版强在「自动同步真实持仓」,为此需要登录态;本项目强在「归因 + 可交付」,代价是持仓要你从券商/同花顺导出后整理成三列。两条路解决的不是同一个问题,本项目没有假装能替它自动登录。
安装
尚未发布 npm 包,直接从 GitHub 装:
dsh plugin --profile <你的 profile> add github:dingchenhui0618-arch/dsh-pnl-attribution
本地开发目录也可以直接装:
dsh plugin --profile <你的 profile> add D:\Projects\dsh-pnl-attribution
装好后重启 DSH(或刷新 Web 页面),右下角出现「持仓贡献榜」浮卡。桌面端在插件页安装时,profile 由应用自己管理。
要求 DSH 0.2.x(engines.dsh 为 >=0.2.1-rc.2 <0.3.0)。
配置持仓
默认读取:
~/.dsh/pnl-attribution/holdings.csv
格式(cost 可省略;sh/sz/bj 前缀也可省略,六位代码会按交易所规则推断):
code,name,shares,cost
600519,贵州茅台,100,1320.00
300750,宁德时代,400,245.00
601318,中国平安,1200,48.20
也接受 JSON:数组,或 { "holdings": [...] },字段 code|symbol、name、shares、cost。仓库里的 examples/holdings.demo.csv 是一份演示持仓(虚构股数,只用公开代码),复制到上面的路径即可先看到效果。
要换路径或刷新间隔,在 profile 的 cordis.patch.yml 里给这一行加 config:
- insert:
- id: dsh-pnl-attribution
name: dsh-pnl-attribution
config:
holdingsPath: D:\money\holdings.csv
refreshMs: 20000
refreshMs 会被限制在 5 秒到 10 分钟之间;改持仓文件后凭 mtime 自动失效缓存,也可以点卡片上的「刷新」。
数据从哪来
- 行情:腾讯公开行情接口(
qt.gtimg.cn快照 +web.ifzq.gtimg.cn分时)。批量请求一次拿全部持仓和上证指数,卡片每 20 秒轮询。 - 指数:上证指数
sh000001,分时序列就是导出图里的那条线。 - 持仓:只读你指定的本地文件。
- 没有:券商登录、Cookie、账号、token、交易接口。插件不会写入你的持仓文件。
行情是公开接口,可能延迟、限流或在非交易日停更;卡片会显示数据时间,抓取失败时保留上一次成功快照并标记「缓存」。
贡献怎么算
对每只持仓:
单只今日盈亏 = 股数 × (现价 − 昨收)
单只涨跌幅 = 现价 / 昨收 − 1
相对上证强弱 = 单只涨跌幅 − 上证涨跌幅 (单位 pp)
前五 = 按单只今日盈亏降序取 5 只
组合今日盈亏 = 所有有行情的持仓之和;组合涨跌幅 = 组合盈亏 / 全部持仓的昨收市值。cost(成本价)只用于记录,不参与今日盈亏计算。没有行情的持仓会被标记为缺失并排除,不会当成 0 元。
收盘小结 PNG
- 15:00(Asia/Shanghai)后按钮才可用;盘前/盘中导出按钮是禁用的,避免把半天的数字当收盘结论。
- 图片 1080×1680,2 倍分辨率渲染,含:日期与收盘状态、今日盈亏、上证分时图、贡献前五(金额 + 相对强弱 + 零轴条)、自动摘要、数据时间。
- 摘要只陈述数字:组合合计、涨跌家数、跑赢/跑输家数、前五合计、最大正/负贡献、其余持仓合计。不含任何买卖建议,也没有「建议/买入/卖出/加仓/减仓」这类词(测试里有一条断言专门扫这些词)。
- 导出在浏览器本地完成,不经过服务器,不产生第二次行情请求。
隐私与边界
- 只读
holdingsPath指向的文件;不碰~/.dsh里的凭据、Cookie 或其他配置。 - 卡片状态由本机 DSH Web 服务在
/dsh-pnl-attribution/state提供;任何能访问你的 DSH Web 界面的人都能看到这张卡,和看到对话本身一样。不要把 Web 端口暴露到不可信网络。 - 不是交易系统,不接券商,不下单,不构成投资建议。
- 目前只支持 A 股人民币持仓(沪深北六位代码);港股、美股、两融、期权不在范围内。
- 非交易日显示的是上一交易日的收盘数据;周末导出的是最近一次收盘快照,日期会写在图上。
开发
node scripts/build.mjs # 零依赖构建,产出 lib/
node --test # 43 个测试
lib/ 是 src/ 的构建产物,两者都入库;CI 会在 ubuntu/windows × node 22/24 上重新 build,并检查 lib/ 与 src/ 一致。
测试分三组:
core:CSV/JSON 解析、交易所推断、上海市场时钟、贡献/相对强弱/前五、摘要措辞(含“无建议词”断言)、快照导出闸门。quotes:GBK 解码、腾讯字段映射、分时序列、批量分片、HTTP 失败与缺指数。host:真实apply()+ stub fetch,钉住状态契约、缓存、mtime 失效、失败后 stale、缺文件引导、卸载拆路由。
License
MIT。灵感与产品思路来自 pm25000/dsh-ths-holdings(MIT),未复用其代码;本仓库的实现、测试与截图均为独立产出。
链接
同类插件
zhu1090093659/dsh-web#packages/dsh-task-board★ 10290
侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
zhu1090093659/dsh-web#packages/dsh-web-all★ 10290
DSH Web UI 插件与皮肤合集:任务看板、git 图、右侧面板、远程移动端 UI、桌宠、实时 token 统计与皮肤中心。
ccch1mneyyy/dsh-TUI★ 7336
Claude Code 风格全屏终端 UI:像素鲸鱼顶栏、实时工作状态行、思考流式展开。
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 7093
右下角常驻的小鲸鱼挂件:余额、今日已用与每轮对话消耗(含峰谷价),余额预警与今日预算的泡泡内容都可编辑;泡泡点击序列模块化自定义,支持并列加权 A/B、随机台词与随机图片;内置 30+ 厂商模板(OpenAI / OpenRouter / Kimi / 硅基流动 / 方舟 / 智谱 / MiniMax 等),按模型查余额与订阅额度;另有任务结束音效、导入音频、自定义角色与资源管理。数据全在本机,无遥测。
omdsh-dev/DSH-better-sidebar★ 5036
侧边栏完整工作台:内置文件渲染编辑、终端、Git 与子代理,支持三方插件注册新 Tab。
Devin-AXIS/deepseek-design#deepseek-idesign★ 1792
可视化设计工作室,支持网站、App 原型、海报、信息卡、报告和杂志的模板创建、元素编辑、选区级 AI 草稿衔接与导出。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。