Skip to content

MarketNarrative - 市场叙事追踪系统 | Visual investment research tool for tracking market narratives with annotated charts & anomaly detection

License

Notifications You must be signed in to change notification settings

MILKMILKKING/MarketNarrative

Repository files navigation

MarketNarrative - 市场叙事追踪系统

📊 让K线图会"说话"的投资研究工具

🎯 为什么做这个项目?

从业多年,我在日常研究中反复遇到三个痛点:

痛点 1:技术面和基本面的割裂

  • 看到"放量滞涨"等异常K线,但不知道那天发生了什么
  • 读完公司公告和新闻,却难以与股价走势建立关联
  • 代价:错过信号,或做出错误归因

痛点 2:投资逻辑难以复盘

  • 一个投资主题,从"提出 → 质疑 → 验证 → 机构化"的完整演变,没有可视化记录
  • 半年后回看,只记得"买了/卖了",忘了"为什么"
  • 代价:相同的错误反复犯,认知无法沉淀

痛点 3:技术指标的"一刀切"问题

  • 传统技术分析用固定阈值(如"成交量突破5日均线200%")
  • 但茅台和创业板小票的波动率差10倍,怎么能用同一套规则?
  • 代价:低波股天天报警,高波股永远沉默

MarketNarrative 的核心理念:把技术面异常和基本面事件关联起来,让市场叙事可视化、可追踪、可复盘。


💡 我是如何解决的?

1. 自适应异常检测:从"固定阈值"到"动态基线"

传统做法用固定数值判断异常,忽略个股差异。我的做法是:

# 核心创新:基于历史波动率的自适应阈值
threshold = mean + 2 * std_dev  # 每只股票独立计算

# 4种异常检测模式
✅ 价量齐升 (Price-Volume Surge)    — 情绪共振信号
✅ 放量滞涨 (Volume Without Price)  — 主力出货嫌疑
✅ 缩量上涨 (Price Without Volume)  — 可能是假突破
✅ 暴跌检测 (Price Crash)           — 基本面踩雷预警

价值:同样是"放量",茅台1.5倍可能就是异常,科创股3倍才算异常——系统自动判断。

2. 趋势区间分析:把K线切成"故事段落"

投资的关键不是看单根K线,而是看"一段时间的叙事"。我设计了基于 ZIG 指标 + MA50 均线的趋势分割算法:

功能 说明
自动分割区间 用 ZIG 指标识别趋势转折点,把股价切成"上涨段 / 下跌段"
区间统计 每段显示:持续天数、起止价格、涨跌幅
异常点关联 自动把检测到的异常点归入对应区间——"这段下跌期间,发生了3次放量滞涨"
参数可调 ZIG 阈值可调整(默认25%),适应不同风格的复盘需求

价值:看一眼就知道"这轮下跌跌了多久、跌了多少、期间发生了什么"。

3. 事件-股价关联系统:拖拽式注释

核心交互是"拖拽标注":

  • 在 K 线图上拖拽选择日期范围
  • 输入事件(如"FDA批准新药"、"被做空报告狙击")
  • 系统自动关联该事件与当日股价波动

跨周期同步:日K上的注释会自动映射到周K/月K,不用重复标注。

4. 股票代码智能识别

支持多市场的自由输入:

✅ A股: 600519、000858.SZ、茅台
✅ 港股: 00700.HK、腾讯
✅ 美股: TSLA、AAPL
✅ 纯数字自动推断: 600519 → 600519.SH

价值:不用记格式,怎么输入都能识别。

5. AI 辅助分析(可选)

集成 Dify 工作流:

  • 当创建空白注释时,可一键调用 AI 分析当日股价波动
  • 返回结构化的买卖信号解读(而非"预测")

image image image

🏗️ 技术架构

┌─────────────────────────────────────────────────────────┐
│                    前端层 (Vanilla JS)                    │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  │
│  │ ECharts K线图 │  │  注释编辑器   │  │  异常标记器   │  │
│  └──────────────┘  └──────────────┘  └──────────────┘  │
└─────────────────────────────────────────────────────────┘
                            │
                            ▼
┌─────────────────────────────────────────────────────────┐
│                   应用层 (Flask API)                      │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  │
│  │ 异常检测引擎  │  │ 趋势区间分析  │  │ 注释同步系统  │  │
│  └──────────────┘  └──────────────┘  └──────────────┘  │
└─────────────────────────────────────────────────────────┘
                            │
                            ▼
┌─────────────────────────────────────────────────────────┐
│                      数据层                              │
│  ┌──────────────────┐      ┌──────────────────┐         │
│  │PostgreSQL/SQLite │      │ Yahoo Finance API │         │
│  │  (注释存储)       │      │   (实时行情)       │         │
│  └──────────────────┘      └──────────────────┘         │
└─────────────────────────────────────────────────────────┘

技术选型理由

  • Flask:轻量快速,适合个人项目迭代
  • Vanilla JS:零框架依赖,降低维护成本
  • ECharts:金融图表事实标准
  • Railway:一键部署,零运维

📖 我是怎么用这个工具的?

重要声明:这是我个人研究方法的演示版,用公开数据展示思路。不是预测工具,不是荐股系统。

✅ 完整的研究工作流

1. 股价异动筛查 → 快速定位"值得研究的标的"

场景:我关注的30只股票池,哪些最近出现了异常信号?

操作流程:
1. 批量查看关注池的K线
2. 系统自动标注异常点(价量齐升/放量滞涨等)
3. 点击异常点 → 看注释 → 判断是否值得深究

价值:从30只股票中,5分钟内锁定2-3个需要跟进的标的。


2. 趋势区间复盘 → 理解"这轮行情的主线演变"

场景:某只股票涨了50%,但我不知道主线是什么、持续性如何。

操作流程:
1. 打开"趋势区间分析"
2. 看系统切分的上涨段/下跌段
3. 对照每段的异常事件 → 串成主线叙事
   例如:"第1段涨(政策催化) → 第2段跌(业绩不及预期) → 第3段涨(新产品放量)"

价值:把"K线"翻译成"可理解的商业故事",判断主线是否延续。


3. 事件-股价关联 → 验证投资逻辑

场景:我在某个时点建仓,2个月后复盘:当时的判断对不对?

操作流程:
1. 在建仓日做注释:"看好XX业务放量"
2. 两个月后回看 → 对比股价走势
3. 判断:逻辑验证了?还是纯粹运气好?

价值:把投资决策变成可追溯的"实验记录",避免事后诸葛亮。


4. 区间对比 → 发现"重复的模式"

场景:某公司历史上出现过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 一键部署

点击按钮部署到 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

About

MarketNarrative - 市场叙事追踪系统 | Visual investment research tool for tracking market narratives with annotated charts & anomaly detection

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •