GitHub - reepool/Quote · GitHub
Skip to content
reepoolPublic

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

1,461 Commits

Folders and files

Repository files navigation

Quote System

Python License Build Status) Code Size) Files)

一个功能强大的金融数据下载和管理系统,支持多数据源、智能限流、断点续传、自动调度和实时监控。系统采用现代化的异步架构,提供完整的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 文件配置必要的参数

基本使用

1. 下载历史数据

# 下载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

2. 数据更新和维护

# 更新当日日线数据
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

3. 启动服务

# 启动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 env

quote-system.service 通过 EnvironmentFile=-/etc/quote-system/quote-system.env 读取密钥。文件权限由部署脚本设置为 root 管理、受限读取,适合生产服务;本地交互式运行仍可按需使用 shell 环境变量或 .env,但当前主程序不会自动加载 .env。

4. Telegram任务管理

系统提供完整的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 8000

Telegram机器人命令:

/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                            # 重载任务配置

5. 系统管理

# 显示系统状态
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

📖 详细功能说明

调度系统

系统内置了丰富的定时任务,支持完全配置化管理:

核心调度任务

  1. 每日数据更新 (daily_data_update)

    • 执行时间: 每周一至周五 20:00
    • 功能: 自动更新当日股票和指数数据
    • 特点: 支持交易日检查、市场收盘等待、品种类型过滤(通过 instrument_types 配置)
  2. 系统健康检查 (system_health_check)

    • 执行时间: 每小时执行一次
    • 功能: 检查数据源状态、数据库健康、系统资源使用情况
    • 特点: 自动告警、性能监控
  3. 每周数据维护 (weekly_data_maintenance)

    • 执行时间: 每周日 02:00
    • 功能: 数据库优化、日志清理、备份验证
    • 包含: 数据库备份、日志清理、数据库优化、数据完整性验证
  4. 月度数据完整性检查 (monthly_data_integrity_check)

    • 执行时间: 每月1日 03:00
    • 功能: 检查上月数据缺口并自动修复
    • 特点: 智能缺口检测、优先级修复、详细报告
  5. 数据库备份 (database_backup) ⭐ 重要功能

    • 执行时间: 每周六 06:00
    • 功能: 自动备份数据库文件
    • 特点: 支持Telegram通知、自动清理过期备份
  6. 缓存预热 (cache_warm_up)

    • 执行时间: 每日 08:00
    • 功能: 预加载热门数据到缓存
    • 包含: 热门股票、市场指数预热
  7. 交易日历更新 (trading_calendar_update)

    • 执行时间: 每月1日 01:00
    • 功能: 更新各交易所交易日历
    • 特点: 支持节假日验证

Telegram任务管理界面 ⭐ 核心功能

系统提供完整的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)

API 接口 ⭐ 现代异步API

系统管理

# 健康检查(应用根路径)
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_backup

🏗️ 项目架构

Quote/
├── 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 补齐)

数据质量

  • 实时评分 - 每条数据都有质量评分
  • 完整性检查 - 数据完整性验证
  • 异常检测 - 自动检测异常数据
  • 缺口识别 - 智能识别数据缺失

🛠️ 故障排除

常见问题

1. 下载卡住或中断

# 检查下载状态
python3 main.py status

# 检查数据缺口
python3 main.py gap --exchanges SSE SZSE

# 继续下载(续传模式)
python3 main.py download --exchanges SSE SZSE --resume

2. 数据源异常

# 检查数据源状态
curl http://localhost:8000/health

# 查看数据源日志
grep "DataSource" log/task.log

3. 调度器问题

# 检查调度器状态
python3 main.py job --job-id system_health_check

# 重启调度器
python3 main.py scheduler

4. 数据库问题

# 检查数据库状态
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

📚 更新日志

v2.3.0 (2025-10-18) ⭐ 重大更新

  • ✨ Telegram任务管理系统

    • 完整的Telegram机器人界面
    • 智能时间显示(相对时间 + 绝对时间)
    • 任务实时控制(启用/禁用/暂停/恢复)
    • 配置热重载功能
    • 权限管理和访问控制
  • 🎯 时间处理优化

    • 新增 utils/date_utils.py 智能时间格式化
    • 多时区支持(A股、港股、美股)
    • 智能时间显示策略
    • 交易日历深度集成
  • 🚀 调度器增强

    • 完全配置化的任务调度系统
    • 8种内置定时任务
    • 运行时任务状态管理
    • 任务执行历史记录
  • 🛠️ 架构优化

    • 模块化设计改进
    • 异步性能提升
    • 错误处理机制完善
    • 代码质量提升(25K+ 行代码,77个文件)

v2.2.0 (2025-10-14)

  • ✨ 新增功能

    • 数据库自动备份任务 (database_backup)
    • 完整的备份配置管理
    • Telegram 通知集成
    • 智能备份文件清理
    • 数据缺口检测功能
    • 交互式下载模式
    • 市场预设组合
  • 🎯 核心改进

    • 统一的配置管理机制
    • 增强的调度器任务系统
    • 改进的错误处理和通知
    • 优化的数据库操作

v2.1.0 (2024-10-11)

  • ✨ 新增功能

    • 指定日期范围下载
    • 智能交易日历选择策略
    • 灵活的续传逻辑优化
  • 🎯 核心改进

    • 根据下载场景选择合适的交易日历获取方式
    • 修复续传逻辑中的批次计算错误
    • 优化交易日判断,优先使用交易日历表

v2.0.0 (2024-10-10)

  • 🎉 统一了 BaoStock 和 AkShare 的限流机制
  • 🗑️ 移除了冗余的 _download_exchange_continuous 方法
  • 📈 优化了数据库结构,提升查询性能
  • 🛡️ 增强了错误恢复和自动重试机制
  • 📊 添加了数据质量评分系统
  • 🚀 支持一次性下载模式 (download_chunk_days=0)

v1.0.0 (2024-09-01)

  • 🎯 初始版本发布
  • 📊 支持多数据源下载
  • 🔧 实现断点续传功能
  • 🌐 提供RESTful API服务

🤝 贡献指南

  1. Fork 项目
  2. 创建功能分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 打开 Pull Request

开发环境设置

# 设置开发环境
pip install -r requirements.txt

# 运行测试
python3 -m pytest tests/

# 代码格式化
black .
isort .

📄 许可证

本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。

🙏 致谢

  • BaoStock - 提供免费的中国股市历史数据
  • AkShare - 开源金融数据接口
  • Tushare - 专业金融数据服务平台
  • YFinance - 雅虎财经数据接口

📞 联系方式


Quote System - 让金融数据管理变得简单高效! 🚀

🔗 相关文档

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages