一个功能强大的金融数据下载和管理系统,支持多数据源、智能限流、断点续传、自动调度和实时监控。系统采用现代化的异步架构,提供完整的RESTful API和Telegram任务管理界面。
- PyTdx - 高速本地通达信直连接口(极速 A 股日线数据获取,百万条/分钟)
- BaoStock - 稳定 A 股市场历史数据(主行情及指数数据来源)
- AkShare - 综合性接口(除权除息因子同步、ETF 补偿等)
- Tushare - 专业级金融数据(需 Token 认证支持)
- YFinance - 雅虎财经(提供美股、港股等海外市场支持)
- 精确下载模式 - 基于上市日期的智能数据范围计算
- 断点续传 - 支持中断后的自动恢复
- 分块下载 - 灵活的分块策略,支持
download_chunk_days=0一次性下载 - 质量评估 - 实时数据质量评分和完整性检查
- 灵活日期选择 - 支持年份范围和精确日期范围下载
- 进度跟踪 - 详细的下载进度监控和统计信息
- Telegram机器人 - 完整的任务管理界面
- 实时状态监控 - 智能时间显示,支持相对时间和绝对时间
- 配置热重载 - 运行时动态更新任务配置无需重启
- 任务控制 - 启用/禁用/暂停/恢复定时任务
- 数据补充 - 指定日期补充缺失数据(
/backfill命令) - 任务启动通知 - 定时任务执行前自动推送 Telegram 消息,按任务独立配置
- 权限管理 - 基于用户ID的访问控制
- 多维度限流 - 分钟/小时/日三级智能限流
- 自适应控制 - 根据网络状况动态调整请求频率
- 错误恢复 - 智能重试和故障自愈机制
- RESTful API - 完整的 HTTP API 服务,支持多种数据格式
- 实时监控 - 系统健康检查和性能监控
- 智能调度 - 完全配置化的任务调度系统,支持8种内置任务
- 数据分析 - 内置数据统计和分析功能
- 数据缺口检测与智能填补 - 自动识别和报告缺失数据点,支持单日、范围及多维度缺口修复与重试
- 自动备份 - 定时数据库备份和清理,支持Telegram通知
- 智能时间处理 - 多时区支持和交易日历集成
- 多频率融合 - 支持 Daily(日线)、Weekly(周线)、Monthly(月线) 多级别数据采集融合
# 克隆项目
git clone <repository-url>
cd Quote
# 安装依赖
pip install -r requirements.txt
# 复制配置文件
cp .env.example .env
# 编辑 .env 文件配置必要的参数# 下载A股市场数据(默认所有年份)
python3 main.py download --exchanges SSE SZSE
# 下载指定年份的数据
python3 main.py download --exchanges SSE SZSE --years 2023 2024
# 下载指定日期范围的数据
python3 main.py download --exchanges SZSE --start-date 2024-01-01 --end-date 2024-12-31
# 下载从指定日期到今天的数据
python3 main.py download --exchanges SSE --start-date 2024-06-01
# 下载从开始到指定日期的数据
python3 main.py download --exchanges SSE SZSE --end-date 2024-12-31
# 使用市场预设
python3 main.py download --preset a_shares
python3 main.py download --preset hk_stocks
python3 main.py download --preset us_stocks
# 指定单个股票下载
python3 main.py download --instrument-id 000001.SZ
# 续传模式(中断后继续下载,默认启用)
python3 main.py download --exchanges SSE SZSE --resume
# 重置进度重新下载
python3 main.py download --exchanges SZSE --no-resume
# 按品种类型下载(stock=股票, index=指数, etf=ETF)
python3 main.py download --types index # 仅下载指数
python3 main.py download --types stock index # 股票+指数
python3 main.py download --types index --no-resume # 全量重新下载指数
# 查看所有可用的市场预设
python3 main.py download --list-presets# 更新当日日线数据
python3 main.py update --exchanges SSE SZSE
# 补充指定日期的缺失数据
python3 main.py update --target-date 2026-03-27
python3 main.py update --target-date 2026-03-27 --exchanges SSE
# 数据缺口检测
python3 main.py gap --exchanges SSE SZSE --start-date 2024-01-01 --end-date 2024-12-31
# 交互式下载模式
python3 main.py interactive --mode both# 启动API服务器
python3 main.py api --host 0.0.0.0 --port 8000
# 启动调度器(仅定时任务)
python3 main.py scheduler
# 启动完整系统(调度器 + API服务)
python3 main.py full --host 0.0.0.0 --port 8000生产部署:systemd 自启动与环境变量
项目提供 scripts/service_manager.sh 作为 systemd 部署入口。执行 install 时会同时完成两件事:
- 复制
scripts/quote-system.service到/etc/systemd/system/quote-system.service并设置开机自启。 - 生成或补齐
/etc/quote-system/quote-system.env,用于持久维护FRED_API_KEY、EIA_API_KEY、TUSHARE_TOKEN等运行时密钥;已有文件不会被覆盖。
# 安装 systemd 服务并生成环境变量文件
sudo scripts/service_manager.sh install
# 编辑密钥值;不要把真实密钥写入 git 跟踪的配置文件
sudo nano /etc/quote-system/quote-system.env
# 启动或重启服务,使环境变量生效
sudo scripts/service_manager.sh start
sudo scripts/service_manager.sh restart
# 查看服务状态和日志
sudo scripts/service_manager.sh status
sudo scripts/service_manager.sh logs 100如只需要生成或补齐环境变量文件,不重新安装服务:
sudo scripts/service_manager.sh envquote-system.service 通过 EnvironmentFile=-/etc/quote-system/quote-system.env 读取密钥。文件权限由部署脚本设置为 root 管理、受限读取,适合生产服务;本地交互式运行仍可按需使用 shell 环境变量或 .env,但当前主程序不会自动加载 .env。
系统提供完整的Telegram机器人管理界面:
# 启动包含任务管理器的完整系统
python3 main.py full --host 0.0.0.0 --port 8000
# 或分别启动调度器和API服务
python3 main.py scheduler
python3 main.py api --host 0.0.0.0 --port 8000Telegram机器人命令:
/start # 显示主菜单和帮助信息
/status # 查看所有任务状态和下次执行时间
/detail <任务ID> # 查看指定任务的详细信息
/run <任务ID> # 立即执行指定任务
/run daily_data_update 2026-03-27 # 补充指定日期的缺失数据
/backfill 2026-03-27 # 补充指定日期的缺失数据(支持指定交易所)
/reload_config # 热重载配置文件
/help # 显示帮助信息
任务控制示例:
# 在Telegram中直接发送命令
/status # 显示任务状态(智能时间显示)
/detail daily_data_update # 查看每日数据更新任务详情
/backfill 2026-03-27 SSE # 仅补充上交所 3/27 数据
/reload_config # 重载任务配置# 显示系统状态
python3 main.py status
# 运行指定任务
python3 main.py job --job-id daily_data_update
python3 main.py job --job-id monthly_data_integrity_check
python3 main.py job --job-id database_backup
# 补充指定日期的缺失数据
python3 main.py update --target-date 2026-03-27 --exchanges SSE SZSE系统内置了丰富的定时任务,支持完全配置化管理:
-
每日数据更新 (
daily_data_update)- 执行时间: 每周一至周五 20:00
- 功能: 自动更新当日股票和指数数据
- 特点: 支持交易日检查、市场收盘等待、品种类型过滤(通过
instrument_types配置)
-
系统健康检查 (
system_health_check)- 执行时间: 每小时执行一次
- 功能: 检查数据源状态、数据库健康、系统资源使用情况
- 特点: 自动告警、性能监控
-
每周数据维护 (
weekly_data_maintenance)- 执行时间: 每周日 02:00
- 功能: 数据库优化、日志清理、备份验证
- 包含: 数据库备份、日志清理、数据库优化、数据完整性验证
-
月度数据完整性检查 (
monthly_data_integrity_check)- 执行时间: 每月1日 03:00
- 功能: 检查上月数据缺口并自动修复
- 特点: 智能缺口检测、优先级修复、详细报告
-
数据库备份 (
database_backup) ⭐ 重要功能- 执行时间: 每周六 06:00
- 功能: 自动备份数据库文件
- 特点: 支持Telegram通知、自动清理过期备份
-
缓存预热 (
cache_warm_up)- 执行时间: 每日 08:00
- 功能: 预加载热门数据到缓存
- 包含: 热门股票、市场指数预热
-
交易日历更新 (
trading_calendar_update)- 执行时间: 每月1日 01:00
- 功能: 更新各交易所交易日历
- 特点: 支持节假日验证
系统提供完整的Telegram机器人界面进行任务管理:
智能时间显示:
- 1小时内 → "X分钟后"
- 24小时内 → "今天 HH:MM"
- 7天内 → "周一 HH:MM"
- 超过7天 → "MM-DD HH:MM"
实时任务控制:
- 查看所有任务状态和下次执行时间
- 立即执行指定任务
- 启用/禁用/暂停任务
- 配置热重载无需重启
- 基于每只股票的实际上市日期计算下载范围
- 自动过滤未上市期间的数据请求
- 避免无效请求,提高下载效率
- 灵活指定:支持精确的开始日期和结束日期
- 部分范围:可以只指定开始日期(到今天)或结束日期(从开始)
- 格式标准:使用标准的
YYYY-MM-DD日期格式 - 优先级:直接指定的日期范围优先于年份参数
# 配置文件中的分块设置
{
"data_config": {
"download_chunk_days": 2000, # 每2000天一个块
"batch_size": 50 # 每批处理50只股票
}
}# 设置 download_chunk_days=0 实现一次性下载
# 或通过配置文件设置系统提供了多个市场预设组合,方便快速选择:
- a_shares: 中国A股市场 (SSE, SZSE, BSE)
- hk_stocks: 香港股市 (HKEX)
- us_stocks: 美国股市 (NASDAQ, NYSE)
- mainland: 中国大陆市场 (SSE, SZSE, BSE)
- overseas: 海外市场 (HKEX, NASDAQ, NYSE)
- chinese: 中文市场 (包含港股) (SSE, SZSE, BSE, HKEX)
- global: 全球市场 (NASDAQ, NYSE)
# 健康检查(应用根路径)
curl http://localhost:8000/health
# 系统状态
curl http://localhost:8000/api/v1/system/status
# 系统统计
curl http://localhost:8000/api/v1/stats# 获取交易品种列表(支持过滤)
curl "http://localhost:8000/api/v1/instruments?exchange=SSE&limit=100"
# 根据ID获取品种信息
curl http://localhost:8000/api/v1/instruments/000001.SZSE
# 根据代码获取品种信息
curl http://localhost:8000/api/v1/instruments/symbol/000001# 获取日线数据(默认前复权)
curl "http://localhost:8000/api/v1/quotes/daily?symbol=600519&start_date=2025-01-01&end_date=2025-12-31"
# 获取不复权原始数据
curl "http://localhost:8000/api/v1/quotes/daily?symbol=600519&start_date=2025-01-01&end_date=2025-12-31&adjust=none"
# 获取后复权数据
curl "http://localhost:8000/api/v1/quotes/daily?symbol=600519&start_date=2025-01-01&end_date=2025-12-31&adjust=hfq"
# symbol 会解析为一个首选品种;如需精确查询股票/指数/ETF,请使用 instrument_id
curl "http://localhost:8000/api/v1/quotes/daily?symbol=000001&start_date=2026-04-22&end_date=2026-04-24"
# 获取指数数据(指数无复权概念,adjust 参数被忽略)
curl "http://localhost:8000/api/v1/quotes/daily?instrument_id=000001.SH&start_date=2024-01-01&end_date=2024-01-31"
# 获取最新行情数据(支持 SZSE/SSE 标准后缀,返回查询窗口内 time 最大的记录)
curl "http://localhost:8000/api/v1/quotes/latest?instrument_ids=000001.SZSE&instrument_ids=600000.SSE"
# 取回退市证券历史行情(include_delisted,默认 false 不改变原行为)+ 分页
curl "http://localhost:8000/api/v1/quotes/daily?instrument_id=600000.SH&start_date=2024-01-01&end_date=2024-12-31&include_delisted=true&limit=100&offset=0"
# 行情覆盖率自查(当日上市证券数 vs 有行情证券数)
curl "http://localhost:8000/api/v1/quotes/coverage?date=2024-06-03&exchange=SSE"# 时点化行业归属(返回 as_of_date 当日生效的行业及 effective/expiry 区间)
curl "http://localhost:8000/api/v1/research/company/600000.SH/industry/as-of?as_of_date=2021-03-15"
# 无风险利率序列(中国 10Y 国债收益率,存于 data/interests.db)
curl "http://localhost:8000/api/v1/research/risk-free-rate?series_id=china_treasury_10y&start_date=2026-01-01&end_date=2026-07-11"# 获取数据缺口
curl "http://localhost:8000/api/v1/gaps?exchange=SSE&start_date=2024-01-01&end_date=2024-12-31"
# 填补数据缺口任务
curl -X POST http://localhost:8000/api/v1/gaps/fill \
-H "Content-Type: application/json" \
-d '{"exchange": "SSE", "dry_run": false}'
# 数据质量报告
curl "http://localhost:8000/api/v1/gaps/report"# 获取交易日历
curl "http://localhost:8000/api/v1/calendar/trading?exchange=SSE&start_date=2024-01-01&end_date=2024-12-31"
# 获取下一个交易日
curl "http://localhost:8000/api/v1/calendar/trading/next?exchange=SSE&date=2024-01-01"
# 获取上一个交易日
curl "http://localhost:8000/api/v1/calendar/trading/previous?exchange=SSE&date=2024-01-01"系统能够自动检测数据缺口:
# 基础缺口检测
python3 main.py gap --exchanges SSE SZSE
# 指定时间范围和严重程度
python3 main.py gap --exchanges SSE --start-date 2024-01-01 --severity high
# 生成详细报告
python3 main.py gap --exchanges SZSE --output gap_report.json --detailed{
"backup_config": {
"enabled": true,
"source_db_path": "data/quotes.db",
"backup_directory": "data/PVE-Bak/QuoteBak",
"retention_days": 30,
"notification_enabled": true,
"filename_pattern": "quotes_backup_{timestamp}.db",
"max_backup_files": 10
}
}# 运行备份任务
python3 main.py job --job-id database_backupQuote/
├── main.py # 主程序入口
├── data_manager.py # 数据管理核心
├── config/
│ ├── config.json # 主配置文件
│ └── config-template.json # 配置模板
├── requirements.txt # 依赖列表
├── data_sources/ # 数据源模块
│ ├── base_source.py # 数据源基类
│ ├── baostock_source.py # BaoStock数据源
│ ├── akshare_source.py # AkShare数据源
│ ├── tushare_source.py # Tushare数据源
│ ├── yfinance_source.py # YFinance数据源
│ └── source_factory.py # 数据源工厂
├── database/ # 数据库模块
│ ├── models.py # 数据模型
│ ├── operations.py # 数据库操作
│ └── connection.py # 数据库连接
├── api/ # API服务
│ ├── app.py # FastAPI应用
│ ├── routes.py # API路由
│ ├── models.py # API数据模型
│ └── middleware.py # 中间件
├── scheduler/ # 任务调度
│ ├── scheduler.py # 调度器核心
│ ├── tasks.py # 任务定义
│ ├── job_config.py # 任务配置管理
│ └── monitor.py # 调度器监控
├── utils/ # 工具模块
│ ├── date_utils.py # 日期时间工具 ⭐
│ ├── task_manager/ # Telegram任务管理器 ⭐
│ │ ├── task_manager.py # 主控制器
│ │ ├── handlers.py # 消息处理器
│ │ ├── models.py # 数据模型
│ │ ├── formatters.py # 消息格式化
│ │ └── keyboards.py # 键盘布局
│ ├── logging_manager.py # 日志管理
│ ├── security_utils.py # 安全工具
│ ├── cache.py # 缓存管理
│ ├── validation.py # 数据验证
│ └── config_manager.py # 配置管理
├── data/ # 数据目录
│ ├── quotes.db # 主数据库
│ └── PVE-Bak/ # 备份目录
├── log/ # 日志目录
└── tests/ # 测试用例
- ⭐ utils/date_utils.py: 智能时间处理和时区管理
- ⭐ utils/task_manager/: Telegram机器人任务管理系统
- scheduler/: 完全配置化的任务调度系统
- api/: 现代异步RESTful API服务
- data_sources/: 多数据源统一接口和工厂模式
- database/: 现代SQLAlchemy 2.0 ORM操作
💡 详细配置说明: 上述配置仅为重要功能片段概述。随着系统升级,全部节点、详细参数说明、可用选项及其默认值,都已提炼至单独文档。 请查阅:【全系统配置参数说明文档】
- SSE - 上海证券交易所
- SZSE - 深圳证券交易所
- BSE - 北京证券交易所
- HKEX - 香港交易所
- NASDAQ - 纳斯达克
- NYSE - 纽约证券交易所
- 原始数据记录 - OHLCV 多周期数据支持(Day 日线 / Week 周线 / Month 月线)
- 复权数据 - 查询时动态计算精度补偿(支持前复权
adjust=qfq/ 后复权adjust=hfq) - 复权因子 - 高精度除权除息记录表与拆股因子,与日线、周线、月线动态映射
- 基本面数据 - 行情列表页所覆盖到的品种名称及基础元数据
- 交易日历 - 中外市场交易日/休市日推算
- stock - 个股(A股)
- index - 指数(上证综指、深证成指等)
- etf - ETF基金(品种已入库,历史数据需 AkShare 补齐)
- 实时评分 - 每条数据都有质量评分
- 完整性检查 - 数据完整性验证
- 异常检测 - 自动检测异常数据
- 缺口识别 - 智能识别数据缺失
# 检查下载状态
python3 main.py status
# 检查数据缺口
python3 main.py gap --exchanges SSE SZSE
# 继续下载(续传模式)
python3 main.py download --exchanges SSE SZSE --resume# 检查数据源状态
curl http://localhost:8000/health
# 查看数据源日志
grep "DataSource" log/task.log# 检查调度器状态
python3 main.py job --job-id system_health_check
# 重启调度器
python3 main.py scheduler# 检查数据库状态
python3 main.py status
# 手动备份数据库
python3 main.py job --job-id database_backup
# 数据库优化
python3 main.py job --job-id weekly_data_maintenance# 实时查看任务日志
tail -f log/task.log
# 查看任务错误日志
grep "ERROR" log/task.log
# 查看调度器日志
grep "Scheduler" log/task.log
# 查看 API 访问流水
tail -f log/access.log
# 查看系统生命周期日志
tail -f log/sys.log-
✨ Telegram任务管理系统
- 完整的Telegram机器人界面
- 智能时间显示(相对时间 + 绝对时间)
- 任务实时控制(启用/禁用/暂停/恢复)
- 配置热重载功能
- 权限管理和访问控制
-
🎯 时间处理优化
- 新增
utils/date_utils.py智能时间格式化 - 多时区支持(A股、港股、美股)
- 智能时间显示策略
- 交易日历深度集成
- 新增
-
🚀 调度器增强
- 完全配置化的任务调度系统
- 8种内置定时任务
- 运行时任务状态管理
- 任务执行历史记录
-
🛠️ 架构优化
- 模块化设计改进
- 异步性能提升
- 错误处理机制完善
- 代码质量提升(25K+ 行代码,77个文件)
-
✨ 新增功能
- 数据库自动备份任务 (
database_backup) - 完整的备份配置管理
- Telegram 通知集成
- 智能备份文件清理
- 数据缺口检测功能
- 交互式下载模式
- 市场预设组合
- 数据库自动备份任务 (
-
🎯 核心改进
- 统一的配置管理机制
- 增强的调度器任务系统
- 改进的错误处理和通知
- 优化的数据库操作
-
✨ 新增功能
- 指定日期范围下载
- 智能交易日历选择策略
- 灵活的续传逻辑优化
-
🎯 核心改进
- 根据下载场景选择合适的交易日历获取方式
- 修复续传逻辑中的批次计算错误
- 优化交易日判断,优先使用交易日历表
- 🎉 统一了 BaoStock 和 AkShare 的限流机制
- 🗑️ 移除了冗余的
_download_exchange_continuous方法 - 📈 优化了数据库结构,提升查询性能
- 🛡️ 增强了错误恢复和自动重试机制
- 📊 添加了数据质量评分系统
- 🚀 支持一次性下载模式 (
download_chunk_days=0)
- 🎯 初始版本发布
- 📊 支持多数据源下载
- 🔧 实现断点续传功能
- 🌐 提供RESTful API服务
- Fork 项目
- 创建功能分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 打开 Pull Request
# 设置开发环境
pip install -r requirements.txt
# 运行测试
python3 -m pytest tests/
# 代码格式化
black .
isort .本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
- 项目主页:GitHub Repository
- 问题反馈:Issues
- 功能建议:Discussions
Quote System - 让金融数据管理变得简单高效! 🚀
- 全系统配置参数说明文档(核心) —— 所有配置项的查询地点
- SQLite 底层架构与性能调优指南 —— 数据模型结构与并发解锁方案
- 数据库备份实施文档
- API 接口文档
- 故障排除指南