dsh-plugin
DayuanJiang/next-ai-draw-iodsh 的 draw.io 绘图插件:通过 next-ai-drawio MCP 服务器作图,点回复里的链接在右侧栏打开实时预览,可以手动修改图,AI 的每次修改都是可以恢复的版本。需 Node.js 18+,首次使用由 npx 下载 MCP 服务器。
贝叶斯个股预测插件:多指标信号融合的上涨概率估计、趋势状态识别与持仓风险度量(A 股 + 美股)。
基于 贝叶斯定理 的 DeepSeek Harness 个股预测插件(dual-face:Host 工具 + 浏览器面板)。
⚠️ 平台依赖:本插件是 DeepSeek Harness(dsh)平台的扩展插件,依赖其宿主环境(
dsh web、cordis 插件系统、window.__ModuleLoader__等)。该平台目前未随本仓库公开,单独克隆本仓库无法直接运行,代码仅供学习、参考与移植。
| 模块 | 说明 |
|---|---|
| 多指标信号融合评分 | 假设 H =「未来 N 日上涨」。先验取加权历史胜率(shrunk);MACD 金叉、RSI、均线排列、布林带位置、量能、动量、近 5 日走势等信号作为证据,双向经验似然比(看多信号用 LR_bull、看空信号用 LR_bear,时间衰减加权 + 样本收缩),log-odds 更新 → 后验上涨概率(含 95% 置信区间)+ 0-100 评分与评级 |
| 卡尔曼增益融合 | 证据的收缩强度不再手调:用卡尔曼增益 K = P⁻/(P⁻+R) 融合先验与证据,观测方差由 LR 四格表经 Katz 近似给出、先验方差由先验有效样本量给出,逐股逐日自适应(等价温度 T_eff = 1/K) |
| 卡尔曼趋势滤波 | 对数价格的局部线性趋势(LLT)状态空间滤波,提供斜率 t 值与标准化新息两个信号源(kalman_slope / kalman_innov,默认关闭,见「卡尔曼增益」章) |
| 多窗口对比 | 同时输出 2/5/10/20 日后验对比表 |
| 趋势状态识别 | 贝叶斯 t 检验风格的三状态分类:P(上涨)=P(μ>+δ)、P(下跌)=P(μ<-δ)、P(震荡),阈值 δ = max(0.5·SE, 年化 5% 经济当量),防大样本下微小趋势误判 |
| 持仓风险估计 | EWMA 波动率(RiskMetrics λ=0.94)+ 经验分位数 VaR/CVaR 为主(正态估计对照)、历史最大回撤 |
| 信号归因 | 输出贡献绝对值 Top3 的信号;方向标签按实际贡献符号显示(名义方向经实证校准后可能与贡献相反) |
| 策略回测 | 严格防前视的参数化回测:逐换仓日现场评分 → 门槛 + TopN 选股 → 等分资金模拟换仓;支持大盘择时、ST/价格/市值/上市天数筛选、止损与仓位/板块上限、佣金与印花税;输出策略·高分 Top / 策略·低分 Top / 池基准三条曲线 |
| 全市场选股筛选 | 与回测完全同一套条件的单日截面选股(不做换仓模拟),表格可排序、可一键加自选、点行跳转单股分析 |
| 自选股(实时口径) | 自选日锚定价 + 「自选日至今」实时涨跌幅(真实价、不复权口径,与券商 App 一致),可与选股/回测共享同一份评分缓存 |
| 拼音首字母搜索 | 代码 / 中文名 / 拼音首字母三合一模糊匹配(ZGYH → 招商银行),GB2312 码段法实现、多音字变体展开、零依赖 |
| walk-forward 回测(模型校准) | 工具可选 backtest 参数:输出 Brier / log-loss / 方向准确率 / 可靠性表 / 分级命中率 / 自动校准温度,并与「无信息基线」「只用先验」等口径对照 |
方式一:一键安装(推荐,需要能访问 github.com)
dsh plugin --profile web add github:pg527322814/dsh-bayes-predict
装完重启 dsh web 生效(插件层在启动时合成;client bundle 的 HMR 仅在 pnpm run dev:web 重建时可用)。
方式二:手动安装(离线,或网络访问 github.com 受限时)
%USERPROFILE%\.dsh\profiles\web\node_modules\dsh-bayes-predict
(该目录不存在时先创建;profile 的 baseUrl 锚定在 profiles\web,node 解析会向上逐级查找 node_modules)%USERPROFILE%\.dsh\profiles\web\cordis.patch.yml 追加:- insert:
- id: bayes-predict
name: 'dsh-bayes-predict'
dsh web。⚠️ 客户端契约:
lib/client.js的 factory 必须导出inject数组(如exports.inject = ["slots"])。 cordis 依据模块导出的inject决定注入哪些服务;缺失时apply(ctx)里访问ctx.slots会直接抛cannot get property "slots" without inject(package.json的dsh.client.inject只影响 boot 清单,不替代模块导出)。
回测 / 选股缓存目录(可选但强烈建议):统一数据目录由 DSH_STOCK_CACHE_DIR 指定,未设置时默认 %USERPROFILE%\.dsh\stock-bayes\,结构为:
<cacheRoot>/
├── universe.json 多档股票池 { pools: { all, sh300, custom } } + 每只股票标签
├── data/<code>.json 每只股票K线
├── csi300.json 指数(沪深300)
├── scores/h<horizon>.json 预评分(列式紧凑存储 + 原子写)
└── watchlist.json 自选股清单(原子写)
首次使用某只/某个基准日时,缺失的行情与评分会现场拉取并计算(沪深300 量级约数秒,全市场数千只约分钟级),之后一直命中缓存;面板「🔄 刷新行情缓存」做增量刷新(只拉新 K 线去重追加)。管道中缺少 universe.json 时,股票池回退到内置沪深300 成分(lib/csi300-components.json)。
说明:本仓库只包含插件运行时。用于构建全市场
universe.json与评分预热的同步脚本属于开发侧工具,未随包发布。
对话中(重启后开新会话,让 agent 看到新工具):
分析一下 600519
用贝叶斯方法评估一下 300750 未来 5 天的上涨概率
带上历史回测看看 600519 的模型校准
可视化面板:侧边栏底部「📊 贝叶斯股票分析」快捷按钮 → 弹出居中的固定浮层,内含四个页签。
输入代码(600519 / sh600519 / 000001 / AAPL),点「贝叶斯分析」。未发起分析时该页显示算法说明空态(模型假设、融合公式与各信号方向校准说明)。报告含:综合判断(先验 → 后验 + 95% 区间 + 评分/评级)、多窗口对比、趋势三状态、EWMA / 经验 VaR 风险、信号证据明细与归因、近 60 日走势、技术面快照。
口径透明:同时给出「证据原始 log-odds 和」与「实际作用于先验的增量」(收缩前的量不等于实得变化);当信号仅使概率移动不足 1 个百分点时,明确提示结论主要由先验主导,而非分析失效。
可配置股票资源池、评分窗口(2/5/10/20 日)、每期持有交易日、同时持有个数、评分门槛区间、初始资金、回测区间、大盘择时规则(R1~R4)、筛选条件(排除 ST / 价格上下限 / 市值下限 / 排除次新股)、风控(个股止损 / 单只最大仓位 / 同板块最多持有数)与交易费用(佣金 + 印花税)。
historicalCap=0 可退回快照市值)用与回测完全相同的一套条件,但不做换仓模拟——只对基准日做一次截面评分并列表(基准日留空 = 行情最新交易日;非交易日自动回退并标记)。表头可点击排序;行首 ★/☆ 一键加入或移出自选(不影响整行跳转);点任意行跳到「单股分析」并自动分析。评分与回测共享同一份缓存文件。
核心是**「自选日至今涨跌幅」**,默认拉实时行情:
live=false 并显示 ⚠︎(tooltip 给原因);live=0 可整体回退到本地缓存(后复权)收盘价,离线可用watchlist.json,此后涨跌幅永远以它为起点;重复收藏只刷新名称,不重置锚点实时 N/M 只 @MM-DD HH:mm;表头筛选行支持 代码/拼音/名称 模糊搜索、自选日起止、盈亏状态、评分下限;「🔄 刷新」带 force=1 绕过 TTL| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /bayes-predict/analyze?symbol=&horizon= | 单股分析报告 |
| POST | /bayes-predict/backtest?pool=&horizon=&step=&topN=&threshold=&... | 策略回测(含低分 Top 对照与多窗口预热) |
| GET | /bayes-predict/screen?pool=&horizon=&date=&limit=&... | 单日截面选股 |
| GET | /bayes-predict/watchlist?horizon=&date=&live=&force= | 自选股报告;codesOnly=1 只取代码清单(轻量) |
| POST | /bayes-predict/watchlist/add|remove|clear?symbol= | 自选变更,一律 POST(GET 返回 405,防止预取/缓存把 GET 当副作用请求) |
| GET | /bayes-predict/pools | 资源池与标签(供面板动态渲染) |
| POST | /bayes-predict/refresh?pool= | 增量刷新行情缓存 |
lib/
├── index.js Host 端:bayes_stock_predict 工具 + 9 条 /bayes-predict/* 路由 + markdown 报告
├── bayes.js 贝叶斯核心:指标 / 双向信号 / 时间衰减四格表 LR / 卡尔曼增益融合(默认)/ 趋势 / EWMA-经验风险 / 多窗口 / walk-forward 回测
├── kalman.js 卡尔曼滤波:LLT 状态空间滤波 + 卡尔曼增益证据融合 + Katz 对数方差近似
├── backtest.js 参数化回测引擎(严格防前视)+ screenStocks() 单日截面选股(同一套条件与缓存)
├── backtest-data.js 回测数据提供层:缓存根、资源池、列式编解码、沪深300 成分、增量刷新
├── watchlist.js 自选股:watchlist.json 持久化 + 自选日/自选价锚点 + 实时收益 + 复用 screenStocks 评分
├── realtime.js 自选实时行情:批量报价(60 只/请求)+ 不复权日线 + liveAnchorStats 纯函数 + 短 TTL 缓存
├── pinyin.js 汉字 → 拼音首字母(GB2312 码段法,零依赖)+ 多音字变体展开
├── market.js 行情获取:代码归一化、腾讯 K 线(含复权断层检测)、腾讯/新浪实时、批量报价、指数日K、TTL 缓存
├── market-prior.json 全市场横截面先验(通用 LR 表,启动时自动加载)
├── csi300-components.json 沪深300 成分快照(无 universe.json 时的回退股票池)
└── client.js 浏览器端:React 面板(侧边栏入口 → 四个页签),SVG 自绘走势图/仪表/权益曲线
test/
├── kalman.test.mjs 卡尔曼数值单测(57 项:零噪声极限、无前视不变式、增益等价 T_eff=1/K、方差单调性)
├── smoke.mjs 插件冒烟(36 项:默认路径 / 回退路径 / 回测字段 / 报告结构)
├── pinyin.test.mjs 拼音首字母与多音字变体(38 项)
├── screen.test.mjs 选股筛选(129 项:条件与排序 / limit 截断 / 非交易日回退 / 缓存复用 / codes 子集,
│ 以及与 runBacktest 同一基准日候选集逐只一致的等价性)
├── watchlist.test.mjs 自选股(78 项:归一化 / 锚点语义与停牌回退 / 重复加入不重置锚点 / 持久化往返 / 评分复用)
├── realtime.test.mjs 实时口径纯函数(36 项)
├── routes.test.mjs Host 契约(假 ctx 收集注册结果:1 个工具 + 9 条路由的命名)
├── client-render.test.mjs 客户端 bundle 渲染(138 项:迷你 React + fetch 桩,跑通四页签交互链路与拼音搜索)
├── client-fixtures.json 上面用到的真实接口响应夹具(已裁剪)
└── normalize.test.mjs 代码归一化单测
logit(H) += K · Σ strength_i·log(LR_i);收缩强度由卡尔曼增益 K 决定(默认口径),fusion: "temperature" 可回退到固定 T=3 的旧口径market-prior.json 通用 LR 表,单股 LR 与之混合(w = n/(n+80))sampleWindow 日加权胜率 shrunk 到 0.5(强度 30),horizon 默认 5 日MODEL_VERSION:模型定义(信号集合 / LR 估计 / 融合口径 / 先验参数)变更时必须递增——评分缓存据此失效重建,避免新旧模型结果混用。当前为 2把潜在 log-odds 视为待估状态:先验给出 z ~ N(logit(prior), P⁻),证据给出一次含噪观测
y = Σ strength_k·log(LR_k),观测方差 R = Σ strength_k²·Var(log LR_k)·γ。于是
K = P⁻ / (P⁻ + R) ← 卡尔曼增益
z = logit(prior) + K·y
P = (1 − K)·P⁻ ← 后验方差(置信区间由它给出,不再是启发式 nEff)
等价收缩 T_eff = 1/K = 1 + R/P⁻
Var(log LR_k) 由四格表计数经 Katz 对数风险比近似给出,并乘上 shrink / 分层先验混合的雅可比修正:样本少的信号自动获得大方差、增益自动变小,不需要为「这个信号可不可信」再手调参数γ(kalmanObsInflate,默认 2)是证据相关性/过拟合的膨胀因子:技术信号彼此相关,独立假设会低估 R、高估证据精度P⁻ 由先验有效样本量经 delta 方法给出:Var(logit(p)) ≈ 1/(n·p(1−p))P(logit 正态近似),取代了原先没有概率意义的 nEff 启发式对对数价格建局部线性趋势模型(level 随机游走 + slope 慢变,观测噪声极小),一次 O(n) 前向递推给出滤波斜率 slope/√P_ss(t 值归一化)与标准化新息 v/√S,对应信号 kalman_slope / kalman_innov。
硬约束(均写进单测):
test/kalman.test.mjs 用「续接未来 K 线不改变历史滤波状态」的不变式守住这一点signalDirectionsAt 被 LR 估计/审计/回测按每根 K 线各调一次,递推放进信号函数会退化成 O(n²)A) 卡尔曼融合 vs 手调 T=3(无前视对比,Brier 越低越好)
| 口径 | 400 只 A 股 / 2.4 年(测试集) | 52 只沪深300 / 10 年(测试集) |
|---|---|---|
| priorOnly(只用先验、忽略证据) | 0.2547 | 0.2540 |
| 卡尔曼融合 γ=2(默认) | 0.2552 | 0.2542 |
| 卡尔曼融合 γ=6 | 0.2548 | 0.2540 |
| 手调 temperature=3(旧默认) | 0.2571 | 0.2551 |
| T=1(原始证据强度) | 0.2727 | 0.2638 |
配对差异(每只股票一个观测,负值 = 卡尔曼更好):γ=2 时 −0.0020 ±0.0001(89.0% 股票改善) 与 −0.0009 ±0.0001(90.9%),两个独立样本同向且都高度显著;γ∈[2,6] 内收益已趋平。
B) 卡尔曼信号的消融(默认关闭的依据)
| 检验 | ΔBrier | 改善率 |
|---|---|---|
加 kalman_slope / kalman_innov(T=1 口径) | +0.00026 ±0.00005 | 15.4% |
先移除 trend_recent / ma_align 再加(检验"是否只是冗余") | +0.00021 ±0.00006 | 19.2% |
两者都为正 ⇒ 不是与趋势类信号冗余,而是样本外没有边际价值。其原始信息量并不弱(十年池化审计:kalman_slope 分段 spread +6.33%/+14.40%/+8.24%,t 最高 5.87),但全量审计 ≠ 样本外有效——这正是 ROC(20) / streak / beta 被移除的同一条教训。
C) 必须一起看的负面结论
在合计 34.7 万个预测点上,本模型的 Brier 始终高于 priorOnly(最好配置也只到 −0.0001)。γ 越大越好、最终收敛到 priorOnly,本质是模型在自动学会「少信证据」。因此卡尔曼增益的价值应表述为:在不引入前视的前提下,把手调的固定收缩换成自适应收缩,稳住了过度自信(相对 T=1 改善 −0.0167,相对 T=3 改善 −0.0020 / −0.0009),而不是"带来了新的预测力"。
| 参数 | 默认 | 说明 |
|---|---|---|
fusion | "kalman" | 设 "temperature" 回退旧口径(T=3) |
kalmanObsInflate | 2 | 证据方差膨胀 γ;调大 → 更保守、更贴先验(γ→∞ 即退化为 priorOnly) |
kalmanSignals | false | 是否启用 kalman_slope / kalman_innov 两个新信号 |
kalmanSlopeT / kalmanInnovZ | 1.2 / 1.5 | 两个信号的触发阈值(t 值 / 标准化新息) |
kalmanSlopeDir / kalmanInnovDir | -1 / -1 | 方向(−1 反转)。不影响结论:LR 是双向的,会自动学到反向关系 |
报告与面板中的 calibration.fusion / kalmanGain / effectiveTemperature / priorVar / obsVar / stateVar 与顶层 kalman 快照(斜率 t、标准化新息 z、年化斜率)即为上述量的诊断出口。
免费、无需 key:
us 前缀(美股);批量报价一次最多 60 只⚠️ 数据口径:评分、回测与单股分析均使用后复权(hfq)——收益序列含分红再投资,除权日无假跳空,信号干净;但价格非真实股价。自选股页是唯一例外,它用真实价(不复权)口径,理由见上文。
⚠️ 腾讯 hfq 复权断层防护:腾讯后复权的复权基准随最新交易日滚动,接口返回的最后一天可能发生"跨基准断裂"(假跳变)。
fetchKlines已内置断层检测:hfq 最后一天 |单日涨跌| > 8% 时拉不复权序列核对,判定复权断层则丢弃最后一天(宁缺毋滥);refreshCache检测到缓存末尾断层时自动全量替换修复。
零第三方依赖,Node 18+。
npm test
依次运行 9 个测试文件:kalman(57) → smoke(36) → pinyin(38) → screen(129) → watchlist(78) → realtime(36) → routes(9 条路由契约) → client-render(138,迷你 React + fetch 桩跑通四页签交互) → normalize。CI(Node 20 / 22)在每次 push 与 PR 上执行同一套测试。
cordis.patch.yml 中 bayes-predict 的 insert 行node_modules\dsh-bayes-predictdsh webMIT © pg
⚠️ 本插件输出由贝叶斯统计模型基于历史行情生成,仅供参考,不构成投资建议。