File size: 15,733 Bytes
08a98de
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b2ca3f2
 
 
 
 
08a98de
 
b2ca3f2
 
 
 
 
 
08a98de
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b2ca3f2
 
08a98de
 
 
b2ca3f2
 
08a98de
 
 
 
 
 
b2ca3f2
 
 
08a98de
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b2ca3f2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
---

title: Stock Data API
sdk: docker
app_port: 7860
pinned: false
---


# 股票数据 API 服务

这个目录是从现有板块轮动、短线交易、龙头股分析技能中抽出来的统一数据服务骨架。

它适合部署到 Hugging Face Docker Space,对外提供统一 HTTP API,并用外部数据库缓存 AKShare、东方财富、同花顺、财联社等在线数据源返回的数据。

## 本地启动

```powershell

cd D:\Andy\coding\gupiao_data\stock_data_api_service

python -m uvicorn app.main:app --host 127.0.0.1 --port 7860

```

打开:

- `http://127.0.0.1:7860/health`
- `http://127.0.0.1:7860/docs`
- `http://127.0.0.1:7860/api/v1/catalog`

## Hugging Face 部署

1. 创建一个新的 Hugging Face Space。
2. SDK 选择 `Docker`3. 把本目录内容作为 Space 根目录提交。
4. 配置 Secrets:

| Secret | 说明 |
|---|---|
| `DATABASE_URL` | 外部 MySQL 连接串,例如 `mysql+pymysql://user:password@host:3306/dbname?charset=utf8mb4` |
| `DATABASE_SSL` | 可选,云 MySQL 要求 SSL 时设为 `true` |
| `STOCK_DATA_API_KEY` | 可选。配置后请求必须带 `X-API-Key``Authorization: Bearer ...` |
| `CACHE_ENABLED` | 可选,默认 `true` |
| `CACHE_TABLE_NAME` | 可选,默认 `api_cache`;复用已有数据库时建议改成独立表名 |
| `SOURCE_TIMEOUT_SECONDS` | 可选,默认 `15` |
| `SOURCE_RETRY_ATTEMPTS` | 可选,默认 `1`;关键接口可在代码中单独设为 `2` |
| `SOURCE_RETRY_BACKOFF_SECONDS` | 可选,默认 `0.5` |
| `SUPPRESS_SOURCE_OUTPUT` | 可选,默认 `true`,压制 AKShare 进度条等控制台输出 |

Hugging Face Docker Space 默认服务端口用 `7860`,本 Dockerfile 已经按这个端口启动。

## 主要接口

所有业务接口默认在 `/api/v1` 下:

| 接口 | 说明 | 默认缓存 |
|---|---|---|
| `GET /stocks/{code}/quote` | 个股最新行情 | 5 分钟 |
| `GET /stocks/{code}/daily?days=60` | 个股日 K | 200 天 |
| `GET /stocks/{code}/technical?days=120&history_days=10` | 技术指标 | 6 小时 |
| `GET /stocks/{code}/chip` | 筹码分布(精算版 CYQ,换手率衰减模型) | 1 天 |
| `GET /stocks/{code}/chip-simple?lookback_days=60` | 筹码估算(简化版,成交量加权) | 1 天 |
| `GET /stocks/{code}/fund-flow?days=10` | 个股资金流 | 1 小时 |
| `GET /stocks/{code}/margin?days=30` | 个股融资融券 | 4 小时 |
| `GET /stocks/{code}/shareholders?limit=12` | 股东户数历史 | 12 小时 |
| `GET /stocks/{code}/shareholder-top` | 前十大股东 | 12 小时 |
| `GET /fund-flow/rank?indicator=5日` | 个股资金排名 | 30 分钟 |
| `GET /market/limit-up` | 涨停池 | 10 分钟 |
| `GET /market/limit-down` | 跌停池 | 10 分钟 |
| `GET /market/breadth` | 市场宽度 | 30 分钟 |
| `GET /market/temperature` | 市场温度 | 15 分钟 |
| `GET /market/margin?limit=50` | 全市场融资融券汇总 | 4 小时 |
| `GET /market/northbound?days=30` | 北向资金历史日线 | 1 小时 |
| `GET /market/northbound/realtime` | 北向资金实时分钟 | 2 分钟 |
| `GET /market/northbound/holdings?stock_code=600519` | 北向资金持股明细 | 30 分钟 |
| `GET /market/shenwan-industry?limit=31` | 申万一级行业(含PE/PB分位) | 15 分钟 |
| `GET /market/fund-holdings?date=20260331` | 基金重仓股 | 4 小时 |
| `GET /market/fund-structure` | 基金持仓结构 | 12 小时 |
| `GET /boards/concepts/flow` | 概念板块资金 | 30 分钟 |
| `GET /boards/industries/flow` | 行业板块资金 | 30 分钟 |
| `GET /news/global` | 全市场财经新闻 | 1 小时 |
| `GET /stocks/{code}/news` | 个股新闻 | 1 小时 |
| `GET /stocks/{code}/notices` | 个股公告 | 6 小时 |
| `GET /stocks/{code}/financial?kind=abstract` | 财务摘要 / 指标 / 预告 / 快报 | 2 天 |
| `GET /stocks/{code}/income?kind=ytd` | 利润表(年初至今 / 单季) | 2 天 |
| `GET /stocks/{code}/balancesheet?limit=10` | 资产负债表(总资产、负债、权益等) | 2 天 |
| `GET /stocks/{code}/cashflow?kind=ytd` | 现金流量表(年初至今 / 单季) | 2 天 |
| `GET /stocks/{code}/dividends?kind=main` | 分红与配股方案 | 2 天 |
| `GET /stocks/{code}/equity-history` | 股本变动历史 | 2 天 |
| `GET /stocks/{code}/freeholders` | 十大流通股东 | 2 天 |
| `GET /stocks/{code}/daily-basic?days=30` | 每日基础指标(PE、PB、PS、市值、换手率) | 6 小时 |
| `GET /etfs/premium?sort=abs` | ETF 折溢价率列表 | 30 分钟 |
| `GET /etfs/{code}/premium` | 单只 ETF 折溢价率 | 5 分钟 |
| `GET /hk/stocks/{code}/short-selling` | 港股沽空记录(日度序列) | 6 小时 |
| `GET /market/trade-calendar` | A 股交易日历 | 1 天 |
| `GET /macro/china/{indicator}` | 中国宏观数据 | 2 天 |
| `GET /macro/chinabond/yield-curve` | 中债国债收益率曲线 | 1 天 |
| `GET /us/indices` | 美股三大指数(道指/纳指/标普) | 2 分钟 |
| `GET /us/sectors` | 美股行业/主题 ETF 映射(A 股映射) | 15 分钟 |
| `GET /us/market-summary` | 隔夜美股盘面摘要(策略语气+指引) | 5 分钟 |
| `GET /us/stocks/{symbol}/quote` | 美股个股报价(AAPL、^DJI 等) | 2 分钟 |
| `GET /us/stocks/{symbol}/daily` | 美股个股日 K | 6 小时 |
| `GET /social/x/timeline` | X/Twitter 关注账号时间线 | 5 分钟 |
| `POST /search` | LLM 金融搜索(Grok/OpenAI 兼容) | 1 小时 |
| `GET /search?q=...` | LLM 金融搜索(简易 GET) | 1 小时 |
| `POST /ai-search-hub/search` | 多平台 AI 聚合搜索 | 30 分钟 |
| `GET /ai-search-hub/search?q=...` | 多平台 AI 聚合搜索(简易 GET) | 30 分钟 |
| `GET /ai-search-hub/sites` | 查看可用搜索平台 | — |

股票类 `code` 支持 `600519``600519.SH``sh600519``000001.SZ` 等格式。ETF / 基金代码不要走 `/stocks/...`,应使用 `/etfs/...``/funds/...`;否则会返回 `400 invalid_symbol`## 返回格式

```json

{

  "ok": true,

  "data": {},

  "meta": {

    "endpoint": "stock_quote",

    "source": "akshare.stock_zh_a_spot_em",

    "generated_at": "2026-06-06T09:20:00+00:00",

    "cache": {

      "hit": false,

      "stale": false,

      "key": "stock_quote:...",

      "ttl_seconds": 300

    },

    "attempts": []

  }

}

```

如果实时数据源全部失败,但数据库里有过期缓存,会返回 `cache.stale=true`。这能让上层应用选择“展示旧数据并提示”或“直接失败”。

## 已纳入的数据来源

| 数据类型 | 主来源 | 备用来源 |
|---|---|---|
| 个股实时行情 | `sina.hq.realtime` | `eastmoney.push2.stock.quote` / `tencent.qt.quote` / `akshare.stock_zh_a_spot_em` / `stock_zh_a_hist` / `stock_zh_a_daily` / `yahoo.chart.quote` |
| 个股历史 K 线 | `yahoo.chart.daily` / `eastmoney.push2his.stock_kline` | `tencent.ifzq.fqkline` / `stock_zh_a_hist.eastmoney` / `stock_zh_a_daily.sina` / `baostock.query_history_k_data_plus` |
| 个股资金流 | `stock_individual_fund_flow` | `eastmoney.push2his.stock_fflow` |
| 个股资金排名 | `eastmoney.push2delay.stock_fund_flow_rank` | `eastmoney.push2.stock_fund_flow_rank` / `stock_individual_fund_flow_rank` / `stock_main_fund_flow` / `ths.stock_fund_flow_individual` |
| 涨跌停池 | `stock_zt_pool_em` / `stock_zt_pool_dtgc_em` | `ths.limit_up_pool.direct` / 过期缓存兜底 |
| 概念板块 | `eastmoney.push2delay.board_flow.concept` | `eastmoney.push2.board_flow.concept` / `stock_fund_flow_concept` / `stock_board_concept_name_em` |
| 行业板块 | `eastmoney.push2delay.board_flow.industry` | `eastmoney.push2.board_flow.industry` / `stock_fund_flow_industry` / `stock_board_industry_name_em` |
| Legacy 板块龙头/埋伏/频率文本 | `eastmoney.push2delay.board_flow.combined.legacy` | `eastmoney.push2delay.board_flow.concept/industry` / `stock_fund_flow_concept` / `stock_fund_flow_industry` |
| 市场宽度 | `stock_board_industry_summary_ths` | `stock_zh_a_spot_em` |
| 新闻 | `stock_info_global_cls` / `stock_news_em` | `stock_info_global_em` / `stock_info_global_sina` / `stock_info_global_futu` / `stock_info_global_ths` / 过期缓存兜底 |
| 公告 | `stock_notice_report` | 过期缓存兜底 |
| 财务 | `stock_financial_abstract_ths` / `stock_financial_analysis_indicator` / `stock_financial_analysis_indicator_em` / `stock_yjyg_em` / `stock_yjkb_em` | `eastmoney.f10.*` / 过期缓存兜底 |
| F10 细分表 | `eastmoney.f10.income/cashflow/balance/dividend/equity/freeholders` | `akshare.stock_balance_sheet_by_report_em` / `akshare.stock_main_stock_holder` |
| 宏观 | Jin10 中国宏观直连 / AKShare 中国宏观系列接口 | `chinabond.government_bond.history_query` / 过期缓存兜底 |
| ETF 折溢价率 | `eastmoney.push2delay.etf_premium` | `eastmoney.push2.etf_premium` / `akshare.fund_etf_spot_em` |
| 港股沽空记录 | `eastmoney.hk.sellshort.html` | 过期缓存兜底 |
| 融资融券 | `eastmoney.push2his.stock_rrg` | `akshare.stock_margin_detail_sse` / `akshare.stock_margin_detail_szse` |
| 北向资金 | `akshare.stock_hsgt_hist_em` | `eastmoney.push2his.kamt_kline` |
| 股东户数 | `akshare.stock_zh_a_gdhs_detail_em` | `eastmoney.datacenter.freeholdersnum` |
| 前十大股东 | `akshare.stock_main_stock_holder` | `eastmoney.f10.freeholders` |
| A 股交易日历 | `akshare.tool_trade_date_hist_sina` | 过期缓存兜底 |
| 申万行业 | `eastmoney.push2.sw_industry` | `akshare.index_realtime_sw` |
| 基金重仓股 | `akshare.fund_report_stock_cninfo` | `eastmoney.datacenter.rpt_fund_main_position` |
| 基金持仓结构 | `akshare.fund_hold_structure_em` | `scrapling.eastmoney.fund_structure` |

## AI-Search-Hub 多平台搜索

集成 [AI-Search-Hub](https://github.com/minsight-ai-info/AI-Search-Hub),可同时查询多个 AI 平台获取不同数据生态的搜索结果:

| 平台 | 数据生态 |
|---|---|
| Gemini | Google Search、全球网页 |
| Grok | X/Twitter 实时搜索、社交趋势 |
| 豆包 | 抖音、头条、中文热点 |
| 元宝 | 微信公众号、微信生态 |
| LongCat | 中文知识、本地生活、大众点评 |
| 通义千问 | 中文网页搜索、淘宝数据 |
| MiniMax | 中文问答、B站 |
| Kimi | 长文档、研究资料 |

### 前置条件

1. 克隆 AI-Search-Hub 仓库:
   ```bash

   git clone https://github.com/minsight-ai-info/AI-Search-Hub ~/AI-Search-Hub

   cd ~/AI-Search-Hub && pip install -r requirements.txt

   ```
2. 安装 Playwright 浏览器驱动:`playwright install chromium`
3. 在目标 AI 平台提前登录(首次使用需要手动登录保存 Cookie)

### 环境变量

| 变量 | 说明 | 默认值 |
|---|---|---|
| `AI_SEARCH_HUB_REPO_PATH` | AI-Search-Hub 仓库路径 | 自动检测 `~/AI-Search-Hub` |
| `AI_SEARCH_HUB_TIMEOUT` | 单平台超时秒数 | `120` |
| `AI_SEARCH_HUB_DEFAULT_SITES` | 默认搜索平台(逗号分隔) | `gemini,grok,doubao` |
| `AI_SEARCH_HUB_HEADLESS` | 是否无头模式运行 | `false` |
| `AI_SEARCH_HUB_MAX_CONCURRENT` | 最大并发平台数 | `3` |

### 调用示例

```bash

# 查询所有默认平台

curl -X POST http://127.0.0.1:7860/api/v1/ai-search-hub/search \

  -H "Content-Type: application/json" \

  -d '{"query": "贵州茅台最近有什么重大新闻", "sites": ["grok", "doubao", "yuanbao"]}'



# GET 方式

curl "http://127.0.0.1:7860/api/v1/ai-search-hub/search?q=A股市场情绪分析&sites=grok,gemini"



# 查看可用平台

curl http://127.0.0.1:7860/api/v1/ai-search-hub/sites

```

## 免费 MySQL 建议

Hugging Face 免费 Space 会睡眠,本地文件缓存不可靠,建议使用外部 MySQL。可以用支持公网连接的免费或低价云 MySQL / PlanetScale 兼容 MySQL 服务 / Aiven MySQL 试用实例等。

数据库只需要一个表 `api_cache`,服务启动时会自动创建。MySQL 用户需要 `CREATE TABLE``SELECT``INSERT``DELETE` 权限。

## 后续迁移技能

原技能脚本已经接入远程优先模式:

- 设置 `STOCK_DATA_API_BASE_URL` 后,脚本优先请求本服务。
- 远程失败、超时或结构异常时,自动回退本地 AKShare。
- 未设置 `STOCK_DATA_API_BASE_URL` 时,保持原本本地行为。

详细说明见 [原技能远程优先接入说明](docs/原技能远程优先接入说明.md)。

<!-- rebuild 2026-06-20 16:27:31 -->

## 美股与 X/Twitter 数据(参考 niuone 项目补充)

参考开源项目 [kunkundi/niuone](https://github.com/kunkundi/niuone) 的数据覆盖,新增了美股行情/盘面摘要与 X 关注列表时间线两组能力。这些接口复用了本项目已有的多源轮换(`run_sources`)+ 缓存架构。

### 美股数据

| 接口 | 说明 | 数据源顺序(自动轮换) |
|---|---|---|
| `GET /us/indices` | 道指/纳指/标普三大指数 | `tencent.qt.us_indices``sina.hq.us_indices``yahoo.chart.us_indices` |
| `GET /us/sectors` | 美股行业/主题 ETF(半导体、软件、军工、生物科技等,含 A 股映射) | `yahoo.chart.us_sector_etfs` |
| `GET /us/market-summary` | 隔夜美股盘面摘要:风险语气(进攻/平衡/中性/谨慎/防守)+ 指数/板块映射 + 今日指引 | 组合 `us_indices` + `us_sectors` |
| `GET /us/stocks/{symbol}/quote` | 美股个股/指数报价(如 `AAPL``^DJI``TSLA`) | `yahoo.chart.us_quote``sina.hq.us_quote` |
| `GET /us/stocks/{symbol}/daily` | 美股日 K | `yahoo.chart.us_daily` |

> 美股与 A 股是两套独立符号体系:`/stocks/...` 走 A 股(需 `.SH`/`.SZ`),`/us/stocks/...` 走美股(Yahoo/腾讯/新浪代码)。

### X / Twitter 时间线

`GET /social/x/timeline?accounts=elonmusk,OpenAI&limit=5`

- 参数 `accounts`:X 账号,逗号分隔(可带或不带 `@`)。
- 参数 `limit`:每个账号最多抓取条数(1-10)。
- 参数 `hydrate`:是否用帖子链接补充正文/媒体直链,默认 `true`- 数据源顺序:`openai_compatible.x_watchlist`(复用 `/search` 的 Grok/OpenAI 兼容模型,实时检索 X)→ `x.com.html.timeline`(模型未配置时,直接抓取 X 公开 HTML 兜底,能拿到帖子 ID 与页面标题,但正文受反爬限制)。
- 模型检索需要配置 `SEARCH_API_BASE_URL` + `SEARCH_API_KEY`(与 `/search` 共用);未配置时自动降级到 HTML 兜底。

```bash

# 美股三大指数

curl "http://127.0.0.1:7860/api/v1/us/indices?limit=3"



# 隔夜美股盘面摘要

curl "http://127.0.0.1:7860/api/v1/us/market-summary"



# 美股个股报价

curl "http://127.0.0.1:7860/api/v1/us/stocks/AAPL/quote"



# X 关注账号时间线

curl "http://127.0.0.1:7860/api/v1/social/x/timeline?accounts=elonmusk&limit=3"

```

## 免费 MySQL 建议

Hugging Face 免费 Space 会睡眠,本地文件缓存不可靠,建议使用外部 MySQL。可以用支持公网连接的免费或低价云 MySQL / PlanetScale 兼容 MySQL 服务 / Aiven MySQL 试用实例等。

数据库只需要一个表 `api_cache`,服务启动时会自动创建。MySQL 用户需要 `CREATE TABLE``SELECT``INSERT``DELETE` 权限。

## 后续迁移技能

原技能脚本已经接入远程优先模式:

- 设置 `STOCK_DATA_API_BASE_URL` 后,脚本优先请求本服务。
- 远程失败、超时或结构异常时,自动回退本地 AKShare。
- 未设置 `STOCK_DATA_API_BASE_URL` 时,保持原本本地行为。

详细说明见 [原技能远程优先接入说明](docs/原技能远程优先接入说明.md)。

<!-- rebuild 2026-06-20 16:27:31 -->