Spaces:
Running
Running
| title: Kronos Stock Predictor API | |
| emoji: 📈 | |
| colorFrom: blue | |
| colorTo: indigo | |
| sdk: docker | |
| pinned: false | |
| # Kronos Stock Predictor API | |
| 基于[清华大学 Kronos 金融 K 线基础大模型](https://arxiv.org/abs/2508.02739)的 A 股概率预测 REST API。 | |
| - **数据源**:Tushare Pro A 股日线,前复权(qfq) | |
| - **推理方式**:蒙特卡洛分批采样,输出预测方向、置信度及 95% 交易区间 | |
| - **异步任务**:POST 提交 → 返回 `task_id` → GET 轮询结果 | |
| --- | |
| ## 更新说明(2026-03-16) | |
| - 请求/响应主字段由 `ts_code` 统一为 `symbol` | |
| - 数据源切换回 Tushare Pro(`pro_bar`,前复权 `qfq`) | |
| - 方向概率 `direction.probability` 定义为“当前 `direction.signal` 的概率(0–1)” | |
| - 推理路径改为分批采样(可通过 `MC_BATCH_SIZE` 调整批大小) | |
| - 新增阶段耗时日志(`fetch/calendar/infer/build/cache/total`) | |
| --- | |
| ## 模型信息 | |
| | 项目 | 值 | | |
| |---|---| | |
| | 模型 | [NeoQuasar/Kronos-base](https://huggingface.co/NeoQuasar/Kronos-base) | | |
| | 参数量 | 102.3M | | |
| | 架构 | Decoder-only Transformer | | |
| | 最大上下文 | 512 根 K 线 | | |
| | 预训练数据 | 全球 45 个交易所,120 亿根 K 线 | | |
| | 推理设备 | CUDA(若可用)/ CPU fallback | | |
| --- | |
| ## 快速开始 | |
| ### 1. 提交预测任务 | |
| ```bash | |
| curl -X POST "https://yingfeng64-kronos-api.hf.space/api/v1/predict" \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "symbol": "000063.SZ", | |
| "lookback": 512, | |
| "pred_len": 5, | |
| "sample_count": 30, | |
| "mode": "simple" | |
| }' | |
| ``` | |
| ```json | |
| { "task_id": "550e8400-e29b-41d4-a716-446655440000" } | |
| ``` | |
| ### 2. 轮询结果 | |
| ```bash | |
| curl "https://yingfeng64-kronos-api.hf.space/api/v1/predict/550e8400-e29b-41d4-a716-446655440000" | |
| ``` | |
| `status` 为 `"pending"` 时继续等待,变为 `"done"` 或 `"failed"` 后读取结果。 | |
| ### Python 一键轮询版 | |
| ```python | |
| import time, requests | |
| BASE = "https://yingfeng64-kronos-api.hf.space" | |
| resp = requests.post(f"{BASE}/api/v1/predict", json={ | |
| "symbol": "000063.SZ", | |
| "lookback": 512, | |
| "pred_len": 5, | |
| "sample_count": 30, | |
| }) | |
| task_id = resp.json()["task_id"] | |
| while True: | |
| r = requests.get(f"{BASE}/api/v1/predict/{task_id}").json() | |
| if r["status"] in ("done", "failed"): | |
| break | |
| time.sleep(10) | |
| print(r["result"]) | |
| ``` | |
| --- | |
| ## API 文档 | |
| ### `POST /api/v1/predict` — 提交单个预测任务 | |
| **请求体** | |
| | 字段 | 类型 | 默认值 | 范围 | 说明 | | |
| |---|---|---|---|---| | |
| | `symbol` | string | — | — | A 股代码,支持 `"603777"` 或 `"000063.SZ"` | | |
| | `lookback` | int | 512 | 20–512 | 回看历史 K 线根数 | | |
| | `pred_len` | int | 5 | 1–60 | 预测未来交易日数(建议 ≤ 30) | | |
| | `sample_count` | int | 30 | 1–100 | MC 蒙特卡洛采样次数 | | |
| | `mode` | string | `"simple"` | `simple` / `advanced` | 返回字段详细程度 | | |
| | `include_volume` | bool | false | — | `advanced` 模式下是否返回成交量预测 | | |
| **响应(`mode=simple`)** | |
| ```json | |
| { | |
| "symbol": "000063.SZ", | |
| "base_date": "2026-03-13", | |
| "pred_len": 5, | |
| "confidence": 95, | |
| "confidence_warning": false, | |
| "cached": false, | |
| "cache_expires_at": "2026-03-16 15:00:00 UTC+08:00", | |
| "direction": { | |
| "signal": "bearish", | |
| "probability": 0.5667 | |
| }, | |
| "summary": { | |
| "mean_close": 36.35, | |
| "range_low": 30.60, | |
| "range_high": 40.01, | |
| "range_width": 9.41 | |
| }, | |
| "bands": [ | |
| { | |
| "date": "2026-03-16", | |
| "step": 1, | |
| "mean_close": 36.10, | |
| "trading_low": 34.46, | |
| "trading_high": 37.32, | |
| "uncertainty": 0.0785 | |
| } | |
| ] | |
| } | |
| ``` | |
| **`mode=advanced` 在每个 `bands` 条目中追加** | |
| | 字段 | 说明 | | |
| |---|---| | |
| | `mean_open` / `mean_high` / `mean_low` | 预测开/高/低价均值 | | |
| | `close_ci_low` / `close_ci_high` | 收盘价 95% 置信区间 | | |
| 当 `include_volume: true` 时额外返回顶层 `volume` 数组: | |
| ```json | |
| "volume": [ | |
| { | |
| "date": "2026-03-16", | |
| "mean_volume": 1050000, | |
| "volume_ci_low": 820000, | |
| "volume_ci_high": 1280000 | |
| } | |
| ] | |
| ``` | |
| --- | |
| ### `GET /api/v1/predict/{task_id}` — 查询单个任务结果 | |
| **响应** | |
| | `status` | 含义 | | |
| |---|---| | |
| | `pending` | 正在计算 | | |
| | `done` | 完成,`result` 字段包含预测数据 | | |
| | `failed` | 失败,`error` 字段包含错误信息 | | |
| --- | |
| ### `POST /api/v1/predict/batch` — 批量提交 | |
| 一次提交最多 20 个预测请求,所有子任务并发入队。每个子任务参数与单个预测相同。 | |
| ```bash | |
| curl -X POST "https://yingfeng64-kronos-api.hf.space/api/v1/predict/batch" \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "requests": [ | |
| {"symbol": "000063", "pred_len": 5, "sample_count": 30}, | |
| {"symbol": "600900", "pred_len": 5, "sample_count": 30}, | |
| {"symbol": "000001", "pred_len": 5, "sample_count": 30} | |
| ] | |
| }' | |
| ``` | |
| ```json | |
| { | |
| "batch_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", | |
| "task_ids": ["aaa...", "bbb...", "ccc..."] | |
| } | |
| ``` | |
| --- | |
| ### `GET /api/v1/predict/batch/{batch_id}` — 查询批量进度 | |
| ```json | |
| { | |
| "batch_id": "xxxxxxxx-...", | |
| "status": "done", | |
| "total": 3, | |
| "done": 3, | |
| "failed": 0, | |
| "tasks": [ | |
| { | |
| "task_id": "aaa...", | |
| "status": "done", | |
| "result": { ... }, | |
| "error": null | |
| } | |
| ] | |
| } | |
| ``` | |
| | `status` | 含义 | | |
| |---|---| | |
| | `pending` | 仍有子任务在计算 | | |
| | `done` | 全部成功 | | |
| | `partial` | 部分成功、部分失败 | | |
| | `failed` | 全部失败 | | |
| --- | |
| ### `GET /api/v1/cache` — 查看缓存状态 | |
| 列出有效缓存条目及剩余 TTL。 | |
| | 参数 | 说明 | | |
| |---|---| | |
| | `symbol`(可选) | 只返回该股票的缓存,不传则返回全部 | | |
| ```bash | |
| # 查某只股票 | |
| curl "https://yingfeng64-kronos-api.hf.space/api/v1/cache?symbol=000063" | |
| # 查全部 | |
| curl "https://yingfeng64-kronos-api.hf.space/api/v1/cache" | |
| ``` | |
| ```json | |
| { | |
| "count": 1, | |
| "entries": [ | |
| { | |
| "symbol": "000063", | |
| "lookback": 512, | |
| "pred_len": 5, | |
| "sample_count": 30, | |
| "mode": "simple", | |
| "include_volume": false, | |
| "cached_at": "2026-03-16 10:23:00 UTC+08:00", | |
| "expires_at": "2026-03-16 15:00:00 UTC+08:00", | |
| "ttl_seconds": 17220 | |
| } | |
| ] | |
| } | |
| ``` | |
| --- | |
| ### `GET /health` — 健康检查 | |
| ```json | |
| { "status": "ok" } | |
| ``` | |
| --- | |
| ## 响应字段说明 | |
| | 字段 | 含义 | | |
| |---|---| | |
| | `base_date` | 预测所基于的最后一个历史 K 线日期 | | |
| | `direction.signal` | `"bullish"` / `"bearish"`,由内部看涨概率是否 >= 0.5 决定 | | |
| | `direction.probability` | 当前 `direction.signal` 的概率(0–1) | | |
| | `trading_low` | 该日预测最低价的 q2.5 分位数(95% 交易区间下沿) | | |
| | `trading_high` | 该日预测最高价的 q97.5 分位数(95% 交易区间上沿) | | |
| | `uncertainty` | `(trading_high − trading_low) / last_close`,无量纲不确定性 | | |
| | `confidence_warning` | `pred_len > 30` 时为 `true`,表示预测不确定性较大 | | |
| | `cached` | 结果是否来自缓存 | | |
| | `cache_expires_at` | 缓存失效时间(北京时间) | | |
| --- | |
| ## 缓存机制 | |
| 缓存 key 由 `(symbol, lookback, pred_len, sample_count, mode, include_volume)` 六元组构成,失效时机为下一个 A 股交易日收盘(15:00 CST)。 | |
| | 请求时间(CST) | 缓存过期时间 | | |
| |---|---| | |
| | 工作日 00:00–15:00 | 当日 15:00 CST | | |
| | 工作日 15:00 后 | 次个工作日 15:00 CST | | |
| | 周末 | 下周一 15:00 CST | | |
| | 法定节假日 | 不特殊处理(节假日无新数据,缓存命中结果正确) | | |
| 缓存命中时响应时间 < 100ms,无需等待模型推理。 | |
| --- | |
| ## 运行配置 | |
| | 环境变量 | 默认值 | 说明 | | |
| |---|---|---| | |
| | `TUSHARE_TOKEN` | — | Tushare 访问令牌(必填) | | |
| | `KRONOS_DIR` | `/app/Kronos` | Kronos 源码目录 | | |
| | `MC_BATCH_SIZE` | `8` | 蒙特卡洛分批采样大小(越大通常越快,但占用显存/内存更高) | | |
| | `TS_RETRY_COUNT` | `3` | Tushare 请求重试次数 | | |
| | `TS_RETRY_BASE_SLEEP` | `0.8` | Tushare 重试退避基准秒数(指数退避) | | |
| --- | |
| ## 可观测性 | |
| 服务会在 `INFO` 日志输出预测阶段耗时,示例: | |
| ```text | |
| Task <task_id> timing symbol=300065.SZ fetch=...ms calendar=...ms infer=...ms build=...ms cache=...ms total=...ms | |
| ``` | |
| ## 性能参考 | |
| | 环境 | 单次采样 | 30 次 MC 总耗时 | | |
| |---|---|---| | |
| | RTX 3090 (CUDA) | ~230ms | ~7s | | |
| | CPU only | ~3–5s | ~2–5min | | |
| > 推荐选用 GPU 硬件以获得实用响应速度。首次冷启动需从 HuggingFace Hub 下载模型权重,约需 1–2 分钟。 | |