@kamuira/stock-analyzer
A股/台股综合分析工具 — 技术面 + 估值 + 基本面 + 消息面 四维评分、批量排名、含成本的事件驱动回测、可解释的买卖建议
快速开始
这是一个 CLI 工具,需要全局安装或用 npx:
# 推荐:全局安装
npm install -g @kamuira/stock-analyzer
# 或者用 npx 直接跑(不安装)
npx @kamuira/stock-analyzer本地安装(
npm install @kamuira/stock-analyzer,不加-g)会出现command not found: stock-server,这是 npm 设计如此 —node_modules/.bin不在 PATH。包内已加preferGlobal: true,本地装会给警告。
三个命令
| 命令 | 作用 |
|---|---|
stock-server |
启动 Web 界面(自动打开浏览器,默认端口 3000) |
stock-analyze <code> |
CLI 单股分析,输出综合评分和买卖条件 |
stock-backtest <code> |
历史回测,验证策略在该股票上的真实表现 |
v1.3 关键改进
1. 四维综合评分(从纯技术 → 多维度)
除原有的技术面评分外,新增三个独立维度,各产出 0~100 分:
- 估值:PE/PB 历史分位(越便宜分越高)+ PEG + 行业,数据来自东方财富 F10
- 基本面:ROE、营收同比、扣非净利同比、毛利率、资产负债率(最新财报)
- 消息面:东方财富公告标题关键词初筛(减持/问询=利空,预增/回购/中标=利好),带上下文护栏(排除"股权激励回购"等伪利好),时间衰减加权
综合分 = 技术 / 估值 / 基本面 / 消息 四维等权平均,缺失维度按现有维度平均。三个新维度都是"当前快照",不参与回测(免费源无历史时点数据)。
2. 批量评分排名 + 买入候选筛选(Web)
- 批量排名:对一组股票按综合分排序,每只并列显示四维分 + 回测复利/最大回撤, 标记"回测攻守兼备"
- 买入候选:在排名基础上叠加硬性门槛(综合≥55 · 基本面≥45 · 估值≥40 · 消息面无明显利空 · 当前技术=买入侧 · 回测),只有全满足才入选,不足三只不硬凑
- 自定义股票池:输入框追加任意代码/中文名,自动并入默认清单,存本机
3. 回测加入交易成本 + 风险指标
- 每笔扣 佣金(万3)+ 印花税(0.05%,卖)+ 滑点(0.1%),单次往返约 0.31%(可配置);
--gross跑无成本对比 - 新增 复利累计收益、最大回撤、盈利因子(全部基于扣费后净收益)
4. 健壮性修复
- 服务仅绑定 127.0.0.1(不再暴露到局域网)
- 所有外部行情请求加 8 秒超时(上游卡住不再永久挂起)
- Web 端分析的 K 线下限从 30 提到 60,与 CLI 一致(避免 MA60/MACD 在数据不足时出错)
v1.2 关键改进
1. 回测验证的就是用户实际用的策略
之前回测内部用的是简化版评分(quickScore ≈ 80 行),实盘分析用的是真正的综合评分(analyzeStock ≈ 600 行)。回测给出的"胜率 X%"对实盘没有参考意义。
v1.1 起,所有评分逻辑统一在 scoring.js,回测和实盘共享同一份代码。这是这次升级最大的卖点。
2. 事件驱动回测,不再是"信号 → N 天后"
旧版回测:每日独立判断 → 信号会重复计数(连涨 10 天每天都触发 buy,统计为 10 次胜利) 新版回测:
- 信号去重(已持仓不重复入场)
- 止损/止盈/反向信号/超时 四种退出方式
- 大盘环境过滤(每个回测日重算上证趋势,与实盘一致)
- 返回每笔完整交易流水
3. 指标计算与同花顺/通达信对齐
- RSI 改为 Wilder 平滑(标准实现,与 TradingView 一致)
- ADX 改为 Wilder smoothing
- EMA 用 SMA 种子(替代
data[0]单点种子)
4. 跟踪止损(可选)
stock-backtest --trailing 启用 Chandelier Exit。注意:不是免费午餐(详见下方回测章节)。
功能特性
- 四维综合评分:技术面 + 估值(PE/PB 历史分位)+ 基本面(ROE/增速/负债)+ 消息面(公告关键词)
- 批量评分排名 + 买入候选筛选(Web):自定义股票池,按综合分排序,叠加硬性门槛筛出候选
- 15+ 技术指标综合评分(MA、MACD、RSI、KDJ、布林带、ADX、ATR、VWAP)
- 动态加权评分:趋势市加大 MA/MACD/ADX 权重,震荡市加大 RSI/KDJ/布林权重
- 多重信号确认:金叉/死叉需要量能 + 趋势方向确认,减少假信号
- 信号连续性判断:新鲜度衰减,区分新信号和已持续信号,避免追高杀低
- MACD/RSI 顶底背离检测(基于 ZigZag swing,而不是单日峰谷)
- 有效缺口分析(size > 0.5% 且当日量 > 1.5× 20日均 才计入)
- 斐波那契回撤位、动量衰竭检测
- 形态识别(缩量回踩、放量突破、假突破、锤子线、布林收窄突破等)
- 大盘环境过滤(获取上证趋势,弱势时降低做多权重)
- 基于实际支撑/压力位的风险收益比计算
- 可操作的买卖建议(具体价位、仓位比例、持仓周期)
- 含成本的事件驱动历史回测(佣金/印花税/滑点、复利收益、最大回撤、盈利因子、可选跟踪止损)
- 支持 A股 + 台股(估值/基本面/消息面仅 A 股)
- 端口自动重试 + 自动打开浏览器(仅监听 127.0.0.1)
使用方式
Web 界面
stock-server # 自动打开浏览器
node dev.js # 开发模式:文件变化自动重启启动后访问 http://127.0.0.1:3000(仅本机),端口被占用会自动 +1 重试。
Web 界面除单股分析外,还提供 「 批量评分排名」:
- 默认对内置自选股(27 只)跑四维综合评分,按综合分排序
- 顶部输入框可追加任意代码/中文名(自动并入默认池,存本机)
- 结果含 买入候选卡片(只列同时满足全部硬性条件的票)+ 完整排名表(四维分 + 回测复利)
- 点任意一行进入该股的完整四维详情(技术指标拆解 + 估值/基本面/消息面明细 + 回测)
CLI 分析
stock-analyze sz002049 # A股(带前缀)
stock-analyze 002049 # A股(纯数字,自动识别)
stock-analyze 2330 # 台股(4位数字)
stock-analyze 紫光国微 # 中文名搜索
stock-analyze zggw # 拼音缩写
stock-analyze all # 分析内置关注列表CLI 回测
stock-backtest sh603986 # 默认:TP1 止盈 + 反向信号退出
stock-backtest sh603986 --trailing # 启用跟踪止损(2.5×ATR)
stock-backtest sh603986 --trailing --trailing-atr=1.5
stock-backtest sh603986 --trailing --no-tp1 # 纯趋势跟随(只靠跟踪止损)
stock-backtest sh603986 --gross # 不计交易成本(与含成本版对比)
stock-backtest all # 回测全部关注列表输入格式
| 格式 | 示例 | 说明 |
|---|---|---|
| 6位数字 | 002049 |
自动识别A股(6开头=上海,其他=深圳) |
| sh/sz 前缀 | sz002049 |
明确指定A股 |
| 4位数字 | 2330 |
自动识别台股 |
| tw 前缀 | tw2330 |
明确指定台股 |
| 中文名 | 紫光国微 |
走腾讯智能搜索 |
| 拼音缩写 | zggw |
走腾讯智能搜索 |
技术指标
| 指标 | 用途 | 参数 |
|---|---|---|
| MA (5/10/20/60) | 趋势方向、支撑压力 | 多头/空头排列、金叉死叉 |
| MACD (12,26,9) | 趋势动能、买卖时机 | 金叉死叉、零轴位置、柱状线 |
| RSI (14) Wilder | 超买超卖 | <30超卖、>70超买 |
| KDJ (9,3,3) | 短期超买超卖 | J值极端、金叉死叉 |
| 布林带 (20,2) | 波动区间、变盘信号 | 触轨、带宽收窄 |
| ADX (14) Wilder | 趋势强度 | >25趋势市、<20震荡市 |
| ATR (14) | 波动率、仓位管理 | 止损距离、仓位建议 |
| VWAP (20) | 量价均衡位 | 支撑/压力参考 |
评分体系
信号分级
| 评分 | 信号 | 建议操作 |
|---|---|---|
| ≥ 10 | 强烈买入 | 积极建仓,持仓 5-10 天 |
| ≥ 5 | 建议买入 | 适量买入,持仓 3-5 天 |
| ≥ 1 | 谨慎买入 | 小仓位试探,持仓 1-3 天 |
| ≥ -4 | 观望 | 不操作,等待方向 |
| ≥ -9 | 建议卖出 | 减仓或观望 |
| < -9 | 强烈卖出 | 清仓回避 |
动态加权
根据 ADX 判断市场状态,自动切换权重:
- 趋势市 (ADX ≥ 25):加大 MA、MACD、ADX 权重,降低 RSI、KDJ
- 震荡市 (ADX < 20):加大 RSI、KDJ、布林权重,降低趋势指标
- 极度震荡 (ADX < 15):整体打 4 折(信号基本无效)
趋势一致性
短期(5日) + 中期(20日) + 长期(60日) 三方向一致 → +3 分;短中期矛盾 → 信号打 8 折。
大盘环境
自动获取上证指数 20 日趋势,弱势时降权 + 减分。
风险收益比
基于实际支撑/压力位计算(非机械 ATR 倍数):
止损位 = 最近的下方支撑(MA20 / 布林下轨 / 近20日低 / ATR兜底)
止盈位 = 上方有意义的压力(近20日高 / 布林上轨 / 斐波那契位)
风险收益比 = (止盈 - 当前) / (当前 - 止损)
≥ 2.0 标记"性价比高",< 1.0 标记"建议等回调"。
四维综合分(批量排名用)
技术面评分先标准化到 0100,与另外三个维度(各 0100)等权平均得到综合分:
| 维度 | 0~100 含义 | 说明 |
|---|---|---|
| 技术 | 评分标准化 | 择时,越高越偏多 |
| 估值 | 越便宜越高 | PE/PB 历史分位 + PEG |
| 基本面 | 越优质越高 | ROE/营收·利润增速/负债 |
| 消息 | 50 中性 | 公告关键词:利好 + / 利空 − |
买入候选门槛
排名页"买入候选"在综合分之上叠加硬性条件,全部满足才入选:
综合 ≥ 55 · 基本面 ≥ 45(不弱) · 估值 ≥ 40(不高估)
· 消息面无明显利空(≥ 40) · 当前技术 = 买入侧(评分 ≥ 1) · 回测 ⭐(攻守兼备)
= 盈利因子 ≥ 1.5 且 最大回撤 ≤ 25% 且 复利收益 > 0。不足三只不硬凑,零只时提示宁可空仓。
事件驱动回测
退出逻辑(优先级)
- 止损:当日 low ≤ 入场时计算的 stopLoss
- 止盈:当日 high ≥ 入场时计算的 takeProfit1(默认开启,可用
--no-tp1关闭) - 反向信号:持仓中再次评分,score ≤ -5(多头退出)
- 超时:超过 maxHoldDays(默认 30 天)
- 数据末尾:回测期结束强制平仓
--trailing 跟踪止损
启用 Chandelier Exit:stopLoss = max(原止损, peak − 2.5 × ATR),只上调不下调。
重要洞察:不是免费午餐。同一份策略,不同股票表现完全不同:
| 股票 | 默认 TP1 累计 | 纯跟踪止损累计 | 适合谁 |
|---|---|---|---|
| 兆易创新(ATR 6.5%) | +68.56% | +18.97% | 高波动股不要开 |
| 工业富联(中波动) | +84.95% | +56.61% | 中波动股也不建议 |
| 华能国际(低波动) | -0.31% | +5.43% | 低波动股开了救回 |
| 中国平安(蓝筹) | +17.53% | +29.65% | 蓝筹股开了加分 |
原因:跟踪距离 = 2.5 × ATR。ATR 大 → 回撤容忍 15%+ → 利润吐回;ATR 小 → 紧密跟踪 → 锁住利润。自己用 --trailing 跑一遍,看哪些股票适合。
交易成本与风险指标
每笔交易扣除成本后再统计(默认值,均为单边比例,可在 backtest() options 配置):
| 项目 | 默认 | 说明 |
|---|---|---|
| 佣金 | 0.03% | 万3,买卖各收 |
| 印花税 | 0.05% | 仅卖出收 |
| 滑点 | 0.1% | 模拟非理想成交,买卖各一次 |
| 单次往返 | ≈ 0.31% | 用 --gross 可关闭成本做对比 |
汇总统计(全部基于扣费后净收益):
- 胜率 / 平均净收益 / 等权累计
- 复利累计收益:满仓滚动净值增长(不再是简单相加)
- 最大回撤:复利净值从峰值到谷底的最大跌幅
- 盈利因子:净盈利总和 ÷ 净亏损总和(>1 才是正期望)
评级标准
| 评级 | 条件(净收益口径) |
|---|---|
| 优秀 | 胜率 ≥ 60% 且均收益 > 3% |
| 良好 | 胜率 ≥ 55% 且均收益 > 1.5% |
| 一般 | 胜率 ≥ 50% 或 均收益 > 0 |
| 较差 | 以上都不满足 |
当前局限
- 未模拟 A 股涨跌停(止损价落在跌停板内实盘卖不出)
- 估值/基本面/消息面为当前快照,不参与回测(免费源无历史时点数据)
- 消息面是公告关键词初筛,较粗,读不懂语义、不含新闻舆情/研报
- 单股回测,无多周期共振(日+周+月)
- 无信号日志/复盘(每次回测都重新算)
数据来源
| 数据 | A股 | 台股 |
|---|---|---|
| 实时行情 | 新浪财经 (hq.sinajs.cn) | TWSE MIS API |
| 历史K线 | 腾讯财经 (web.ifzq.gtimg.cn) | Yahoo Finance |
| 股票搜索 | 腾讯智能搜索 (smartbox.gtimg.cn) | — |
| 大盘指数 | 腾讯财经(上证 000001) | — |
| 估值(PE/PB分位) | 东方财富 F10 (datacenter.eastmoney.com) | — |
| 基本面(财务) | 东方财富 F10 主要指标 | — |
| 消息面(公告) | 东方财富公告 (np-anotice-stock.eastmoney.com) | — |
项目结构
├── indicators.js # 技术指标:SMA/EMA/MACD/RSI/KDJ/BOLL/ATR/ADX/ZigZag 等
├── scoring.js # 技术面评分逻辑(唯一来源,被 analyze/backtest/server 共享)
├── valuation.js # 估值维度(PE/PB 历史分位,东方财富)
├── fundamentals.js # 基本面维度(ROE/增速/负债,东方财富)
├── news.js # 消息面维度(公告关键词初筛 + 缓存)
├── http-util.js # 带超时的 JSON 拉取 + secid 转换
├── analyze.js # CLI 单股分析 + 数据获取(A股+台股)
├── backtest.js # 含成本的事件驱动回测引擎
├── server.js # Web 服务(分析/回测/排名 API + 静态文件)
├── dev.js # 开发模式(文件变化自动重启)
├── index.html # 前端页面
└── bin/ # CLI 入口
├── analyze.js
├── server.js
└── backtest.js
环境要求
- Node.js ≥ 14
- 无需任何第三方依赖(纯原生 Node.js)
- 需要网络(获取实时/历史数据)
更新日志
v1.3.0
- 四维综合评分:新增估值(
valuation.js)、基本面(fundamentals.js)、消息面(news.js)三个维度,综合分 = 技术/估值/基本面/消息 等权 - 批量评分排名 + 买入候选(Web):自定义股票池、四维分列、 回测攻守兼备、买入候选硬性门槛筛选、TOP 卡片
- 回测加入交易成本(佣金/印花税/滑点)+ 复利累计收益、最大回撤、盈利因子;新增
--gross - 单股详情页加入估值/基本面/消息面三维卡片 + 明细
- 新增 5 只 CLI 自选(新金路/春秋航空/中钨高新/华电国际/璞泰来)
- 健壮性:服务仅绑 127.0.0.1、外部请求 8s 超时、Web 分析 K 线下限 30→60
- 新增共享模块
http-util.js(带超时的 JSON 拉取)
v1.2.2
package.json加repository/homepage/bugs字段- 源码托管在 GitHub:https://github.com/guiwzh/stock-analyzer
v1.2.1
- 加
--trailing/--trailing-atr/--no-tp1三个回测参数 - Chandelier Exit 实现(跟踪止损 = peak − N × ATR)
- README 提供跨股票对比数据,说明跟踪止损在低 ATR 股上才发挥作用
v1.2.0
- 事件驱动回测:信号去重、止损止盈退出、反向信号退出、超时退出
- 回测加入历史大盘环境过滤(
getMarketEnvAtDate),与实盘一致 - 背离检测改用 ZigZag swing(替代单日峰谷,大幅减少假背离)
- 缺口检测加 size > 0.5% + 量 > 1.5× 20日均 过滤
- 回测 API 改成事件驱动版,返回完整交易流水
v1.1.0
- 抽取
indicators.js+scoring.js共享模块,消除三处重复评分代码 - 回测和实盘统一使用
scoring.js,回测验证的就是用户实际用的策略 - RSI 改 Wilder 平滑(与同花顺/TradingView 对齐)
- ADX 改 Wilder smoothing(标准 Welles Wilder 算法)
- EMA 用 SMA 种子(替代单点种子)
- 加
preferGlobal: true,本地装会给警告 - 总代码量减少 46%(3367 → 1825 行)
v1.0.3
- 修复 README 在 npm 页面不显示的问题
v1.0.2
- 修复 ADX 阈值逻辑 bug
- 修复 yesterdayClose 除零风险
- 修复前端 XSS 和 null guard
- 修复 localStorage 异常处理
v1.0.1
- 修复 bin 脚本路径
v1.0.0
- 初始发布
免责声明
本工具仅基于技术面指标进行分析,不构成任何投资建议。技术分析有其固有局限性,无法预测突发事件、政策变化、基本面恶化等因素。投资有风险,入市需谨慎。使用本工具产生的任何投资损失,作者不承担任何责任。
License
MIT