# Active Stock Automatic Identification System **Repository Path**: QiuSuo2023/Active-Stock ## Basic Information - **Project Name**: Active Stock Automatic Identification System - **Description**: 通过baostock金融数据平台获取沪深两市A股历史及实时日线(注:前复权)交易数据,包括成交量、价格、换手率等关键指标。 运用Python及Pandas库进行高效的时间序列数据处理和分析 设计并实现基于多维度指标的活跃股票识别算法 构建具备数据自动化更新、计算、存储功能的完整系统 开发直观的可视化界面,清晰展示活跃度分析结果 实现活跃度趋势图、行业分布图、每日报告等可视化功能 - **Primary Language**: Python - **License**: MulanPSL-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-11 - **Last Updated**: 2026-05-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 活跃股票识别系统 基于 **日 K 行情** 与 **五维活跃度量化评分** 的 A 股活跃标的筛选与展示系统。数据通过 [Baostock](http://baostock.com/) 拉取,存储在本地 **SQLite**,提供 Web 界面(Flask)、命令行任务与 HTML 日报。 ## 功能概览 - **五维活跃度评分**:从换手率、量比、振幅、涨幅趋势、涨停信号五个维度加权计算活跃度评分(0-100),支持参数配置化 - **大盘/板块评分**:基于沪深300和行业板块计算市场整体活跃度,在趋势图中以红色虚线展示 - **股票与日线**:股票基础信息、日 K 列表与离线 K 线(ECharts)、个股活跃度评分对比 - **规则引擎**:JSON 定义条件(字段含换手率、振幅、成交量、量比、收盘价等),支持 AND/OR;Web 端提供快捷模板与条件构建器 - **活跃股**:按交易日查看命中结果,支持剔除/恢复(异步操作,滚动位置不丢失) - **图表**:行业分布、活跃趋势(含大盘评分);首页聚合多图(趋势、行业、规则命中、成交量排名等),阈值联动刷新 - **日报**:生成并浏览按日的 HTML 报告(内嵌图表,含大盘评分线,需通过站点访问而非 `file://`) - **参数配置**:在线修改活跃度阈值(数字输入框,实时预览影响),五维权重和分段阈值支持配置文件/环境变量 ## 技术栈 | 类别 | 说明 | | --- | --------------------------- | | 运行时 | Python 3.10+(建议) | | Web | Flask 3.x | | 数据 | SQLite、pandas | | 行情源 | baostock | | 图表 | ECharts(本地 `static/vendor`) | | 前端交互 | Fetch API(异步提交、图表联动刷新) | ## 环境准备 ```bash # 进入项目根目录(含 run.py、app/、requirements.txt) python -m venv venv # Windows venv\Scripts\activate # macOS / Linux source venv/bin/activate pip install -r requirements.txt ``` ## 快速开始 ### 1. 初始化数据库 ```bash flask --app run.py init-db ``` ### 2. 准备数据(需联网) 任选其一或组合使用: ```bash # 同步 A 股基础信息到 stock_basic——先同步股票列表 flask --app run.py sync-stock-basic # 增量同步日 K(从配置的默认起点到今日,覆盖库内已有股票)——再同步日K数据 flask --app run.py sync-daily ``` 抽样初始化(适合演示、缩短耗时)可用脚本: ```bash python scripts/full_init.py --max-stocks 100 --start-date 2025-08-09 ``` 日常收盘后可执行: ```bash python scripts/daily_update.py ``` ### 3. 规则与识别 ```bash # 若规则表为空,写入示例规则 flask --app run.py seed-rules # 对指定交易日执行识别(含五维评分 + 大盘/板块评分) flask --app run.py recognize --date 2025-08-11 ``` 也可在 **规则** 页面通过表单执行识别。 ### 4. 启动 Web ```bash python run.py ``` 浏览器访问: *** ## 三、初次部署完整流程 ### 方式一:使用脚本快速初始化(推荐) ```bash # 1. 激活虚拟环境 source venv/bin/activate # Linux/Mac venv\Scripts\activate # Windows # 2. 执行全量初始化(初始化表结构+股票列表+日K数据) python scripts/full_init.py --start-date 2025-08-09 # 3. 初始化识别规则 flask --app run.py seed-rules # 4. 执行首次识别(含五维评分 + 大盘/板块评分) flask --app run.py recognize --date 2025-08-11 # 5. 生成日报 flask --app run.py generate-report --date 2025-08-11 # 6. 启动应用 flask --app run.py run --host 0.0.0.0 --port 5000 ``` ### 方式二:分步执行(适合调试) ```bash # 1. 激活虚拟环境 source venv/bin/activate # Linux/Mac venv\Scripts\activate # Windows # 2. 初始化数据库(可不用,股票列表同步时会自动调用) flask --app run.py init-db # 3. 同步股票列表 flask --app run.py sync-stock-basic # 4. 同步历史日K数据 flask --app run.py sync-daily # 5. 初始化规则 flask --app run.py seed-rules # 6. 执行识别和生成日报 flask --app run.py recognize --date 2025-08-11 flask --app run.py generate-report --date 2025-08-11 # 7. 启动应用 flask --app run.py run ``` *** ## 四、日常维护流程 ### 每日收盘后更新(推荐脚本) ```bash # 同步 A 股基础信息到 stock_basic——先同步股票列表 flask --app run.py sync-stock-basic # 增量同步日 K(从配置的默认起点到今日,覆盖库内已有股票)——再同步日K数据 flask --app run.py sync-daily ``` ### 可选的定期维护 ```bash # 每月更新一次股票列表(获取新股) flask --app run.py sync-stock-basic # 修改评分参数后重新识别(使用当前配置的五维评分权重和分段阈值) flask --app run.py rescore --days 30 # 或指定精确日期范围 flask --app run.py rescore --start-date 2025-08-09 --end-date 2025-09-30 ``` *** ## 目录结构(主要) ``` 程序/ ├── run.py # 开发启动入口 ├── requirements.txt ├── app/ │ ├── __init__.py # 应用工厂 create_app │ ├── config.py # 配置(含评分权重、阈值) │ ├── db.py # SQLite 连接与建表(含 system_config 表) │ ├── cli_commands.py # Flask 自定义命令(含 rescore) │ ├── routes/ # 蓝图:首页、股票、规则、活跃股、图表、报告、设置 │ ├── repositories/ # 数据访问(含 config_repo 阈值管理) │ ├── services/ # 同步、规则引擎(含五维评分)、日报 │ ├── templates/ # Jinja 模板(含 settings.html) │ └── static/ # CSS、本地字体、ECharts ├── scripts/ │ ├── full_init.py # 全量/抽样初始化(--max-stocks/--basic-only/--skip-basic) │ ├── daily_update.py # 每日增量更新 │ ├── batch_recognize.py # 批量识别活跃股票(--start-date/--end-date/--days) │ ├── retry_failed.py # 重试失败股票同步(--max-stocks/--start-date/--end-date) │ ├── backfill_scores.py # 回填大盘和板块活跃度评分 │ ├── backfill_market_sector.py # 补充缺失的大盘/板块评分 │ ├── sync_industry_all.py # 全量补全行业数据 │ ├── diagnose_industry.py # 行业分类数据质量诊断(只读) │ ├── compare_industry_mapping.py # 新旧行业映射对比(只读) │ ├── evaluate_market_scope.py # 评估大盘评分范围方案(只读) │ ├── update_rules.py # 更新识别规则(极严格版) │ └── _fetch_hs300.py # 获取沪深300成分股列表(内部辅助) ├── tests/ # 自动化测试(237 项) └── data/ # 默认数据目录(库文件、报告等,可配置) ├── app.db # SQLite(运行后生成) └── reports/ # 日报 HTML ``` ## 配置与环境变量 可在环境变量中覆盖 `app/config.py` 默认值: | 变量 | 含义 | | ------------------------ | ------------------------------ | | `SECRET_KEY` | Flask 密钥(生产环境务必修改) | | `DATA_DIR` | 数据根目录,默认 `项目/data` | | `DATABASE_PATH` | SQLite 路径,默认 `DATA_DIR/app.db` | | `REPORTS_DIR` | 日报输出目录,默认 `DATA_DIR/reports` | | `BAOSTOCK_ADJUST_FLAG` | K 线复权:`2` 前复权(默认),`3` 不复权 | | `BAOSTOCK_DEFAULT_START` | 增量/初始化时日线起始日,默认 `2025-08-09` | | `BAOSTOCK_REQUEST_SLEEP` | 请求间隔(秒),减轻限流压力,默认 `0.05` | | `ACTIVITY_THRESHOLD` | 活跃度判定阈值,默认 `50`(0-100),也可在设置页在线修改 | | `ACTIVITY_SCORE_THRESHOLDS` | 五维分段评分阈值(JSON 格式),详见 `app/config.py` | ### 五维评分权重配置 默认权重(权重之和为 1.0): | 维度 | 权重 | 说明 | |------|------|------| | 换手率 `turnover` | 0.25 | 当日换手率分段评分 | | 量比 `volume_ratio` | 0.25 | 当日量比分段评分 | | 振幅 `amplitude` | 0.20 | 当日振幅分段评分 | | 涨幅趋势 `trend` | 0.15 | 当日涨跌幅分段评分 | | 涨停信号 `strong_signal` | 0.15 | 当日涨跌幅(涨停区间)分段评分 | 权重配置在 `app/config.py` 的 `ACTIVITY_SCORE_WEIGHTS` 中,修改后需重新执行 `recognize` 或 `rescore` 命令生效。 ## Flask 命令一览 在项目根目录执行,统一使用: ```bash flask --app run.py <命令> ``` ### `init-db` — 创建/升级数据库表结构 | 项目 | 说明 | |------|------| | 功能 | 创建 `stock_basic`、`daily_quote`、`activity_rule`、`activity_result`、`activity_score`、`daily_report`、`system_config`、`chart_meta` 等表(`CREATE TABLE IF NOT EXISTS`),不覆盖已有数据 | | 使用方法 | `flask --app run.py init-db` | | 参数 | 无 | | 执行条件 | 无需联网 | | 预期结果 | `DATA_DIR/app.db` 文件已创建,各表可查询 | | 注意事项 | 重复执行安全,不会删除或覆盖已有数据 | ### `sync-stock-basic` — 同步 A 股基础信息 | 项目 | 说明 | |------|------| | 功能 | 调用 Baostock 获取全部 A 股代码、名称、上市日期等,写入 `stock_basic` 表 | | 使用方法 | `flask --app run.py sync-stock-basic` | | 参数 | 无 | | 执行条件 | **需联网** | | 预期结果 | 输出 `已同步 A 股基础信息 N 条到 stock_basic`;约 5000+ 条记录 | | 注意事项 | 建议每月执行一次以获取新股 | ### `sync-daily` — 增量同步日 K 数据 | 项目 | 说明 | |------|------| | 功能 | 对库内所有股票,从各股最新交易日续拉日 K 到今日;无数据的股票从默认起始日拉取 | | 使用方法 | `flask --app run.py sync-daily` | | 参数 | `--start-date YYYY-MM-DD`(可选):覆盖配置中的默认起始日 | | 执行条件 | **需联网**;`stock_basic` 表已有股票列表 | | 预期结果 | 输出 `增量日线完成:写入 N 行,请求失败股票数 M` | | 注意事项 | 全量同步耗时较长;请求间隔受 `BAOSTOCK_REQUEST_SLEEP` 控制;失败股票可用 `retry_failed.py` 重试 | ### `seed-rules` — 初始化示例规则 | 项目 | 说明 | |------|------| | 功能 | 若 `activity_rule` 表为空,写入预设示例规则;已有规则则跳过 | | 使用方法 | `flask --app run.py seed-rules` | | 参数 | 无 | | 执行条件 | 无需联网 | | 预期结果 | 首次输出 `已写入示例规则 N 条`;再次输出 `activity_rule 已有数据,跳过示例规则` | ### `recognize` — 对指定交易日执行活跃度识别 | 项目 | 说明 | |------|------| | 功能 | 计算五维加权评分 + 规则匹配 + 大盘/板块评分,写入 `activity_score` 和 `activity_result` | | 使用方法 | `flask --app run.py recognize --date 2025-08-11` | | 参数 | `--date YYYY-MM-DD`(**必填**):需为实际交易日且库中已有该日行情 | | 执行条件 | 无需联网;`daily_quote` 已有该日数据;`activity_rule` 已有启用规则 | | 预期结果 | 输出 `trade_date=YYYY-MM-DD 有行情股票 N 只,个股评分 X 条,大盘评分 1 条,板块评分 Y 条,规则命中 Z 条` | | 注意事项 | 重复执行会覆盖旧结果(剔除状态重置) | ### `rescore` — 批量识别指定日期范围 | 项目 | 说明 | |------|------| | 功能 | 从 `daily_quote` 表中查找日期范围内的交易日,逐日执行五维评分 + 规则识别。既可重算已有评分,也可补算从未识别过的新日期 | | 使用方法 | `flask --app run.py rescore --start-date 2025-08-09 --end-date 2025-09-30` 或 `flask --app run.py rescore --days 30` | | 参数 | `--start-date YYYY-MM-DD`(与 `--days` 二选一):起始日期;`--end-date YYYY-MM-DD`(可选):结束日期,默认今天;`--days N`(与 `--start-date` 二选一):最近 N 个交易日 | | 执行条件 | 无需联网;`daily_quote` 表中已有对应日期范围的行情数据 | | 预期结果 | 输出待识别日期范围,逐日输出评分和命中条数;最终输出 `已完成 N 个交易日的识别` | | 注意事项 | **剔除状态会重置**;评分参数使用当前配置;`--days N` 按交易日计算(非日历日);若同时指定 `--days` 和 `--start-date`,以用户指定的 `--start-date` 为准 | ### `sync-industry` — 补全股票行业信息 | 项目 | 说明 | |------|------| | 功能 | 为 `industry` 为空的股票调用 Baostock 获取行业信息并写回 | | 使用方法 | `flask --app run.py sync-industry --max 100` | | 参数 | `--max N`(可选):最多补全数量,默认 50,上限 300 | | 执行条件 | **需联网** | | 预期结果 | 输出 `尝试 N 只,写入行业 M 条` | | 注意事项 | 大量缺失需多次执行或使用 `sync_industry_all.py` 全量补全 | ### `normalize-sectors` — 重算一级板块分类 | 项目 | 说明 | |------|------| | 功能 | 根据 `industry` 字段重新计算所有股票的 `sector_coarse`,全表更新 | | 使用方法 | `flask --app run.py normalize-sectors` | | 参数 | 无 | | 执行条件 | 无需联网;`stock_basic` 已有 `industry` 数据 | | 预期结果 | 输出 `已更新 sector_coarse:N 只股票` | ### `generate-report` — 生成指定日 HTML 日报 | 项目 | 说明 | |------|------| | 功能 | 汇总识别结果渲染 HTML 日报,写入 `REPORTS_DIR` | | 使用方法 | `flask --app run.py generate-report --date 2025-08-11` | | 参数 | `--date YYYY-MM-DD`(**必填**) | | 执行条件 | 无需联网;该日已有识别结果 | | 预期结果 | 输出日报摘要和文件路径 | | 注意事项 | 日报需通过站点 HTTP URL 访问,不可用 `file://` 直接打开 | --- ## 独立脚本(`scripts/` 目录) 独立脚本通过 `python scripts/<脚本名>.py` 直接执行。运行前需确保已激活虚拟环境且在项目根目录下。 ### `full_init.py` — 全量/抽样初始化 | 项目 | 说明 | |------|------| | 功能 | 一站式初始化:同步股票基础信息 + 日 K 行情,支持全量或抽样 | | 使用方法 | `python scripts/full_init.py [选项]` | | 参数 | `--start-date YYYY-MM-DD`(可选):日 K 起始日期,默认取配置值;`--end-date YYYY-MM-DD`(可选):日 K 结束日期,默认今天;`--max-stocks N`(可选):仅拉取前 N 只,0=全部(默认 0);`--basic-only`(可选):仅同步股票列表;`--skip-basic`(可选):跳过股票列表同步 | | 执行条件 | **需联网** | | 预期结果 | 输出 `[stock_basic] 写入 N 条` 和 `[daily_quote] 写入行数 M,失败股票数 K` | | 注意事项 | 全量耗时可能数小时;建议首次用 `--max-stocks 100` 抽样测试 | ### `daily_update.py` — 每日增量更新 | 项目 | 说明 | |------|------| | 功能 | 从各股最新交易日续拉日 K 到今天,适合收盘后定时执行 | | 使用方法 | `python scripts/daily_update.py` | | 参数 | 无 | | 执行条件 | **需联网** | | 预期结果 | 输出 `增量完成:写入 N 行,失败股票数 M,截止 YYYY-MM-DD` | | 注意事项 | 建议收盘后(15:30 以后)执行;可配置定时任务 | ### `batch_recognize.py` — 批量识别活跃股票 | 项目 | 说明 | |------|------| | 功能 | 对指定日期范围逐日执行活跃度识别 | | 使用方法 | `python scripts/batch_recognize.py --start-date 2026-03-01 --end-date 2026-05-08` 或 `python scripts/batch_recognize.py --days 60` | | 参数 | `--start-date YYYY-MM-DD`(与 `--days` 二选一);`--end-date YYYY-MM-DD`(可选,默认今天);`--days N`(与 `--start-date` 二选一):最近 N 天 | | 执行条件 | 无需联网;`daily_quote` 已有对应日期数据;`activity_rule` 已有启用规则 | | 预期结果 | 逐日输出评分和命中条数,最终汇总 | | 注意事项 | 识别会覆盖旧结果 | ### `retry_failed.py` — 重试失败股票同步 | 项目 | 说明 | |------|------| | 功能 | 查询有基础信息但无日 K 数据的股票,重新尝试同步 | | 使用方法 | `python scripts/retry_failed.py [选项]` | | 参数 | `--max-stocks N`(可选):最多重试数量,默认 50;`--start-date YYYY-MM-DD`(可选);`--end-date YYYY-MM-DD`(可选) | | 执行条件 | **需联网** | | 预期结果 | 输出 `成功写入:M 行,仍失败:K 只股票` | | 注意事项 | 可多次运行逐步补全 | ### `backfill_scores.py` — 回填大盘和板块活跃度评分 | 项目 | 说明 | |------|------| | 功能 | 对有行情但缺评分的日期,执行识别补充评分数据 | | 使用方法 | `python scripts/backfill_scores.py` | | 参数 | 无(日期范围硬编码在脚本内,使用前需修改) | | 执行条件 | 无需联网;需在项目根目录执行 | | 预期结果 | 输出回填统计(评分覆盖天数、大盘/板块记录数) | | 注意事项 | 使用 Flask 应用上下文;日期范围需按需修改脚本内常量 | ### `backfill_market_sector.py` — 补充缺失的大盘/板块评分 | 项目 | 说明 | |------|------| | 功能 | 对已有个股评分但缺大盘/板块评分的日期补充数据 | | 使用方法 | `python scripts/backfill_market_sector.py` | | 参数 | 无(日期范围硬编码在脚本内,使用前需修改) | | 执行条件 | 无需联网;需在项目根目录执行 | | 预期结果 | 输出补充统计 | | 注意事项 | 与 `backfill_scores.py` 的区别:仅补大盘/板块缺失的日期 | ### `sync_industry_all.py` — 全量补全行业数据 | 项目 | 说明 | |------|------| | 功能 | 遍历 `industry` 为空的全部股票,调用 Baostock 获取行业信息并写入 | | 使用方法 | `python -u scripts/sync_industry_all.py` | | 参数 | 无 | | 执行条件 | **需联网**;需在项目根目录执行 | | 预期结果 | 输出补全统计和全量行业覆盖率 | | 注意事项 | **必须加 `-u` 参数**禁用输出缓冲;全量约 5000 只需约 5 分钟 | ### `diagnose_industry.py` — 行业分类数据质量诊断 | 项目 | 说明 | |------|------| | 功能 | 诊断行业分布完整状态,输出覆盖率、板块分布、映射对比、数据质量检查等七项分析 | | 使用方法 | `python scripts/diagnose_industry.py` | | 参数 | 无 | | 执行条件 | 无需联网;需在项目根目录执行 | | 预期结果 | 输出七段详细分析报告 | | 注意事项 | 只读诊断脚本,不修改数据 | ### `compare_industry_mapping.py` — 新旧行业分类映射对比 | 项目 | 说明 | |------|------| | 功能 | 对比旧映射(12 板块)vs 新映射(申万 31 行业)的效果差异 | | 使用方法 | `python scripts/compare_industry_mapping.py` | | 参数 | 无 | | 执行条件 | 无需联网;需在项目根目录执行 | | 预期结果 | 输出误分类率改善、编码提取成功率、变更明细 | | 注意事项 | 只读诊断脚本,不修改数据 | ### `evaluate_market_scope.py` — 评估大盘评分计算范围方案 | 项目 | 说明 | |------|------| | 功能 | 对比沪深300 vs 全市场方案的数据特征差异(换手率、振幅、涨停占比、噪声、性能、趋势稳定性) | | 使用方法 | `python scripts/evaluate_market_scope.py` | | 参数 | 无 | | 执行条件 | **需联网**(获取沪深300列表,失败回退本地缓存);需在项目根目录执行 | | 预期结果 | 输出指标对比表、噪声分析、性能对比、趋势稳定性分析 | | 注意事项 | 只读分析脚本,不修改数据 | ### `update_rules.py` — 更新识别规则(极严格版) | 项目 | 说明 | |------|------| | 功能 | 删除所有旧规则,插入 5 条极严格版规则(顶级活跃、量能爆炸、超级异动、强势突破、高波动放量) | | 使用方法 | `python scripts/update_rules.py` | | 参数 | 无 | | 执行条件 | 无需联网 | | 预期结果 | 输出 `规则更新完成!当前规则数量:5条` | | 注意事项 | **会删除所有旧规则**,执行前请确认是否需要备份 | ### `_fetch_hs300.py` — 获取沪深300成分股列表 | 项目 | 说明 | |------|------| | 功能 | 获取沪深300成分股列表保存到 `data/hs300_codes.txt` | | 使用方法 | `python scripts/_fetch_hs300.py` | | 参数 | 无 | | 执行条件 | **需联网**;需在项目根目录执行 | | 预期结果 | `data/hs300_codes.txt` 文件已生成 | | 注意事项 | 内部辅助脚本,一般不需要单独运行 | --- ## 应用启动 | 项目 | 说明 | |------|------| | 开发环境 | `python run.py`(默认 `127.0.0.1:5000`,`debug=True`) | | Flask 方式 | `flask --app run.py run --host 0.0.0.0 --port 5000` | | 生产环境 | 使用 WSGI 服务器(如 gunicorn、waitress),关闭 `debug`,修改 `SECRET_KEY` | ## Web 页面与路由 | 路由前缀 | 页面 | 主要功能 | |---------|------|--------| | `/` | 首页 | 统计摘要、趋势图(含大盘评分)、行业饼图、规则命中柱状图、成交量排名、板块雷达图、阈值输入框联动 | | `/stocks/` | 股票 | 股票列表、搜索分页、单股日线与 K 线图、个股活跃度评分对比 | | `/rules/` | 规则 | 规则 CRUD、快捷模板、条件构建器、触发识别 | | `/active/` | 活跃股 | 按日活跃列表、剔除/恢复(异步操作) | | `/charts/` | 图表 | 行业分布饼图/柱状图、活跃趋势折线图(含大盘评分) | | `/reports/` | 报告 | 日报列表、查看、生成 | | `/settings/` | 设置 | 活跃度阈值修改(数字输入框+实时预览)、五维权重展示 | ### 首页图表组件 | 图表 | 类型 | 阈值联动 | |------|------|---------| | 活跃趋势 | 双Y轴折线图(活跃股数 + 规则命中 + 大盘评分) | ✅ | | 行业分布 | 饼图 | ✅ | | 规则命中 | 水平条形图 | ❌ | | 板块雷达 | 雷达图(Top 8 板块五维评分对比) | ❌ | | 成交量前十 | 水平条形图 | ❌ | ### 设置页 API | 端点 | 方法 | 说明 | |------|------|------| | `/settings/` | GET | 设置页面 | | `/settings/update-threshold` | POST | 更新阈值(支持 JSON 和表单提交) | | `/settings/api/trend-data` | GET | 趋势数据(支持 `threshold` 和 `limit` 参数) | | `/settings/api/industry-data` | GET | 行业分布数据(支持 `threshold` 和 `date` 参数) | | `/settings/api/rule-hit-data` | GET | 规则命中统计(支持 `date` 和 `limit` 参数) | | `/settings/api/sector-radar-data` | GET | 板块雷达图数据(支持 `date` 和 `top_n` 参数) | ## 规则条件 JSON(摘要) 根对象包含 `logic`(`AND` / `OR`)与 `conditions` 数组。每项含: - `field`:`turnover_rate`(%)、`amplitude`(小数)、`volume`、`volume_ratio`、`close` - `op`:`>=`、`<=`、`>`、`<`、`==` - `value`:数字 示例: ```json {"logic":"AND","conditions":[{"field":"turnover_rate","op":">=","value":3}]} ``` 详细设计见仓库内《活跃股票识别系统-项目说明.md》。 ## 测试 项目包含 237 个自动化测试: ```bash # 运行全部测试 python -m pytest tests/ -v --tb=short # 运行特定测试文件 python -m pytest tests/test_routes.py -v python -m pytest tests/test_comprehensive.py -v python -m pytest tests/test_score.py -v ``` | 测试文件 | 测试数 | 覆盖范围 | |---------|--------|---------| | `test_score.py` | 82 | 五维评分算法、分段映射、权重计算 | | `test_industry_sector.py` | 36 | 行业板块分类、板块评分 | | `test_repo_and_engine.py` | 28 | 数据仓库、规则引擎 | | `test_routes.py` | 24 | 路由功能、设置页阈值(12 项) | | `test_comprehensive.py` | 46 | 边界条件、兼容性、性能、安全性 | ## 注意事项 1. **Baostock** 依赖外网;同步与补全行业时需能访问其服务。 2. **识别** 依赖库中已有对应交易日的 `daily_quote`;日期请使用实际交易日。 3. **日报与 ECharts**:报告若含脚本图表,请通过本站点 URL 打开,不要用本地 `file://` 直接打开文件。 4. 生产部署请修改 `SECRET_KEY`,并关闭 `run.py` 中的 `debug=True`,改用 `gunicorn` 等 WSGI 服务器(按需自行配置)。 5. **活跃度阈值**:默认 50 分,可在设置页在线修改(即时生效),也可通过环境变量 `ACTIVITY_THRESHOLD` 设置。 6. **评分参数**:修改 `ACTIVITY_SCORE_WEIGHTS` 或 `ACTIVITY_SCORE_THRESHOLDS` 后,需重新执行 `flask --app run.py rescore` 命令才能使新参数生效。 7. **大盘/板块评分**:以特殊 code(`_MARKET_`、`_SECTOR_*`)存储,所有个股统计已自动排除,无需手动处理。 8. **默认起始日期**:`BAOSTOCK_DEFAULT_START` 配置为 `2025-08-09`,文档中所有命令示例均与此默认值保持一致。此前文档使用 `2024-01-01` 或 `2024-06-01` 作为示例起始日,与实际默认配置不一致,且时间跨度过大(从 2024-01-01 至今约 17 个月、约 5000 只股票 × 350 个交易日 ≈ 175 万行日 K 数据),全量同步耗时可能超过 10 小时,对初次部署和演示极不友好。采用 `2025-08-09` 作为默认起始日(约 9 个月、约 190 个交易日 ≈ 95 万行),在保证数据充分覆盖五维评分所需统计窗口的同时,将初始化耗时控制在合理范围(约 2-3 小时全量、30 分钟抽样 100 只)。 ## 许可证与声明 本项目为毕设学习用途。行情数据来源于 Baostock,不构成投资建议。