Passer au contenu principal
L

dsh-astock

laynepeng/dsh-astock

A-share assistant: 19 tools for quotes, K-line, screening, sentiment and backtests, plus a manual trade ledger, a sidebar panel, daily archive snapshots and risk-alert email. No broker connection or order placement.

Installer

dsh plugin --profile web add github:laynepeng/dsh-astock

README

dsh-astock

让 DeepSeek Harness 真的懂你的账户:盯盘、记账、算股数、查舆情、跑回测——你在券商 App 下单,插件负责把每一笔算清楚。

A股助手:持仓 / 交易 / 计划三个面板

持仓 · 交易 · 计划 —— 插件真实面板渲染,示例数据,非设计稿。

不接任何委托通道:没有下单、没有撤单、不登录券商。只做三件事:取数、记账、算账。

它替你做的三件事

  • 算清楚:现价、成本、浮盈、T+1 可卖、止损止盈价、这笔卖出的费用——全部用你的真实台账算,不是拍脑袋。
  • 记明白:每笔成交、每张事件单、备份都落本地 SQLite;换机器拷一个目录就走,不经过任何服务器。
  • 盯得住:交易日定时检查持仓与自选,只有触发阈值才提醒;高风险信号可以零 token 直接发邮件。

现在用 AI 看股票,大概是这样的:你问「我这只还能拿吗」,它给你一段听起来很有道理、但没看任何真实数据的分析;你问「跌了该补多少」,它让你自己去算;你说「帮我盯一下」,它回你一句「建议设置提醒」。

dsh-astock 是一个 DeepSeek Harness(下称 DSH)插件。装上之后,同样的问题,AI 会先去取真实行情、读你的真实持仓台账,再算给你看。

它不接任何委托通道——没有下单、没有撤单、不登录你的券商。执行永远是你自己在券商 App 里点,插件只做三件事:取数、记账、算账。

⚠️ 先说免责:本插件是工具,不是投顾。它不荐股、不代客理财、不承诺任何收益。行情来自公开接口,可能延迟、缺失或出错;算账结果取决于你自己录入的成交与费率;模型也可能读错数据。据此操作,盈亏自负——作者与贡献者不承担任何责任。 完整条款见文末「免责声明」。

30 秒装上

# 在 DeepSeek Harness 里打开「设置 → 插件」,或命令行:
dsh plugin --profile desktop add github:LaynePeng/dsh-astock

装完完全退出 DSH 再打开,右栏 + 里选「A股助手」。npm 包尚未发布,原因与进度见 docs/PUBLISHING.md。

支持 macOS / Windows;QQ / 163 邮箱用授权码发提醒,Outlook / Hotmail 用 OAuth2(内置公共客户端,不用注册 Azure)。


面板长这样

持仓:一眼看清该不该动手

持仓页:总资产、浮动盈亏、止损余量、T+1 可卖

  • 总资产 / 持仓市值 / 浮动盈亏 / 可用资金,加上「今日超额」(对全市场涨跌中位数,取不到才退回沪指)与近 5 日收盘净值曲线
  • 每只持仓:现价、成本、浮盈、占比(对比单票上限)、止损已用掉多少、今日可卖多少
  • 触发止损/止盈/超仓时,卡片直接标红并给出原因

交易:记一笔,或挂一张事件单

交易页:录入成交、新建事件单、最近流水、待触发事件单

  • 记一笔:买/卖、代码、价格、数量、日期、费用(可覆盖)、备注;保存后自动更新成本、T+1 与已实现盈亏
  • 新建事件单:代码、方向、触发条件(价格 ≤ / ≥)、触发价、数量、委托价、有效期——直接照着券商 App 的条件单填
  • 流水删除要确认两次,删完按剩余流水重算;事件单可撤销,成交后由 astock_sync 自动匹配核销

计划:两类定时,分开看

计划页:每日存档/邮件探测 + 盯盘/盘后报告

  • 插件自己的定时:每日 15:05 存档 + 收盘净值、邮件探测——不在 DSH 的自动化任务里,这里能看到上次执行结果
  • DSH 定时任务:盯盘(工作日 9:00–14:59)与盘后报告(15:05),可一键启动/停止
  • 左栏时钟图标「自动化任务」里能看到全部 DSH 任务;这里是与本插件相关的那几条

对话里也能用

下面这些直接复制就能用:

「我现在的持仓怎么样,有没有该处理的?」

「600000 跌破 9.5 我该不该止损?帮我把费用也算进去」

「今天大盘怎么样,我跑赢没有?」

「用三套策略扫一遍,告诉我现在该用哪套」


装之前 vs 装之后

场景普通对话装了 dsh-astock
「我持仓怎么样」AI 说「请提供你的成本价和数量」直接读台账,浮盈/T+1 可卖/占比一次列清
「跌到多少该止损」给你一个通用百分比按你的成本、费率与该股规则算出盈亏平衡价与止损价
「这笔卖出多少钱费用」估算,经常漏印花税佣金/印花税/过户费逐项列出,还能算「涨回成本价≠回本」
「帮我看下行情」训练数据里的旧价格实时快照:现价/涨跌停/量比/换手/市值
「有没有该关注的新闻」泛泛而谈公告/研报/新闻/龙虎榜/两融/股东户数七类证据,带背离提示
「帮我盯一下」没有真正的定时能力工作日盘中每 15 分钟检查一次,有信号才提醒
「这只票能长期拿吗」空泛结论主营构成占比、K 线位置、三套策略得分并可回测推荐率

19 个工具,一次看全

工具名与参数 schema 与上游 A 股插件逐字一致(schema 从上游导出,不是手抄),来源见文末「来源与致谢」。

行情

工具用途
astock_quote实时快照:现价、涨跌停价、量比、换手、市值、交易时段说明
astock_klineK 线 + 技术摘要:MA5/10/20/60、区间高低、量能变化
astock_search按代码 / 名称 / 拼音检索标的
astock_screen条件选股:涨跌幅、成交额、换手、市值、主力净流入
astock_flow个股资金流:主力 / 超大单 / 大单 / 中单 / 小单
astock_extra扩展数据面 17 类:打板情绪、题材归因、人气榜、行业排名、板块资金、ST 名单、两融、大宗、股东户数、分红、解禁、龙虎榜、板块归属、筹码分布、事件、研报公告、宏观利率

算账与台账

工具用途
astock_calc公式计算器:均线/RSI/波动率/回撤/复权/盈亏平衡价/盈亏比/可买股数,还能体检死规则(如「跌破 8.60」但现价 8.52)
astock_record录入已成交的买卖(先预览校验,再落账)
astock_portfolio持仓总览 + 资金 + 已实现盈亏 + 流水 + 纠错
astock_hint下单提示:T+1 可卖、止损止盈、加减仓档位、买卖股数估算
astock_sync成交回单同步:粘贴券商回单/CSV → 解析多笔 → 匹配计划 → 校价 → 落账
astock_act操作指示:先卖什么、再买什么、各多少股、操作后剩多少现金

研究

工具用途
astock_sentiment舆情分析:七类证据 + 可靠度 + 信号背离
astock_business主营构成:相关业务收入占营收几成(门槛判定:达标/不足/没有该业务)
astock_events事件驱动:回购/增持/中标/预增/重组/获批/分红,配 5 日主力资金印证

量化

工具用途
astock_pick量化选股:全市场扫描 → 多因子打分 → 换算成具体股数与止损止盈价
astock_backtest策略回测:历史逐期重放,看「多少期跑赢沪深300」
astock_archive本地日 K 存档:让回测突破行情接口约 2.6 年的上限

盯盘

工具用途
astock_watch自选股增删 + 盯盘开关(接到 DSH 定时任务)

所有工具都只读行情、只写本地台账。没有任何下单/撤单/券商对接能力。


安装细节(包名 / Windows / 排错)

⚠️ 先确认包名:本项目不是 npm 上的 dsh-astock

本项目的包名是 @laynepeng/dsh-astock,目前没有发布到 npm。正式安装用 dsh plugin --profile desktop add github:LaynePeng/dsh-astock;改源码调试时再用本地 link:。

不要在「设置 → 插件」或插件市场里按 dsh-astock 搜索安装:npm 上的 dsh-astock 是另一位作者的「A股港股量化工作台」,和本插件不是同一个包。

装错包、再把本项目的 cordis.patch.yml 贴进 profile,冷启动会插入一条 name: '@laynepeng/dsh-astock'、但 profile 里根本没有这个模块的装配行。DSH 桌面版会弹「启动失败」,点「停用第三方插件」后它把你的 cordis.patch.yml 改名成 cordis.patch.yml.bak-<时间戳> 再写一个 [] 占位——看起来就像「整个配置被清空」。原配置没丢,恢复方法见下面「装坏了」。

准备

  • DSH 已在用(桌面版或 dsh web 均可)
  • Node.js 22.13+(插件零第三方依赖,不需要 npm install;node:sqlite 从 22.13 起无需额外 flag)。DSH 自带 Node,一般无需另装
  • pnpm(DSH 管理插件要用它)。没有就 corepack enable 或 npm i -g pnpm,然后新开一个终端再确认 pnpm -v

装

正式安装(任何机器,从 GitHub 拉):

dsh plugin --profile desktop add github:LaynePeng/dsh-astock

本地调试(改了源码要立刻生效):

dsh plugin --profile desktop add link:/绝对路径/to/dsh-astock
# Windows 示例:dsh plugin --profile desktop add link:C:/codes/dsh-astock

注意桌面版用的是 desktop profile,命令行里的 --profile web 装进去的是另一个 profile,界面上不会出现。link: 而不是 file::前者在 node_modules 里是软链,改了源码立刻生效;后者是复制,改完要重装。

装完先确认装的是本项目(输出应是 @laynepeng/dsh-astock 0.9.4):

node -e "const p=require(process.argv[1]); console.log(p.name, p.version)" \
  ~/.dsh/profiles/desktop/node_modules/@laynepeng/dsh-astock/package.json

Windows(cmd):把 ~/.dsh 换成 %USERPROFILE%\.dsh;PowerShell 用 $env:USERPROFILE\.dsh。没有这个目录,就说明装的是别的包(例如 npm 上的 dsh-astock),先 remove 再按上面的 github: 装。

装完必须重启(这一步别跳)

DSH 启动时就锁定了插件模块集合,不重启,界面上什么都不会变。这一点在开发本插件时踩过最深的坑:源码改完、插件启停十几次,宿主一直执行两小时前的旧代码。判断方法见文末「常见问题」。

  1. 退出 DSH(桌面版关窗口,命令行 Ctrl+C)
  2. 重新打开
  3. 浏览器刷新页面
  4. 开一个新会话

验证装好了没

浏览器里打开(端口换成你的 DSH 地址,桌面版通常是 2328,dsh web 默认 3080):

http://127.0.0.1:2328/api/dsh-astock/info

期望看到 "version": "0.9.4"、"tools": 19、"configSchema": true、"settingsFields": 45。

再到对话里说一句「查一下 600000 的行情」——能返回真实价格就成功了。

在界面上:右栏 + 里应该能找到「A股助手」;打开 A股 → 配置,能看到邮件向导四步 + 「其他配置」六组,页面底部版本脚注是 v0.9.4(版本号对不上=宿主还在跑旧代码)。

装坏了:配置看起来被清空 / DSH 起不来

先说明责任边界:这不是插件在删你的配置。桌面版在宿主启动失败时弹出的恢复对话框里,如果你点了「停用第三方插件」,DSH 会执行 sanitizeProfile:把 profiles/<name>/cordis.patch.yml 改名成 cordis.patch.yml.bak-<毫秒时间戳>,写一个 [] 占位,并把 bundle 列表恢复成官方默认。原文件还在,只是名字变了。

不要因此删掉整个 ~/.dsh、profile 目录或 node_modules。按下面顺序来:

  1. 完全退出 DSH(桌面版关窗口;命令行 Ctrl+C),别让运行中的实例再写回磁盘。

  2. 在本仓库目录跑只读诊断(默认 ~/.dsh、desktop profile):

    node scripts/recover.mjs --profile desktop
    

    输出会列出 .bak-* 备份、当前 patch 的行数,以及解析不到的 bundle / insert 行(最常见的启动失败原因)。自定义过 DSH_HOME 的加 --home /你的/路径;profile 不是 desktop 的用 --profile <名字>。

  3. 把最新一份有内容的备份放回去(脚本会先把当前文件改名成 .bak-<现在>,不删除任何东西;空占位会被跳过):

    node scripts/recover.mjs --profile desktop --restore newest
    

    没有仓库、或不想跑 Node 脚本的 Windows 用户,可以直接用 PowerShell(效果一样,只复制不删除):

    $p = "$env:USERPROFILE\.dsh\profiles\desktop"
    $bak = Get-ChildItem "$p\cordis.patch.yml.bak-*" |
      Where-Object { $_.Length -gt 64 } | Sort-Object Name -Descending | Select-Object -First 1
    Copy-Item "$p\cordis.patch.yml" "$p\cordis.patch.yml.bak-$(Get-Date -Format yyyyMMddHHmmss)"
    Copy-Item $bak.FullName "$p\cordis.patch.yml"
    

    home 层(%USERPROFILE%\.dsh\cordis.patch.yml,影响所有 profile)同样查一遍 .bak-*。

  4. 验证配置能组合、再启动:

    dsh --profile desktop --dump-default-config   # 只组合 bundle,不含用户层
    dsh --profile desktop --dump-config            # 含 profile 与 home 用户层
    dsh --profile desktop
    

    第一条能过、第二条不过 → 坏行在用户层(profiles/desktop/cordis.patch.yml 或 ~/.dsh/cordis.patch.yml)。两条都不过 → 坏在 bundle / 包本身。

  5. 如果诊断说某条 insert 行指向未安装的包(例如 name: '@laynepeng/dsh-astock'):

    • 要么先把包装回来:dsh plugin --profile desktop add link:/绝对路径/to/dsh-astock;
    • 要么从 profile 的 cordis.patch.yml 里只删掉那一行;
    • 不要把本仓库的 cordis.patch.yml 整份贴进 profile 的 cordis.patch.yml——它是 bundle patch,装了包之后 DSH 会自动应用,手贴等于重复插入。

Windows:上面所有 ~/.dsh 都换成 %USERPROFILE%\.dsh(PowerShell 用 $env:USERPROFILE\.dsh);如果设过 DSH_HOME,用 %DSH_HOME%。备份文件名同样是 cordis.patch.yml.bak-<毫秒时间戳>。

PowerShell 里先看一眼备份与崩溃报告:

Get-ChildItem "$env:USERPROFILE\.dsh\profiles\desktop\cordis.patch.yml.bak-*" |
  Sort-Object Name -Descending | Select-Object Name, Length
Get-ChildItem "$env:APPDATA\DeepSeek Harness\logs\crash-*.log" |
  Sort-Object LastWriteTime -Descending | Select-Object -First 3 Name, LastWriteTime

桌面版的诊断报告在 ~/Library/Logs/DeepSeek Harness/(Windows 在 %APPDATA%\DeepSeek Harness\logs)。启动失败时先留报告,再点恢复;报告里第一处 Error 就是根因。

已知故障:启动报 duplicate factory registration for "dsh-astock"

0.8.2 及以前,lib/client.js 里模块 id 写成了 dsh-astock,而包名是 @laynepeng/dsh-astock。DSH 的 client-modules 用包名作模块 id:找不到就回退到单包 URL 再执行一次,第二次注册直接抛这个错,web boot 判定 @laynepeng/dsh-astock: import failed。0.8.3 已修正(id 改成 @laynepeng/dsh-astock;0.9.4 也包含该修复)。升级后如仍报错,说明宿主还在跑旧文件:删掉 node_modules/@laynepeng/dsh-astock 重装,或重启 DSH。

不想要了

dsh plugin --profile desktop remove @laynepeng/dsh-astock

重启后彻底干净。台账文件(默认 ~/.dsh/astock-data/ledger.sqlite)不会被删,想清掉自己删。


配置

右栏「A股 → 配置」是唯一入口:上半部分是邮件向导(四步点完就能发信),下半部分是「其他配置」六组,保存即生效。

为什么不用宿主配置页:DSH 0.2.2 的「插件 → 已安装插件 → @laynepeng/dsh-astock」对第三方 bundle 不一定渲染配置表单(很多人看到的就是「根本没有配置」)。所以插件自带这页自绘表单,45 项全在这里,不依赖宿主。

向导流程:

  1. 发信方式 —— Outlook / Hotmail、QQ 邮箱、163、Gmail、自定义 SMTP(分段按钮选,选完服务器、端口、TLS、认证方式全部自动定)。
  2. 账号 —— 认证方式二选一:OAuth2 授权(Outlook 用,「开始授权 → 浏览器输入代码 → 我已完成授权」)或授权码 / 应用专用密码(QQ / 163 / Gmail 用,不是登录密码)。
  3. 发件与收件 —— 发件地址、显示名、收件人(留空=发给自己)。
  4. 高级与测试 —— SMTP 主机 / 端口 / 隐式 TLS、客户端 ID / 租户、通知阈值、探测间隔、盘后复盘、「保存并发送测试邮件」。

向导下方是其他配置,六组默认全部展开(点标题可折叠),不用再去宿主插件页找表单:

分组关键项
交易与费用佣金率(万 2.5 填 0.00025)、最低佣金、印花税、过户费、每日 15:05 自动存档、回测时顺手存档
风控阈值止损线、止盈线、移动止盈回撤、单票上限、加仓/减仓提示与档位
异动提醒放量量比、当日跌幅阈值、当日涨幅阈值、回单校价容差
取数与缓存请求速率上限、取数超时、行情缓存、K 线缓存
选股与回测默认策略(趋势动量 / 均值回归 / 质量价值)、最多几只、现金使用比例、保留现金、分析只数、成交额门槛、自动附推荐率
盯盘盯盘间隔(秒,下限 300)

台账路径 / 存档路径故意不放面板:改这两项等于换一整个账户,容易把真实台账指到空库上。要换账户请走「维护 → 备份与迁移」的导入,或直接改 ~/.dsh/astock-data/settings.json(权限 0600,OAuth 的 refresh_token 另存 oauth.json)。宿主配置(cordis.patch.yml)仍然生效,本地设置优先级更高。

有两项改完需要额外动作:「每日 15:05 自动存档」要重启 DSH,「盯盘间隔」要重新「启动盯盘」——字段提示里也写了。

台账默认放 ~/.dsh/astock-data/ledger.sqlite,存档跟着台账同目录。只有在用默认位置时,首次启动才会发现旧版数据目录 ~/.lite-work/astock-data 并一次性搬过来(台账、存档、净值、回测、备份一起),之后不再读那个目录;你自己配了 ledgerPath 的话不会往里灌旧数据。

0.8.2 起存档跟着台账走(之前写死在 ~/.dsh/astock-data/,与文档不符)。如果你早就把台账指到别的目录,插件会把旧位置的 archive.sqlite 复制一份到台账目录(原文件保留),不会丢历史。


高风险邮件通知

盘中触发止损、止盈、当日大幅异动、单票超仓时,发一封邮件到你的邮箱。

不消耗模型额度:由插件自己每 5 分钟跑一次判定(纯本地),只在工作日 9:10–15:00 探测,收盘与周末完全不动。

配好只需走一遍向导(右栏 A股 → 配置):

  1. 选服务商(Outlook / QQ / 163 / Gmail / 自定义)
  2. 填邮箱账号;Outlook 点「开始授权」,其它填授权码
  3. 填收件人(留空=发给自己)
  4. 点「保存并发送测试邮件」——收到就完事,没收到面板会直接说卡在哪一步

防止刷屏:同一标的同一信号 6 小时内只发一次,每小时最多 12 封;只发阈值以上的信号(默认只发紧急,可调成「含需关注」)。

Outlook / Hotmail 为什么必须用 OAuth2

Microsoft 已对个人账号关闭 SMTP Basic Auth,应用专用密码也会被拒(535 5.7.139)。OAuth2 用的是设备码流程:

其他用户能直接用吗?

  • 不用注册 Azure:插件内置公共客户端,每个用户在自己机器上点「开始授权」走设备码;token 只写本机 ~/.dsh/astock-data/oauth.json(权限 0600),不上传。
  • 已验证微软设备码端点对 common / consumers / organizations + Graph Mail.Send 都返回 200——个人账号直接可用;企业/学校账号可能还需要管理员同意,失败会给出具体 AADSTS 码。
  • 默认租户 common 同时覆盖个人与组织账号;组织账号如被策略拦住,在「租户」里填自己的域名或 GUID。
  • 内置客户端将来若失效,可在「客户端 ID」里填自己的 Azure 公共客户端(允许设备码),不用改代码。
  • 不想用 OAuth:QQ / 163 用授权码当发件人即可,收件人可以填任意邮箱(包括 Hotmail)。

0.9.4 起 Outlook 发信默认走 Microsoft Graph(HTTPS 443),不再依赖 SMTP。 原因是部分网络下 smtp-mail.outlook.com:587 会在服务器返回 220 问候后直接断连(连 NOOP 都不回,不是配置问题)。 升级后需要在 A股 → 配置 → 第 2 步 OAuth2 里重新授权一次(新版申请的是 Graph 的 Mail.Send, 旧的 SMTP 授权不适用于 Graph;没重授权时会提示 401)。SMTP 仍保留为兜底。

  • 不需要回调端口、不需要自己注册 Azure 应用(内置了公共客户端,留空「客户端 ID」即可)
  • 授权一次后 refresh_token 落在本地,access_token 过期自动续期
  • 发信走 AUTH XOAUTH2,服务器地址自动用 smtp-mail.outlook.com:587(STARTTLS)

盘后复盘邮件(零 token)

收盘后想要一份「今天赚了多少 / 有没有该处理的信号 / 持仓舆情有没有变化」,不必调模型:

  • 在 A股 → 配置 → 第 4 步「高级与测试」 勾上「盘后复盘发到邮箱」,工作日 15:05 随「存档 + 净值」一起发送
  • 内容:账户与持仓、触发信号、前 N 只的舆情归集(N 可配,默认 3)
  • 也可以到 维护 → 盘后复盘邮件 → 现在发一份复盘 手动触发

盯盘

对 AI 说「启动盯盘」即可。等价于:

  • 在 DSH 定时任务里建一条:工作日 9:00–14:59,每 15 分钟
  • 到点检查全部持仓与自选,只在触发阈值时提醒,无异常只回一行「无异常」
  • 结果投到独立会话,不打断你正在聊的内容

说「停止盯盘」就删掉这条任务;说「盯盘状态」看它在不在、下次什么时候跑。

成本要说清楚:上游那套盯盘是「探针每 5 分钟取数、指纹变了才唤醒模型」,非交易时段零 token;DSH 没有探针,只有定时任务,所以这里是到点运行一次 Agent——每轮都会调用模型。因此默认间隔放宽到 15 分钟(下限 5 分钟),并且只在盘中运行。真要省钱就把邮件通知当主通道(零 token),盯盘间隔调大。


交易录入与事件单(右栏 A股 → 交易)

记一笔:方向(买/卖)、代码、成交价、数量、日期、费用(留空按费率自动算)、备注。保存后台账自动更新持仓成本、T+1 可卖与已实现盈亏;可以从持仓列表一键填入代码。删除流水会先让你确认一次,删完按剩余流水重算持仓。

待触发事件单:astock_hint / astock_act 生成的条件单会落成计划(P 开头),面板里能看到触发价、止损止盈和状态,也可以手动撤销。成交后用 astock_sync 把回单粘回来,会自动匹配计划并标记已成交。

流水与事件单都分页:最近流水每页 20 笔、待触发事件单每页 8 张,底部有「第 X / Y 页 · 共 N 条」和上一页/下一页;页码越界会自动夹到最后一页,数据再多也不会把面板撑爆。

事件单(券商条件单)格式:astock_hint 与 astock_act 现在直接给出券商 App「条件单 / 智能单」的填写字段——触发条件(最新价 ≤ / ≥)、委托方向、数量、限价、有效期,一张单只表达一个触发条件(止损一张、止盈一张、跟踪回撤一张),照抄即可,不用自己换算。

手动新建事件单:交易页有「新建事件单」表单——代码、方向、触发条件(价格 ≤ / ≥)、触发价、数量、委托价(留空=触发价)、有效期、备注。保存后落进台账,出现在下方「待触发事件单」里,可撤销;成交后 astock_sync 仍能按代码/方向/价格匹配。注意:插件不下单,记完你仍要在券商 App 挂同一张条件单。


计划页(右栏 A股 → 计划)

把「插件自己的定时」和「DSH 定时任务」放在一页,避免混淆:

区块内容能做什么
插件自己的定时每日 15:05 存档 + 收盘净值、邮件探测看上次执行/结果/净值;立即更新存档;发测试邮件
DSH 定时任务盯盘、盘后报告看状态/任务 id/下次运行/频率;一键启动/停止、启用/停用

区别:每日存档和邮件探测是插件内部的 timer,不在左栏「自动化任务」里;盯盘和盘后报告走 DSH 定时服务,左栏时钟图标里也能看到全部任务。


维护面板(右栏 A股 → 维护)

右栏 维护 页按「状态 → 一键操作 → 备份与迁移 → 导入(折叠)→ 危险操作(折叠)」重排,日常只看到前三块:

区块能做什么成本
本地存档看覆盖(多少只/多少根/区间/占用)、立即更新存档每只 1 次请求,约 2–4 秒
策略回测看最近一次推荐率/样本/超额/回撤、立即回测6–14 秒,不消耗模型 token
自动化每日存档与净值的上次执行、启用/停用盘后报告盘后报告每天 1 次模型调用
导出 / 备份导出台账 JSON、导出成交 CSV、导出自选 JSON、导出盯盘规则、备份台账+存档(含净值/回测)、按备份恢复本地文件操作
数据自愈按流水重算持仓(导入/删流水后对不上时用)本地 SQLite
导入成交粘贴 CSV → 预览校验 → 确认导入(重复行自动跳过)本地 SQLite
从 JSON 恢复台账粘贴 astock-ledger-*.json → 预览差异 → 确认恢复;可选「全量 / 只恢复资金与自选 / 只回放成交」本地 SQLite
自选 / 盯盘规则粘贴自选 JSON 预览/导入;粘贴盯盘规则 JSON 导入本地文件
盘后复盘邮件现在发一份复盘(零 token)本地拼装 + SMTP

每日 15:05 自动存档(零 token)

存档只增不减:今天开始存,一年后回测窗口才多一年。所以它不能依赖你记得点按钮——插件自己每个工作日 15:05 跑一次子进程,把持仓+自选的日 K 落库,同时记一条收盘净值(右栏持仓页顶部的迷你曲线就是它)。

  • 应用 15:20 才打开也能补跑;状态落盘,重启不会重复跑。
  • 非交易日、15:05 之前自动跳过。
  • 失败当天不重试(避免限流时越试越糟);存档是增量的,漏一天下次会自动补齐。
  • 不想要:配置页关掉「每日 15:05 自动存档」(只影响每日定时;回测时顺手存档是另一个开关「回测时顺手存档」)。

盘后舆情报告(工作日 15:05)

盯盘只在 9:00–14:59 跑,收盘后完全静默;上游的盘后报告靠「收盘后第一次探针」触发,DSH 没有探针。所以这里单独建一条定时任务:工作日 15:05,投到独立会话,调 astock_sentiment code=portfolio 做全量复盘。

  • 默认不启用(每天一次模型调用)。到 维护 → 自动化 → 启用盘后报告 创建;停用即删除任务。
  • 也可以在宿主配置里把 postCloseReport 打开,插件加载时会自动补齐这条任务。注意:宿主配置开着时,维护页停用后重启会被重新补齐——要彻底停用,请把宿主配置也关掉。
  • 说「盯盘状态」时会同时显示盘后报告在不在。

导出 / 导入 / 备份

  • 导出台账 JSON:完整快照(持仓 + 流水 + 自选 + 资金),带格式标记,适合迁移/存档。
  • 导出成交 CSV:中文表头 + BOM,双击用 Excel 打开不乱码。
  • 导出自选 JSON / 导出盯盘规则:自选与盯盘规则各自一份纯 JSON,换机器时不用重配。
  • 导入成交:只回放成交,持仓按流水重算(避免「导入的持仓和流水对不上」)。先预览逐行校验,再确认;日期/代码/方向/价格/数量都相同的行会自动跳过,所以同一份文件重复导入不会记两遍。
  • 从 JSON 恢复台账:粘贴 astock-ledger-*.json,先预览差异(持仓 +/改/清、成交新增/重复、自选新增、资金变化),再确认。三种范围:全量、只恢复资金与自选、只回放成交。持仓以成交回放为准;没有对应流水的手工持仓按文件原样写入。
  • 自选 / 盯盘规则导入:粘贴 JSON 即可,自选支持预览;规则导入后会同步进盯盘任务的提示词。
  • 备份 / 恢复:用 SQLite 的 VACUUM INTO 做一致快照(WAL 下也一致),台账、存档、收盘净值与最近回测一起打包,默认放在台账同目录的 backups/。恢复前会自动再备份一次当前状态,防止点错。
  • 资金余额不会被「导入成交」自动扣减——插件看不到你的银行出入金,请用 astock_portfolio action=set_cash 校准;全量 JSON 恢复会按文件里的资金覆盖。

卡片可以点

右栏卡片右上角的「分析」「看看」「生成今日操作清单」等按钮,会把问题写进输入框(不自动发送)。你确认措辞后按回车即可;编辑器可用时插入在光标处,已有草稿会保留(编辑器不可用时才替换草稿)。


常见问题

装完 DSH 起不来 / 配置看起来被清空? 先别删 ~/.dsh。桌面版启动失败对话框里的「停用第三方插件」会把 profiles/desktop/cordis.patch.yml 改名成 cordis.patch.yml.bak-<时间戳>,原配置还在。按上面「装坏了:配置看起来被清空 / DSH 起不来」一节,用 node scripts/recover.mjs --profile desktop 诊断、--restore newest 找回;不要整目录删除。

装完右栏没有 A股 标签? 先确认重启过 DSH 并刷新了页面。右栏 tab 条末尾的 + 才是入口,不是右上角的齿轮。

改了源码、重启插件,行为没变? DSH 的插件模块在进程内按路径缓存,启停插件不保证重新加载。确认方式:在已登录的浏览器里打开

http://127.0.0.1:<你的端口>/api/dsh-astock/info

version 落后或直接 400/404,就说明跑的还是旧模块——重启 DSH,这是唯一可靠的方式。

这个端点要带登录态:浏览器里直接打开即可;用 curl 得先拿到 DSH 的 dsh-auth-* cookie(/ 的 ?token= 握手会种下它),否则宿主会回 400。

邮件提示「SMTP 认证失败(535)」? 九成是用了登录密码。QQ/163/Gmail 都要求授权码 / 应用专用密码:邮箱设置里开启 SMTP 服务后生成,填到向导第 2 步的「授权码 / 应用专用密码」。

邮件提示「连接失败」? 端口与 TLS 配错了:465 配「隐式 TLS(开)」,587 配「STARTTLS(关)」。企业邮箱还要确认是否需要白名单。

配好了收不到邮件? 先看为什么没发:打开 /api/dsh-astock/info 看 mail 字段(ready 为 false 时会有 skipped 说明,如「N 条信号都低于阈值 urgent」)。信号级别不够就把「通知阈值」调成 action 或 info。注意「未启用」「非交易时段」「去重窗口内」都是不会报错的正常跳过。

还要另装邮件插件吗? 不用。插件自带 SMTP 客户端(lib/js/smtp.js,只用 node:net / node:tls)与 Outlook 设备码 OAuth2(lib/js/oauth.js):SMTP 授权码与 XOAUTH2 两条路都能走。

找不到插件配置页 / 设置里没有 A股助手? 直接看 右栏 A股 → 配置——邮件向导、OAuth、盘后复盘都在那里,插件自己存 settings.json,不依赖宿主是否渲染配置表单。宿主那边(侧栏「插件」→ 已安装插件 → @laynepeng/dsh-astock)在 DSH 0.2.2 对第三方 bundle 可能根本不显示配置项,这不是故障。要排查表单注册情况,打开 /api/dsh-astock/info 看 configSchema 与 settingsError。

Outlook / Microsoft 365 邮箱能发吗?

  • 推荐走 OAuth2:右栏 A股 → 配置 → 第 2 步「账号」认证方式选 OAuth2(Outlook) → 点「开始授权」→ 浏览器输入面板上的代码 → 回来点「我已完成授权」。不需要注册 Azure 应用(内置公共客户端),也不需要应用专用密码。服务器会自动用 smtp-mail.outlook.com:587(STARTTLS)。
  • Basic Auth 已不可用:Microsoft 关闭了个人账号的 SMTP Basic Auth,应用专用密码也会被拒(535 5.7.139 Authentication unsuccessful, basic authentication is disabled)。这不是配置错。
  • Microsoft 365 企业:同样建议 OAuth2;组织可能还要求管理员同意该应用,或直接关闭 SMTP AUTH。
  • 替代方案:用 QQ/163/Gmail 的授权码当发件人,收件人填 Outlook 地址——收件不受影响。
  • Graph API 发信没做(也不需要:XOAUTH2 + SMTP 已经能发)。

数据存在哪?换机器怎么迁移? 默认都在 ~/.dsh/astock-data/:台账 ledger.sqlite、存档 archive.sqlite、收盘净值 equity.jsonl、备份 backups/。换机器时把整个目录拷过去即可;也可以在 维护 → 导出/备份 里下载 JSON/CSV,或做一份 SQLite 备份。

如果你改过 ledgerPath,除 settings.json / oauth.json / watch-plan.json 本来就跟台账同目录外,存档、净值、回测、备份也都跟着台账目录走(0.8.2 起)。

盘后报告没生成? 先看 维护 → 自动化:显示「未创建」就点「启用盘后报告」。显示时间却没收到,确认当天是交易日、且 DSH 在 15:05 之后运行过(应用退出/休眠期间不会补跑定时任务)。盘后报告每天调用一次模型,不想花 token 就停用。

每日存档为什么没有立刻变长? 存档是增量累积的:今天开始存,明天多一天,一年后才多一年历史。它不会把在线接口已有的 2.6 年一次性变长——那部分本来就能取到。

AI 不主动用这些工具? 插件会给模型注入一段用法说明。如果还是不动手,直接点名:「用 astock_hint 看看我的持仓」。

会不会误操作我的账户? 不会。插件没有任何委托通道,也不保存券商密码。它只读公开行情、只写本地 SQLite 台账。

数据准吗? 行情来自公开接口(腾讯主源,新浪/东财备源),有缓存与限速;台账是你自己录入的成交。两者都不是交易所级实时源,仅供个人研究。


它是怎么做到的

DSH 工具调用 ──► lib/plugin.js(注册 19 个工具 + 面板端点 + 两个定时任务)
                        │
                        └─► lib/js/*(19 个工具 + 面板 + 维护 + 邮件,全部 Node 实现)
                              │
                              ├── 行情/舆情:公开接口(fetch)
                              ├── 台账/存档:node:sqlite(表结构与旧版完全一致)
                              └── 邮件:自带 SMTP 客户端(node:net / node:tls)

浏览器 ──► lib/client.js(右栏「A股」React 面板)──► /api/dsh-astock/panel

为什么全量重写成 Node 而不是继续跑 Python 子进程:早期版本直接跑上游的 Python 原实现,代价是用户机器必须装 Python,且每次工具调用都要起一个子进程(Windows 上还要处理编码与路径)。现在 19 个工具、面板、维护动作、邮件判定都在宿主进程内跑:口径逐条对齐原实现(有 184 条离线测试兜底,含与旧输出的对照),台账 SQLite 表结构一字未改,所以升级后老台账直接可用。

安全边界:工具白名单固定(没有执行任意命令的入口),网络只去公开行情/数据源;写盘只落在 ~/.dsh/astock-data/(台账、存档、settings.json、oauth.json),不读写 DSH 的 profile 配置或 cordis.patch.yml。


项目状态

  • 测试:197 项通过(node --test test/*.test.mjs)
  • 许可证:Apache-2.0
  • 宿主:DeepSeek Harness 0.2.x(Electron 桌面版 / dsh web)
  • npm:暂未发布,用 github: 安装

来源与致谢

A 股取数与算账口径来自上游开源项目 lite-work-plugins 的 astock-plugin(Apache-2.0):19 个工具同名、同 schema、同输出文案,台账与存档沿用同一路径同一格式(可共用)。DSH 侧缺的东西按 DSH 的方式补:

  • 界面:上游是 Markdown 富围栏(只读),这里是真实 React 面板(持仓 / 交易 / 选股 / 计划 / 维护 / 配置六个页签),卡片按钮可点击追问
  • 新增:每日 15:05 存档 + 收盘净值曲线、盘后复盘邮件、台账/自选/盯盘规则导入导出、全量 JSON 恢复、自带 SMTP 与 Outlook OAuth2
  • 差异:盯盘由「探针唤醒」改为 DSH 定时任务,每轮调用模型(故间隔放宽到 15 分钟);「立即选股/回测/更新存档」等按钮从设置页移到「维护」页

免责声明

本插件不是投资顾问,不构成任何投资建议、荐股、代客理财或收益承诺。 使用前请逐条读完,不同意任一条请不要使用。

  1. 不代客交易。插件没有任何委托通道,不登录券商、不持有资金或证券。所有买卖都由你在自己的券商 App 里手动完成,插件只做取数、记账、算账。
  2. 数据可能错。行情、财报、舆情、板块、资金流来自公开第三方接口(腾讯 / 新浪 / 东财等),可能延迟、缺失、口径不一致,或因接口变更而失效。台账数据完全来自你自己的录入,录错就会算错;费率填错,盈亏平衡价与费用也是错的。
  3. 模型会错。插件把数据交给大模型组织语言,模型可能误读、算错或给出与你风险承受能力不匹配的结论。任何数字都要自己复核一遍再下单。
  4. 回测不是预测。历史推荐率 / 胜率只说明「这套规则在过去那段样本里表现如何」;样本期短(在线接口约 2.6 年)、不含退市股(幸存者偏差),不能外推为未来收益,也不代表任何单只股票上涨的概率。
  5. 盈亏自负。基于本插件输出(或未使用它)做出的任何投资决策及其后果,由你本人承担。作者与贡献者不对任何直接或间接损失负责,包括但不限于本金亏损、错失机会、数据错误或程序缺陷导致的误操作。
  6. 合规自担。请自行确认所在地区对程序化取数、自动化提醒、邮件推送的合规要求,不要用它从事违反交易所规则、券商协议或当地法律的行为。
  7. 无担保。软件按「现状」提供,不附带任何明示或暗示的担保(见 Apache-2.0 第 7、8 条)。

一句话:赚了不用分我们,亏了也别找我们——这个插件的价值是让你少算错账,不是替你判断该不该买。


相关链接

License: Apache-2.0


DSH 管好了 Agent、会话和工具,dsh-astock 补上「你的账户」这一段:让模型看得到真实价格、真实持仓和真实费用,而不是凭印象给你讲道理。

一行命令,重启一次,然后问它「我持仓怎么样」——三十秒就能看到区别。

Plugins associés