基于 n8n + MySQL + Streamlit 的全栈实践

前言

作为一名价值投资者,我一直希望有一个工具能帮我自动计算个股在 3年、5年、10年 周期内的价格偏离度,从而量化判断当前的买卖点。

市面上的行情软件大多只看当下,缺乏基于长周期历史数据的策略分析。于是,我利用手头的 Oracle 服务器,配合 1Panel 面板,使用 n8n 做数据流自动化,MySQL 做存储,Streamlit 做可视化看板,历时数天,终于完成了 V1.0 版本的开发。

这篇文章将完整复盘整个系统的搭建过程、踩坑经验以及核心逻辑实现。


一、 系统架构设计

为了保证系统的轻量化和易维护性,我采用了纯 Docker 容器化的部署方案:

  • 基础设施:Oracle Server + 1Panel 运维面板

  • 数据源:AkShare (开源财经数据接口)

  • ETL 流程:n8n (工作流自动化)

  • 数据库:MySQL 8.0 (存储基础信息、日线、年度数据、策略结果)

  • 前端展示:Streamlit (Python 快速构建数据看板)


二、 核心数据流建设 (ETL)

1. 数据库设计

系统核心围绕四张表展开:

  • stock_basic: 基础表(代码、名称、行业、上市日期),作为全系统的白名单

  • stock_daily: 日线表(存每天的开高低收量额)。

  • stock_yearly: 年度表(存每年的最高价、最低价,用于计算长线策略)。

  • stock_strategy: 策略表(存 3/5/10 年的买卖点位、当前偏离度)。

2. n8n 工作流的进化

最开始,我只是简单地拉取 API 数据写入数据库,但很快遇到了脏数据问题。经过优化,最终的 ETL 逻辑采用了**“白名单清洗模式”**:

  1. Extract (抽取)

    • 线程 A:从 stock_basic 读取所有合规股票代码(白名单)。

    • 线程 B:从 AkShare 接口拉取全市场实时行情。

  2. Transform (清洗)

    • 代码比对:只保留在白名单中的股票,剔除指数、B股及退市股。

    • 时间修正:智能判断当前时间,若是凌晨执行则归档为昨日数据,若是盘后执行则归档为今日。

    • 脏数据过滤:剔除成交量为 0 或价格为空的无效数据。

  3. Load (加载)

    • 使用 INSERT ... ON DUPLICATE KEY UPDATE 确保数据幂等性,支持反复重跑。


三、 策略逻辑实现

这是系统的灵魂。为了避免“刚刚上市的新股因为数据少而被误判为严重低估”,我重新定义了计算逻辑:

  • 10年周期

    • 卖点:过去 10 个年度最高价中,从高到低取第 5 位。

    • 买点:过去 10 个年度最低价中,从低到高取第 5 位。

    • 低点:过去 10 年的绝对最低价。

    • 注:上市不足 10 年的数据置空,不参与排名。

  • 5年/3年周期:逻辑同上,分别取第 3 位和第 2 位。

  • 偏离度计算(现价 - 历史最低) / 历史最低

通过 Python 脚本 recalc_strategy.py,系统可以基于 stock_yearly 表自动计算出全市场 5000+ 只股票的所有关键点位,并更新到策略表中。


四、 前端看板开发 (Streamlit)

为了让数据不仅“有用”而且“好看”,我选择了 Streamlit。

1. 偏离度排行榜

  • 热力图:使用 Pandas Styler 对“偏离度”列进行背景着色。采用 RdYlGn_r 色阶,绿色代表负偏离(低估),红色代表正偏离(高估),一眼识别机会与风险。

  • 交互:支持按 3/5/10 年周期筛选,支持按“最被低估”或“最被高估”排序。

  • 一键直达:点击股票代码,可直接跳转东方财富详情页。

2. 个股深度分析页

  • 多周期 Tabs:将 3/5/10 年的数据分 Tab 展示,清晰对比长短线逻辑。

  • 嵌入式 K 线:利用 iframe 嵌入了东方财富的概念版行情页面。

  • 视觉黑科技:通过 CSS overflow: hiddentop: -160px 的技巧,裁剪掉了外部网页原本繁杂的顶部导航栏,只保留 K 线和盘口信息,实现了与看板的完美融合。


五、 数据治理与踩坑记录

在开发过程中,数据的准确性校验花费了最多时间:

  1. 退市股清理:发现排行榜上有很多早已退市的股票干扰视线。

    • 解决:编写 clean_delisted.py,级联删除 basic 表中无行业信息的股票及其关联数据。

  2. 新股补录:发现 stock_strategy 表比 stock_basic 少了 100 多只,原来是年内新股。

    • 解决:执行 SQL 补录新股,虽然它们暂时没有策略数据,但保证了能被搜到。

  3. 数量对齐:为了强迫症般的精准,我编写了 align_market.py,实时拉取交易所名录,将数据库与 5473 只(含停牌)A股完全对齐,不多一只,不少一只。

  4. 年终结算准备:编写了 year_end_settlement.py,用于在年底自动聚合当年日线生成年度数据,并刷新来年策略。


六、 总结与展望

至此,A 股价值偏离度策略看板 V1.0 正式完结。

它现在具备了:

✅ 全自动每日数据更新 (n8n)

✅ 全市场估值水位监测 (Streamlit 排行榜)

✅ 个股长线买卖点透视

✅ 完美的无头浏览器 K 线体验

接下来的计划

  • 引入“基本面数据” (PE/PB/ROE),结合技术偏离度做双重筛选。

  • 增加“通知推送”,当关注的个股触及买点时通过钉钉或微信通知。

如果你也有一台闲置服务器,不妨也动手试试,让数据为投资护航。


(本文技术栈:Python, SQL, Docker, Streamlit, n8n)