📊 让K线图会"说话"的投资研究工具
从业多年,我在日常研究中反复遇到三个痛点:
- 看到"放量滞涨"等异常K线,但不知道那天发生了什么
- 读完公司公告和新闻,却难以与股价走势建立关联
- 代价:错过信号,或做出错误归因
- 一个投资主题,从"提出 → 质疑 → 验证 → 机构化"的完整演变,没有可视化记录
- 半年后回看,只记得"买了/卖了",忘了"为什么"
- 代价:相同的错误反复犯,认知无法沉淀
- 传统技术分析用固定阈值(如"成交量突破5日均线200%")
- 但茅台和创业板小票的波动率差10倍,怎么能用同一套规则?
- 代价:低波股天天报警,高波股永远沉默
MarketNarrative 的核心理念:把技术面异常和基本面事件关联起来,让市场叙事可视化、可追踪、可复盘。
传统做法用固定数值判断异常,忽略个股差异。我的做法是:
# 核心创新:基于历史波动率的自适应阈值
threshold = mean + 2 * std_dev # 每只股票独立计算
# 4种异常检测模式
✅ 价量齐升 (Price-Volume Surge) — 情绪共振信号
✅ 放量滞涨 (Volume Without Price) — 主力出货嫌疑
✅ 缩量上涨 (Price Without Volume) — 可能是假突破
✅ 暴跌检测 (Price Crash) — 基本面踩雷预警
价值:同样是"放量",茅台1.5倍可能就是异常,科创股3倍才算异常——系统自动判断。
投资的关键不是看单根K线,而是看"一段时间的叙事"。我设计了基于 ZIG 指标 + MA50 均线的趋势分割算法:
| 功能 | 说明 |
|---|---|
| 自动分割区间 | 用 ZIG 指标识别趋势转折点,把股价切成"上涨段 / 下跌段" |
| 区间统计 | 每段显示:持续天数、起止价格、涨跌幅 |
| 异常点关联 | 自动把检测到的异常点归入对应区间——"这段下跌期间,发生了3次放量滞涨" |
| 参数可调 | ZIG 阈值可调整(默认25%),适应不同风格的复盘需求 |
价值:看一眼就知道"这轮下跌跌了多久、跌了多少、期间发生了什么"。
核心交互是"拖拽标注":
- 在 K 线图上拖拽选择日期范围
- 输入事件(如"FDA批准新药"、"被做空报告狙击")
- 系统自动关联该事件与当日股价波动
跨周期同步:日K上的注释会自动映射到周K/月K,不用重复标注。
支持多市场的自由输入:
✅ A股: 600519、000858.SZ、茅台
✅ 港股: 00700.HK、腾讯
✅ 美股: TSLA、AAPL
✅ 纯数字自动推断: 600519 → 600519.SH
价值:不用记格式,怎么输入都能识别。
集成 Dify 工作流:
- 当创建空白注释时,可一键调用 AI 分析当日股价波动
- 返回结构化的买卖信号解读(而非"预测")
┌─────────────────────────────────────────────────────────┐
│ 前端层 (Vanilla JS) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ ECharts K线图 │ │ 注释编辑器 │ │ 异常标记器 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 应用层 (Flask API) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 异常检测引擎 │ │ 趋势区间分析 │ │ 注释同步系统 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 数据层 │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │PostgreSQL/SQLite │ │ Yahoo Finance API │ │
│ │ (注释存储) │ │ (实时行情) │ │
│ └──────────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────┘
技术选型理由:
- Flask:轻量快速,适合个人项目迭代
- Vanilla JS:零框架依赖,降低维护成本
- ECharts:金融图表事实标准
- Railway:一键部署,零运维
重要声明:这是我个人研究方法的演示版,用公开数据展示思路。不是预测工具,不是荐股系统。
场景:我关注的30只股票池,哪些最近出现了异常信号?
操作流程:
1. 批量查看关注池的K线
2. 系统自动标注异常点(价量齐升/放量滞涨等)
3. 点击异常点 → 看注释 → 判断是否值得深究
价值:从30只股票中,5分钟内锁定2-3个需要跟进的标的。
场景:某只股票涨了50%,但我不知道主线是什么、持续性如何。
操作流程:
1. 打开"趋势区间分析"
2. 看系统切分的上涨段/下跌段
3. 对照每段的异常事件 → 串成主线叙事
例如:"第1段涨(政策催化) → 第2段跌(业绩不及预期) → 第3段涨(新产品放量)"
价值:把"K线"翻译成"可理解的商业故事",判断主线是否延续。
场景:我在某个时点建仓,2个月后复盘:当时的判断对不对?
操作流程:
1. 在建仓日做注释:"看好XX业务放量"
2. 两个月后回看 → 对比股价走势
3. 判断:逻辑验证了?还是纯粹运气好?
价值:把投资决策变成可追溯的"实验记录",避免事后诸葛亮。
场景:某公司历史上出现过3次类似的"放量滞涨",分别发生了什么?
操作流程:
1. 搜索该公司的历史注释(按类型筛选:"放量滞涨")
2. 对比3次的后续走势和事件
3. 总结规律:"这家公司每次放量滞涨后,20天内必有负面公告"
价值:建立"公司特定的行为模式库",提高归因准确度。
- ❌ 不做预测:"明天涨还是跌?" — 不知道,也不该知道
- ❌ 不推荐买卖点:"什么时候买入?" — 这是人的判断,不是算法的活
- ❌ 不保证准确:"信号100%有效吗?" — 异常检测只是提示,不是结论
# 1. 克隆仓库
git clone https://github.com/MILKMILKKING/MarketNarrative.git
cd MarketNarrative
# 2. 创建虚拟环境
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 3. 安装依赖
pip install -r requirements.txt
# 4. 初始化数据库
python scripts/init_db.py
# 5. 启动应用
python app.py
# 6. 访问
open http://localhost:5001点击按钮部署到 Railway → 详见 docs/DEPLOYMENT.md
# Flask 密钥(必须)
SECRET_KEY=your-secret-key-here
# Basic Auth 密码(生产环境推荐)
APP_PASSWORD=your-secure-password
# 数据库 URL(可选,默认使用 SQLite)
DATABASE_URL=postgresql://user:pass@host:port/dbname
# Dify AI 集成(可选)
DIFY_API_TOKEN=your-dify-token这个项目源于我个人在投资研究中的真实痛点,用公开数据演示我的思考方式和解决问题的思路。
欢迎交流:📧 lyrikliu@icloud.com
MIT License - 详见 LICENSE
Made with ❤️ by lyrik | 如果觉得有用,请 ⭐ Star