基于 thsdk 的 A 股每日复盘工具,支持 CLI 和 Web 界面。
ths/
├── backend/ # Python 后端
│ ├── web.py # FastAPI 服务
│ ├── fetcher.py # 同花顺数据拉取
│ ├── cache.py # SQLite 缓存层
│ ├── analysis.py # 数据解析与分析
│ ├── config.py # 配置(数据库路径、指数代码等)
│ ├── fetch_history.py # 批量拉取历史数据脚本
│ ├── models.py # 数据模型
│ ├── cli.py # CLI 命令行入口
│ └── display.py # CLI 显示模块
├── web/ # Vue 3 前端
│ ├── src/
│ │ ├── views/ # 页面(首页、排行榜、板块、个股详情)
│ │ ├── components/ # 组件(K线图、分时图、表格等)
│ │ └── api/ # API 客户端和类型定义
│ └── dist/ # 构建产物
└── stock_codes.csv # 股票代码列表
uv sync
cd web && npm install复制 .env.example 为 .env,填入同花顺账号信息:
cp .env.example .envTHS_USERNAME=你的同花顺用户名
THS_PASSWORD=你的同花顺密码
THS_MAC=你的MAC地址
cd /Users/djj45/code/ths
# 一键启动(开发模式,后端 + 前端,访问 http://localhost:5173)
./start.sh
# 一键启动(生产模式,构建前端 + 启动服务,访问 http://localhost:8000)
./start-prod.sh
# 手动分别启动
uv run uvicorn web:app --app-dir backend --reload --host 0.0.0.0 --port 8000 # 终端 1:后端
cd web && npm run dev # 终端 2:前端构建后访问 http://localhost:8000 即可使用(web.py 会自动 serve web/dist 目录)。
- 后端: FastAPI + uvicorn,复用现有 fetcher/analysis/cache 模块
- 前端: Vue 3 + TypeScript + Vue Router + ECharts
- 构建: Vite
SQLite 数据库位于 ~/.ths_review/cache.db。
# 查看整体概览
sqlite3 ~/.ths_review/cache.db "
SELECT 'stock_daily 日期: ' || min(date) || ' ~ ' || max(date) || ' 记录: ' || count(*) FROM stock_daily;
SELECT 'index_daily 日期: ' || min(date) || ' ~ ' || max(date) || ' 记录: ' || count(*) FROM index_daily;
SELECT 'sector_daily 日期: ' || min(date) || ' ~ ' || max(date) || ' 记录: ' || count(*) FROM sector_daily;
SELECT 'market_daily 日期: ' || min(date) || ' ~ ' || max(date) || ' 记录: ' || count(*) FROM market_daily;
SELECT 'klines 缓存: ' || count(*) || ' 条' FROM klines;
SELECT 'stock_list 股票: ' || count(*) || ' 只' FROM stock_list;
"
# 查看每天有多少条个股记录
sqlite3 ~/.ths_review/cache.db "SELECT date, count(*) FROM stock_daily GROUP BY date ORDER BY date"
# 查看每天的两市成交额
sqlite3 ~/.ths_review/cache.db "SELECT * FROM market_daily ORDER BY date"
# 查看所有表的日期范围
sqlite3 ~/.ths_review/cache.db "SELECT 'stock_daily', min(date), max(date) FROM stock_daily
UNION ALL SELECT 'index_daily', min(date), max(date) FROM index_daily
UNION ALL SELECT 'sector_daily', min(date), max(date) FROM sector_daily
UNION ALL SELECT 'market_daily', min(date), max(date) FROM market_daily"# 清除某天的个股数据(下次请求时重新拉取)
sqlite3 ~/.ths_review/cache.db "DELETE FROM stock_daily WHERE date='2026-04-23'"
# 清除所有缓存(慎用)
rm ~/.ths_review/cache.db使用 fetch_history.py 脚本批量拉取指定日期范围的历史行情数据:
cd /Users/djj45/code/ths
# 拉取指定日期范围(自动跳过周末)
uv run python backend/fetch_history.py 2026-04-20 2026-04-24
# 强制刷新(覆盖已有缓存)
uv run python backend/fetch_history.py 2026-04-20 2026-04-24 --force
# 跳过板块数据(加快速度)
uv run python backend/fetch_history.py 2026-04-20 2026-04-24 --skip-sectors
# 仅拉取今天
uv run python backend/fetch_history.py --today
# 构建板块成分股映射(首次使用或板块变更后需运行一次,约需几分钟)
uv run python backend/fetch_history.py --build-sector-map每个交易日会拉取:个股行情、指数快照、两市成交额、行业板块、概念板块。
注意:
- 同花顺的
market_data_index是实时接口,不支持查历史。历史两市场成交额通过指数日K线获取,数据更准确 - 拉取历史日期时,
stock_daily中的数据来自market_data_cn,部分字段(如主力净流入、量比)可能不完整 - 拉取速度取决于同花顺 API 的响应速度,每个交易日大约需要 10-30 秒
- 建议不要一次拉取太多天的数据,避免触发限流
- 非交易日的数据拉取会自动跳过(仅判断周末,不判断节假日)
| 接口 | 说明 |
|---|---|
GET /api/indices |
指数快照 |
GET /api/market-breadth |
涨跌统计 + 两市成交额 |
GET /api/rankings?sort_by=change_pct&top_n=20 |
排行榜 |
GET /api/capital-flow?top_n=20&direction=inflow |
资金流向 |
GET /api/sectors/industry |
行业板块 |
GET /api/sectors/concept |
概念板块 |
GET /api/stock/{ths_code} |
个股详情 |
GET /api/stock/{ths_code}/klines |
日K线 |
GET /api/stock/{ths_code}/intraday?date= |
分时数据 |
GET /api/sectors/{ths_code}/constituents |
板块成分股 |
GET /api/stock/{ths_code}/sectors |
个股所属板块 |
GET /api/search?q= |
股票搜索(支持拼音首字母) |
POST /api/refresh |
刷新今日数据 |
uv run python backend/cli.py overview # 完整每日复盘
uv run python backend/cli.py top-gainers -n 30 # 涨幅前30
uv run python backend/cli.py top-losers -n 30 # 跌幅前30
uv run python backend/cli.py turnover-leaders # 换手率排行
uv run python backend/cli.py capital-flow # 主力资金流向
uv run python backend/cli.py sectors # 板块行情
uv run python backend/cli.py stock 000001 # 个股详情(含K线)
uv run python backend/cli.py index # 指数概览
uv run python backend/cli.py refresh # 强制刷新缓存
uv run python backend/cli.py overview --no-cache # 不使用缓存- 数据源:通过 thsdk 实时行情接口获取,仅支持当日数据
- K 线查询:支持历史区间查询,在个股详情页设置开始/结束日期即可获取对应区间的日 K 数据
- 股票列表:从
stock_codes.csv读取,约 5200 只 A 股 - 缓存:SQLite(
~/.ths_review/cache.db),当日数据自动复用