npm.io
1.4.1 • Published 3d agoCLI

@kamuira/stock-analyzer

Licence
MIT
Version
1.4.1
Deps
0
Size
227 kB
Vulns
0
Weekly
0

@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。不足三只不硬凑,零只时提示宁可空仓。

事件驱动回测

退出逻辑(优先级)
  1. 止损:当日 low ≤ 入场时计算的 stopLoss
  2. 止盈:当日 high ≥ 入场时计算的 takeProfit1(默认开启,可用 --no-tp1 关闭)
  3. 反向信号:持仓中再次评分,score ≤ -5(多头退出)
  4. 超时:超过 maxHoldDays(默认 30 天)
  5. 数据末尾:回测期结束强制平仓
--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
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

Keywords