摘要:本文深度解析了一个基于 Vue3 + Node.js 的开源智能股票量化监控系统。从核心业务痛点出发,详细介绍了其系统架构设计、核心策略引擎实现、技术指标计算逻辑以及背后的高并发调度方案。通过实战代码分享,带你领略如何结合传统量化指标与前沿技术(并在未来融入 AI Agent),构建个人专属的自动化盯盘神器。
一、引言:为什么要造这个轮子?
在快节奏的交易市场中,“盯盘”是无数投资者最耗时且极度反人性的工作。市场瞬息万变,单凭人力很难同时跟踪几十只自选股的异动。市面上虽然有很多金融软件提供盯盘功能,但往往面临以下痛点:
- 定制化能力弱:无法根据个人的交易体系组合多种指标(如同时满足 MACD 金叉 + 突破回踩形态)。
- 通知渠道受限:不能自由灵活地接入钉钉、企业微信机器人等工作场景工具。
- 数据黑盒:作为技术博客,我更希望掌握底层的触发逻辑,做到心中有数。
基于以上痛点,我开源了 Smart Stock Quant Monitor(智能股票量化监控系统),由早期的一个简单 Node 脚本工具演化而来,现已全面升级为具备 Web 后端管理、MySQL 数据持久化、以及复杂策略轮询引擎的完整架构。
相关地址
- github地址:github.com/BarnettNeo/…
- 在线体验地址:http://182.254.182.170/screen
二、系统整体架构设计
系统的核心目标是:高效的数据抓取 -> 灵活的策略运算 -> 稳定的消息触达。
为了实现这个目标,项目采用了前后端分离的架构:
- 前端(admin):采用
Vue 3 + Vite + Element Plus,负责策略配置(异动阈值、目标价、指标开关)以及系统状态监控(触发日志分析)。 - 后端(server):采用
Node.js + Express + TypeScript,作为系统大脑,包含 REST API 服务、定时扫描调度器(Scheduler)、策略执行引擎以及推送分发模块。 - 存储层:选用
MySQL,用于统一存储用户策略、订阅配置及触发快照历史。
核心数据流转流程
使用 Mermaid 流程图表示策略运转的核心数据流:
flowchart TD
Config[策略与订阅配置管理] --> DB[(MySQL 数据库)]
DB --> Scheduler[定时调度器 Scheduler]
Scheduler --> Engine[策略引擎 Engine]
subgraph 策略引擎
Engine --> API[公开行情 API 批量获取]
API --> Price[价格与异动监控模块]
API --> KLine[K线数据获取]
KLine --> Indicators[技术指标计算 MACD/RSI/SMA]
KLine --> Pattern[K线形态识别]
end
Price -. 触发 .-> EventBus((触发事件))
Indicators -. 触发 .-> EventBus
Pattern -. 触发 .-> EventBus
EventBus --> Cooldown[防抖与冷却过滤]
Cooldown --> Notifier[消息路由 Notifier]
Notifier --> DingTalk[钉钉机器人]
Notifier --> WeCom[企业微信机器人]
Notifier --> LogDB[(触发日志入库)]
三、核心模块深度解析
1. 策略引擎(Engine)的实现
策略引擎是整个监控系统的心脏,其承担着对海量数据进行模式匹配的核心工作。在 engine.ts 中,我主要分为两大类监控机制:
a) 价格与异动监控
| 模式 | 描述 | 应用场景 |
|---|---|---|
| 百分比模式 (percent) | 基于 changePercent 绝对值监控 | 捕捉日内剧烈波动(如拉升打板或闪崩跳水) |
| 目标价模式 (target) | 设定上行和下行的绝对目标价 | 适用于网格交易或心理关键点位的破位/突破预警 |
b) 深度技术指标分析
我引入了强大的 technicalindicators 库来进行专业的量化指标计算。在引擎中,只需少量历史 K 线即可生成趋势快照:
// 核心指标计算代码片段 (engine.ts)
export async function calculateIndicatorSnapshot(code: string, currentPrice: number) {
const closes = await fetchHistoryCloses(code, '1'); // 获取历史收盘价
// 1. MACD 计算与趋势判断
const macdResult = MACD.calculate({ values: closes, fastPeriod: 12, slowPeriod: 26, signalPeriod: 9 });
const lastMacd = macdResult[macdResult.length - 1];
const prevMacd = macdResult[macdResult.length - 2];
let macdTrend = 'NEUTRAL';
if (lastMacd.MACD > lastMacd.signal && prevMacd.MACD <= prevMacd.signal) macdTrend = 'BULLISH'; // 金叉
// 2. RSI 超买超卖检测
const rsiResult = RSI.calculate({ values: closes, period: 14 });
const lastRsi = rsiResult[rsiResult.length - 1];
let rsiStatus = 'NEUTRAL';
if (lastRsi >= 70) rsiStatus = 'OVERBOUGHT';
else if (lastRsi <= 30) rsiStatus = 'OVERSOLD';
// 3. 均线多头排列检测
const ma5 = SMA.calculate({ values: closes, period: 5 }).pop() || 0;
const ma20 = SMA.calculate({ values: closes, period: 20 }).pop() || 0;
// ... 判断是否多头排列
}
2. 高并发异步调度器(Scheduler)
系统需要每隔 N 秒(默认15秒)对所有启用的策略进行一遍完整的扫码与预警。为此,我设计了一个基于内存轮询的 Scheduler:
// 扫描调度器 (scheduler.ts)
export async function scanOnce(): Promise<void> {
const allSubs = await query('SELECT * FROM subscriptions WHERE enabled = 1');
const strategies = await query('SELECT * FROM strategies WHERE enabled = 1');
for (const strategy of strategies) {
try {
// 执行单次策略匹配
const events = await runStrategyOnce(strategy);
for (const ev of events) {
// ... 根据订阅渠道构建 Markdown 模板
// ... 并行推送到钉钉 / 企业微信
// ... 落地 trigger_logs,提供复盘依据
}
} catch (e) {
console.error('scanOnce strategy error:', strategy.id, e);
}
}
}
关键设计考量:
- 频控与冷却(Cooldown):系统在内存中维护了
lastAlertSentAt映射,确保在cooldownMinutes冷却期内,相同股票的相同触发原因不会产生连环轰炸消息。 - 并发与限流:面对大量的策略运算,调度器采用异步无阻塞模式分发,并且对请求做了合理的聚合(如将多个股票代码拼接一次性调用行情 API)。
四、应用场景与实战案例
实战场景一:右侧交易捕捉器
配置:开启“MACD 金叉”与“均线多头排列”指标监控,结合“突破回踩”形态识别。 效果:系统会在股票刚刚走出底部震荡区间,各项均线开始发散,并且出现技术上的 MACD 放量金叉时,通过企业微信第一时间将行情快照推送到你的手机上。
实战场景二:波段网格助手
配置:启用“目标价触发模式”,分别设定阻力位和支撑位,设置 cooldownMinutes 为 60。
效果:当股票跌至支撑位时推送提示买入,反弹至阻力位时推送提示卖出。系统不会因为价格在目标位附近反复震荡而连续发送垃圾通知。
五、未来展望:全面拥抱 AI Agent
传统量化指标虽然精准,但往往存在“死板”和“伪信号”的缺陷。为了使系统真正达到“智能”级别,目前我在 main-agent 分支正在积极研发基于 LLM 的第二阶段架构。
未来系统将引入 AI Agent 核心引擎:
- 意图理解 (LLM大脑):通过对话式 UI 让大模型直接为我生成量化策略,而不是去管理后台填表。
- RAG 新闻知识库分析:结合外部爬取的新闻舆情,在触发价格报警时,Agent 自动调取向量数据库中的相关财报和新闻,生成“异动归因分析报告”并附带在推送消息中。
六、结语
借助 Node.js 极强的 I/O 吞吐能力与庞大的 npm 生态(如 technicalindicators),我可以用极其精简的代码实现一整套商业级的股票量化监控平台。这不仅极大地解放了注意力,更重要的是提供了一个可以将交易理念具象化为代码执行规则的绝佳沙盒。
代码已全量开源,欢迎各位clone二次开发、欢迎技术大佬指导,提供宝贵的建议!