系统概览
端口 8100
kuaixun-service
多源财经快讯推送服务。4 活跃数据源 (财联社/华尔街见闻/新浪/格隆汇),每分钟轮询,WebSocket 实时推送,四层去重。
端口 8000
findatahub-client
A 股行情数据查询服务。REST API + Python SDK + MCP Server 三种接入方式,直连清洗后数据库。
推荐路径:快讯推送用
/api/v2/news/live(单表,已去重),行情查询用 Python SDK Client.daily() 或 MCP get_daily_data。
快讯数据 API
Base URL: http://127.0.0.1:8100
V2 统一接口(推荐)
从 news_unified 单表读取已去重数据,性能优于 V1 的 12 分表 UNION。
| 方法 | 路径 | 参数 | 说明 |
|---|---|---|---|
| GET | /api/v2/news/live |
limit(1-200,50) offset(≥0) source start end tag importance |
分页实时快讯 |
| GET | /api/v2/news/search |
q(必填) limit(1-50,20) |
全文搜索 |
| GET | /api/v2/news/stats |
— | 统计概览 |
| GET | /api/v2/news/heat |
— | 重要性分布 |
| GET | /api/v2/news/tags |
limit(1-100,50) |
热门标签 |
| GET | /api/v2/news/summary |
date(YYYY-MM-DD) |
当日 AI 摘要 |
V2 响应字段 (news_unified)
id
BIGINT
统一记录 ID
title
VARCHAR(512)
快讯标题
content
TEXT
正文内容
summary
VARCHAR(256)
AI 摘要
source_list
JSON
多源信息
{"sources":[{"source","source_news_id","url"}]}source_count
INT
来源数量(≥2 即被多源交叉验证)
tags
JSON
AI 标签数组,跨源合并去重
importance
INT(0-5)
AI 重要性评分
published_at
DATETIME
发布时间
first_seen_at
DATETIME
首次采集时间
content_hash
CHAR(32)
MD5 精确指纹
simhash
BIGINT
64-bit SimHash 指纹
V1 兼容接口(无需鉴权)
| 方法 | 路径 | 参数 | 说明 |
|---|---|---|---|
| GET | /api/v1/news/live | limit offset source start end tag importance | 分页快讯 (UNION 分表) |
| GET | /api/v1/news/search | q limit | 全文搜索 (60 req/min) |
| GET | /api/v1/news/stats | — | 统计概览 |
| GET | /api/v1/news/tags | limit | 热门标签 |
| GET | /api/v1/news/heat | — | 热度分布 |
| POST | /api/v1/news/favorite | Body: {"source_code","news_id"} | 切换收藏 |
| GET | /api/v1/news/favorites | limit offset | 收藏列表 |
WebSocket 实时推送
连接: ws://127.0.0.1:8100/ws/live?key={API_KEY}
| 方向 | 消息 | 说明 |
|---|---|---|
| 服务端 → 客户端 | {"type":"new_news","inserted":N,"pushed":N} | 有新快讯入库 |
| 服务端 → 客户端 | {"type":"status","connections":N} | 当前连接数 |
| 客户端 → 服务端 | "ping" | 心跳 → 响应 "pong" |
鉴权:WebSocket 通过 URL query
?key= 参数鉴权,与 HTTP X-API-Key 共用同一密钥。前端通过 import.meta.env.VITE_WS_KEY 注入。
行情数据 API
Base URL: http://127.0.0.1:8000
REST API
| 方法 | 路径 | 参数 | 说明 |
|---|---|---|---|
| GET | /api/v1/daily/{ts_code} | start_date(必填) end_date fields(csv) with_returns limit(1-50000) | 单股票日线 OHLCV |
| POST | /api/v1/daily/batch | Body: {"ts_codes":[...],"start_date","end_date","fields":null} | 批量日线 |
| GET | /api/v1/tables | — | 列出所有数据表 |
| GET | /api/v1/tables/{name}/schema | — | 表结构 |
| GET | /api/v1/tables/{name}/meta | — | 表元数据 |
| GET | /api/v1/quality/{table_name} | — | 数据质量分 |
| GET | /api/v1/stats | — | 数据库统计 |
| GET | /api/v1/health | — | 健康检查 |
| GET | /api/v1/health/dashboard | source(tushare/akshare/sina) | 数据源健康仪表盘 |
| GET | /api/v1/health/history | hours(默认168) | 7天健康趋势 |
MCP 工具 (Stdio)
协议: MCP 2024-11-05 · 鉴权: MCP_TOKEN 环境变量 (可选)
| 工具名 | 必填参数 | 可选参数 | 说明 |
|---|---|---|---|
get_daily_data | ts_code | start_date end_date with_returns data_source limit | A 股日线 OHLCV |
get_weekly_data | ts_code | start_date end_date | A 股周线 |
get_monthly_data | ts_code | start_date end_date | A 股月线 |
get_financial_indicator | ts_code | start_date end_date limit | 财务指标 (ROE/ROA/EPS) |
search_stock | keyword | limit | 按名称/代码搜索股票 |
get_data_quality | — | table_name show_issues | 数据质量查询 |
get_stats | — | — | 数据库统计概览 |
Python SDK
# pip install findatahub-client (或本地 pip install -e .) from findatahub import Client client = Client(database="fin_data_clean") # A 股日线行情 df = client.daily("000001.SZ", start_date="20260101") print(df.columns) # ['ts_code','trade_date','open','high','low','close','pre_close','vol','amount','pct_chg'] # 批量查询 df = client.daily_batch( ["000001.SZ", "600519.SH"], start_date="20260101", end_date="20260801" ) # 周线/月线 df_w = client.weekly("000001.SZ", start_date="20250101") df_m = client.monthly("000001.SZ") # 财务指标 df = client.fina_indicator("000001.SZ", limit=10) # 搜索股票 df = client.search_stock("平安") # 数据质量 score = client.quality_score("stock_daily") stats = client.stats() # 各表行数 + 质量分 # 导出 path = client.export("stock_daily", fmt="csv") # → ~/Downloads/findatahub_stock_daily.csv
数据库表结构
快讯系统 (news_flash)
news_unified — 统一快讯整合表 (Silver 层)
所有活跃源的快讯经四层去重后写入此表。V2 API 直接从此表读取。
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
id | BIGINT | PK AI | 主键 |
content_hash | CHAR(32) | UNIQUE | MD5(title+前200字) — L1 精确去重 |
simhash | BIGINT UNSIGNED | INDEX | 64-bit SimHash — L2 近似去重 |
title | VARCHAR(512) | NOT NULL | 快讯标题 |
content | TEXT | 正文 | |
summary | VARCHAR(256) | AI 摘要 | |
source_list | JSON | NOT NULL | 多源信息数组 |
source_count | INT | 来源数 | |
tags | JSON | AI 标签 (跨源合并) | |
importance | INT | AI 评分 0-5 | |
published_at | DATETIME | 发布时间 | |
first_seen_at | DATETIME | 首次采集时间 | |
last_seen_at | DATETIME | 最近采集时间 |
快讯分表 (Bronze 层)
每个数据源一张分表,结构相同。活跃源: news_cls, news_wallstreetcn, news_sina, news_gelonghui, news_10jqka, news_hotlist
| 字段 | 类型 | 说明 |
|---|---|---|
id | BIGINT PK AI | 主键 |
source_news_id | VARCHAR(50) UNIQUE | 来源新闻 ID — L4 去重键 |
title | VARCHAR(500) | 标题 |
content | TEXT | 正文 |
tags | JSON | AI 标签 |
importance | INT DEFAULT 0 | AI 评分 |
url | VARCHAR(500) | 原文链接 |
published_at | BIGINT | 发布时间 (ms 时间戳) |
行情系统 (fin_data_clean)
stock_daily — A 股日线 (统一清洗 Schema)
TuShare + AKShare 双源合并清洗后的标准日线数据。
| 字段 | 类型 | 说明 |
|---|---|---|
ts_code | VARCHAR(16) PK | 股票代码 (TuShare 格式,如 000001.SZ) |
trade_date | VARCHAR(10) PK | 交易日 YYYYMMDD |
open | DOUBLE | 开盘价 |
high | DOUBLE | 最高价 |
low | DOUBLE | 最低价 |
close | DOUBLE | 收盘价 |
pre_close | DOUBLE | 昨收价 |
vol | DOUBLE | 成交量 (手) |
amount | DOUBLE | 成交额 (元) |
pct_chg | DOUBLE | 涨跌幅 (%) |
data_source | VARCHAR(16) | 来源: tushare / akshare / merged |
is_validated | TINYINT(1) | 是否通过双源交叉验证 |
raw dbs:
tushare_data (79 表) 和 akshare_data (31 表) 存原始采集数据,含 A 股日/周/月线、财务指标、资金流、指数、板块行情、宏观指标、基金、期货等。完整清单见 tables_registry.json。
使用示例
Curl — 获取最新快讯
# 最新 20 条 (V2) curl -s "http://127.0.0.1:8100/api/v2/news/live?limit=20" | python3 -m json.tool # 筛选高重要性快讯 curl -s "http://127.0.0.1:8100/api/v2/news/live?limit=20&importance=4" # 按来源筛选 curl -s "http://127.0.0.1:8100/api/v2/news/live?limit=20&source=cls" # 关键词搜索 curl -s "http://127.0.0.1:8100/api/v2/news/search?q=降准&limit=10" # 统计概览 curl -s "http://127.0.0.1:8100/api/v2/news/stats"
Curl — 查询行情数据
# 平安银行 2026 年日线 curl -s "http://127.0.0.1:8000/api/v1/daily/000001.SZ?start_date=20260101" | python3 -m json.tool # 批量查询 curl -s -X POST "http://127.0.0.1:8000/api/v1/daily/batch" \ -H "Content-Type: application/json" \ -d '{"ts_codes":["000001.SZ","600519.SH"],"start_date":"20260701","end_date":"20260801"}' # 数据质量 curl -s "http://127.0.0.1:8000/api/v1/quality/stock_daily" # 健康检查 curl -s "http://127.0.0.1:8000/api/v1/health"
Python — 快讯 + 行情联动
import httpx import pandas as pd # 1. 获取高重要性快讯 resp = httpx.get("http://127.0.0.1:8100/api/v2/news/live", params={"importance": 4, "limit": 50}) news = resp.json()["data"] print(f"高重要性快讯: {len(news)} 条") # 2. 从快讯中提取股票代码 import re codes = set() for n in news: found = re.findall(r'\b(\d{6}\.(?:SZ|SH))\b', n["title"]) codes.update(found) # 3. 批量查询这些股票的行情 if codes: resp2 = httpx.post("http://127.0.0.1:8000/api/v1/daily/batch", json={"ts_codes": list(codes), "start_date": "20260801"}) df = pd.DataFrame(resp2.json()["data"]) print(f"行情数据: {len(df)} 行") print(df[["ts_code", "close", "pct_chg"]].head())
JavaScript (前端) — WebSocket 实时推送
// 连接 WebSocket const wsKey = import.meta.env.VITE_WS_KEY || ''; const ws = new WebSocket(`ws://127.0.0.1:8100/ws/live?key=${encodeURIComponent(wsKey)}`); ws.onmessage = (e) => { const { type, inserted, pushed } = JSON.parse(e.data); if (type === 'new_news') { console.log(`新快讯: ${inserted} 条入库, ${pushed} 条推送`); // 拉取最新数据 fetch('/api/v2/news/live?limit=10').then(r => r.json()).then(render); } }; // 心跳保持 setInterval(() => ws.send('ping'), 30000);
数据管道流程
行情管道:TuShare / AKShare 双源采集 → Cleaner 清洗 → QualityGate 四级校验 → CrossValidator 交叉验证 →
fin_data_clean.stock_daily upsert。
鉴权体系
| 接口层 | 鉴权方式 | 适用场景 |
|---|---|---|
| 公开 API (v1/v2) | 无需鉴权 | 前端页面、公开查询 |
| 内部 API | X-API-Key Header | 采集器管线、内部服务间调用 |
| 外部 API | X-API-Key + .api_keys.json 验证 | 第三方客户端接入 |
| WebSocket | URL query ?key= | 浏览器实时推送 |
| MCP Server | MCP_TOKEN 环境变量 (可选) | AI Agent 工具调用 |
| 采集器控制 | 仅本地 (127.0.0.1) + X-API-Key | /api/v1/collector/* |
API_KEY 持久化:首次启动自动生成并保存至
~/Library/Application Support/findatahub/.api_key (chmod 600),重启后复用。可通过 API_KEY 环境变量覆盖。