New:Introducing Socket Scanning for VS Code Marketplace Extensions.Learn more →
Get Started

dsh-bayes-predict

Package Overview
Dependencies
Maintainers
1
Versions
2
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

dsh-bayes-predict

贝叶斯个股预测插件:卡尔曼增益融合的上涨概率估计、策略回测与全市场选股、自选股实时跟踪(A 股 + 美股)

latest
Source
npmnpm
Version
1.1.0
Version published
Weekly downloads
0
Maintainers
1
Weekly downloads
 
Created
Source

dsh-bayes-predict

CI License: MIT

基于 贝叶斯定理 的 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 可退回快照市值)
  • 三条对照曲线:策略·高分 Top / 策略·低分 Top(反向对照)/ 池基准(当期全部合格股票等权),三者差距即可检验「评分排序是否携带信息」
  • 评分缓存按「模型版本 × 模型参数指纹 × 逐股数据指纹」三维校验,参数变化时旧行全部作废、全新写入;数据追加时只补算缺失日期;跨池跨 step 的评分按 (code, date) 累积复用
  • 多 horizon 预热:一次运行同时评分并缓存 2/5/10/20 日(共享指标与信号计算,约 2~2.5 倍单窗口成本),之后切换窗口零等待

选股筛选

用与回测完全相同的一套条件,但不做换仓模拟——只对基准日做一次截面评分并列表(基准日留空 = 行情最新交易日;非交易日自动回退并标记)。表头可点击排序;行首 ★/☆ 一键加入或移出自选(不影响整行跳转);点任意行跳到「单股分析」并自动分析。评分与回测共享同一份缓存文件。

自选股

核心是**「自选日至今涨跌幅」**,默认拉实时行情:

  • 实时价 + 真实价口径(本页刻意与其余页签不同):自选价 = 自选日的不复权收盘,最新价 = 腾讯实时现价。实时接口只能拿到真实价,若把后复权锚点(茅台 ≈9200)与真实现价(≈1300)混算会得出 −84% 这类荒唐跌幅;且腾讯 hfq 日线盘中常不含当日 bar、新交易日可能跨复权基准断裂。故本页单独用真实价口径,与券商 App 显示一致
  • 降级路径清晰:拿不到报价的股票仍按不复权口径但标记 live=false 并显示 ⚠︎(tooltip 给原因);live=0 可整体回退到本地缓存(后复权)收盘价,离线可用
  • 锚点不漂移:加入时把「自选日 + 自选价」写进 watchlist.json,此后涨跌幅永远以它为起点;重复收藏只刷新名称,不重置锚点
  • 汇总行给出平均涨跌幅、盈亏只数、实时 N/M 只 @MM-DD HH:mm;表头筛选行支持 代码/拼音/名称 模糊搜索、自选日起止、盈亏状态、评分下限;「🔄 刷新」带 force=1 绕过 TTL

Host 接口

方法路径说明
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 的旧口径
  • 双向 LR:LR_bull = P(看多信号|涨)/P(看多信号|跌),LR_bear = P(看空信号|涨)/P(看空信号|跌);四格表统计 + 拉普拉斯平滑 + 向 1 的样本收缩(k=20)+ 单信号截断 [1/4, 4]
  • 信号方向实证校准(审计 → 方向修正 → 消融确认):
    • 方向正确保留:MACD 金叉/死叉、MACD 柱、近 5 日走势、影线形态、跳空、缠论背驰
    • 反转方向:价格 vs MA20(追高后回归)、量能(放量冲高回落/恐慌见底)
    • 弱信号弱化:RSI、均线排列、布林带、动量、ATR(强度打折)
  • 时间衰减:LR 与先验均按指数衰减加权(半衰期 200 交易日),近期样本权重更高
  • 波动率归一化:动量/近 5 日收益信号阈值按滚动 σ 自适应(|x| > 0.5·σ·√k),跨股票可比
  • 信号强度:每个信号输出 strength ∈ (0,1],弱信号(如 RSI 50 附近)贡献打折
  • 分层先验(默认启用):启动时加载 market-prior.json 通用 LR 表,单股 LR 与之混合(w = n/(n+80))
  • 先验:近 sampleWindow 日加权胜率 shrunk 到 0.5(强度 30),horizon 默认 5 日
  • 风险:EWMA σ(λ=0.94)为主,VaR/CVaR 以经验分位数为主输出、正态近似对照
  • MODEL_VERSION:模型定义(信号集合 / LR 估计 / 融合口径 / 先验参数)变更时必须递增——评分缓存据此失效重建,避免新旧模型结果混用。当前为 2

卡尔曼增益

融合层:卡尔曼增益替代手调 temperature(默认启用)

把潜在 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 启发式

信号层:LLT 状态空间滤波(默认关闭)

对对数价格建局部线性趋势模型(level 随机游走 + slope 慢变,观测噪声极小),一次 O(n) 前向递推给出滤波斜率 slope/√P_ss(t 值归一化)与标准化新息 v/√S,对应信号 kalman_slope / kalman_innov。

硬约束(均写进单测):

  • 只做前向滤波,绝不用 RTS 平滑——平滑器会用到未来观测,把前视泄漏进 LR 四格表
  • 滤波参数必须因果:观测噪声用滚动窗口估计;test/kalman.test.mjs 用「续接未来 K 线不改变历史滤波状态」的不变式守住这一点
  • 必须预计算:signalDirectionsAt 被 LR 估计/审计/回测按每根 K 线各调一次,递推放进信号函数会退化成 O(n²)

实证结论(为何是这样默认)

A) 卡尔曼融合 vs 手调 T=3(无前视对比,Brier 越低越好)

口径400 只 A 股 / 2.4 年(测试集)52 只沪深300 / 10 年(测试集)
priorOnly(只用先验、忽略证据)0.25470.2540
卡尔曼融合 γ=2(默认)0.25520.2542
卡尔曼融合 γ=60.25480.2540
手调 temperature=3(旧默认)0.25710.2551
T=1(原始证据强度)0.27270.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.0000515.4%
先移除 trend_recent / ma_align 再加(检验"是否只是冗余")+0.00021 ±0.0000619.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)
kalmanObsInflate2证据方差膨胀 γ;调大 → 更保守、更贴先验(γ→∞ 即退化为 priorOnly)
kalmanSignalsfalse是否启用 kalman_slope / kalman_innov 两个新信号
kalmanSlopeT / kalmanInnovZ1.2 / 1.5两个信号的触发阈值(t 值 / 标准化新息)
kalmanSlopeDir / kalmanInnovDir-1 / -1方向(−1 反转)。不影响结论:LR 是双向的,会自动学到反向关系

报告与面板中的 calibration.fusion / kalmanGain / effectiveTemperature / priorVar / obsVar / stateVar 与顶层 kalman 快照(斜率 t、标准化新息 z、年化斜率)即为上述量的诊断出口。

数据源

免费、无需 key:

  • A 股日 K:腾讯 fqkline 后复权 hfq(最多约 700 根 ≈2023-12 至今;主/备用域名自动切换规避限流),东财后复权兜底
  • 实时快照:腾讯(A 股)/ 腾讯 us 前缀(美股);批量报价一次最多 60 只
  • 指数:东财沪深300 日 K(供市场 beta 与池基准)
  • 美股日 K:新浪全历史
  • 内存 TTL 缓存 30 分钟(实时报价 60s / 不复权日线 5min)

⚠️ 数据口径:评分、回测与单股分析均使用后复权(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-predict
  • 重启 dsh web

许可证

MIT © pg

⚠️ 本插件输出由贝叶斯统计模型基于历史行情生成,仅供参考,不构成投资建议。

Keywords

dsh

FAQs

Package last updated on 20 Oct 2026

Related posts