# ashare-quant-analysis **Repository Path**: meihongliang/ashare-quant-analysis ## Basic Information - **Project Name**: ashare-quant-analysis - **Description**: a股量化分析 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-01 - **Last Updated**: 2026-08-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # A股量化分析建议软件 基于 akshare 免费数据 + 多因子评分的 A 股投资建议工具。核心产出:**投资建议列表(每条带原因)**。 ## 特性 - ✅ 只针对国内 A 股(腾讯行情源,一次调用拿全市场含 PE/PB/市值/量比/主力资金) - ✅ 多因子评分:趋势 / 动量 / 量能 / 价值 四维加权,生成 `强烈买入 / 买入 / 持有 / 观望 / 卖出` 建议 - ✅ 每条建议带具体原因(MACD 金叉、站上 MA20、PE 低估、放量上涨…) - ✅ 交互式 K 线(蜡烛 + 均线 + 成交量)、MACD/RSI/KDJ 副图、评分环、因子进度条 - ✅ 多主题系统:右上角切换,新增风格只改一个 dict - ✅ 防封 IP:全局限速 + 随机抖动 + 指数退避重试,快照 5 分钟内不重复请求 - ✅ 三级缓存(内存 → SQLite → 网络),日 K 增量补缺漏,SQLite 持久化 ## 技术架构 ### 技术栈 | 层 | 选型 | 用途 | |---|---|---| | 语言 | Python 3.11 | 生态成熟,akshare/pandas 兼容性最稳 | | 数据源 | akshare(腾讯源) | 免费 A 股行情:`stock_zh_a_spot_tx` 全市场快照、`stock_zh_a_hist_tx` 日 K | | 数据处理 | pandas / numpy | 指标计算、因子评分、快照清洗 | | 存储 | SQLite(stdlib sqlite3) | 行情/快照/信号缓存持久化,免部署 | | 可视化 | Streamlit + Plotly | Web 界面 + 交互式 K 线 | | 主题 | CSS 变量 + 调色板 dict | 多主题动态切换 | ### 数据流 ``` 腾讯行情 API │ ① stock_zh_a_spot_tx 全市场快照(5534只, 一次调用~6s) │ ② stock_zh_a_hist_tx 单只日K(前复权) ▼ data/throttle.py 全局限速器:最小间隔1.2s + 随机抖动0.3-0.9s + 指数退避重试 ▼ data/fetcher.py 三级缓存:内存(TTL) → SQLite → 网络,只在全缺时才打接口 ▼ data/db.py SQLite 6表:stock_list / daily_bars / spot / fundamentals / signals / meta ▼ analysis/indicators.py 本地算 MA/MACD/RSI/KDJ/BOLL/量比(不打接口) ▼ analysis/scoring.py 四因子评分 → 建议 + 原因 ▼ analysis/screener.py 快照筛候选池(按成交额Top N) → 批量分析落库 ▼ app.py Streamlit 三视图(右上角切主题) ``` ### 模块职责 | 文件 | 职责 | |---|---| | `config.py` | 全部可调参数:限速间隔、缓存 TTL、候选池大小 | | `data/throttle.py` | 全局令牌限速 + 随机抖动 + 指数退避重试,所有网络调用统一过 | | `data/fetcher.py` | akshare 封装,三级缓存,代码↔交易所符号转换,降级容错 | | `data/db.py` | SQLite 建表/读写/幂等迁移,每线程独立连接 | | `analysis/indicators.py` | 纯 pandas 技术指标,`full()` 一次性叠加 | | `analysis/scoring.py` | 四因子评分 + 原因生成 + 操作分类 | | `analysis/screener.py` | 候选池筛选、批量分析生成器(带进度) | | `themes.py` | 主题库(调色板 dict),新增风格只改这里 | | `app.py` | Streamlit 三视图 + 主题注入 | | `demo.py` | 离线/在线自检 | ## 核心设计 ### 1. 防封 IP(`data/throttle.py`) - **全局令牌限速**:所有 akshare 网络调用间强制最小间隔(默认 1.2s)+ 随机抖动 0.3–0.9s,打散请求节奏,避免固定频率被识别 - **失败重试**:指数退避(2s → 4s),最多 2 次 - **快照节制**:全市场快照 5 分钟内不重复请求(meta 表时间戳 + 内存 TTL 双层守卫) - **降级容错**:接口失败静默返回缓存/空,不中断整个流程 ### 2. 三级缓存 ``` 请求 → 内存缓存(TTL) → SQLite → 网络 ``` - **内存**:快照/清单按 TTL 缓存,秒级响应;Streamlit `st.cache_data` 再兜一层 - **SQLite**:日 K 增量落库(`INSERT OR IGNORE`),再次分析只补缺漏日期;信号按天缓存,当天不重算 - **网络**:只有全部缺失才打接口,且走限速器 ### 3. 数据源选型(血泪坑) akshare 默认的 `stock_zh_a_spot_em` / `stock_zh_a_hist` 走**东方财富**,实测本机网络下**完全不可达**(直连 + 代理都超时)。故改用**腾讯源**: - `stock_zh_a_spot_tx`:一次调用拿全市场,字段比东财更全 —— 自带 `pe_ttm`、`pb`、`总市值`、`换手率`、`量比`、**5/20/60 日涨跌幅**、**主力净流入** - `stock_zh_a_hist_tx`:日 K 前复权,增量拉取 腾讯源快照字段极大简化了基本面评分(PE/PB/市值白送),无需逐股拉财务接口。 ### 4. 多因子评分模型(`analysis/scoring.py`) | 因子 | 权重 | 内容 | |---|---|---| | 趋势 | 0.35 | 股价 vs MA20/MA60、均线多头/空头排列、乖离率 | | 动量 | 0.35 | MACD 金叉死叉、红绿柱、RSI 区间、KDJ | | 量能 | 0.15 | 量比 + 涨跌配合(放量上涨/缩量回调) | | 价值 | 0.15 | PE/PB 经验估值带、市值弹性、ROE | - 每维 0–100 分,加权得总分 - 总分 → 操作:≥80 强烈买入 / ≥65 买入 / ≥50 持有 / ≥35 观望 / <35 卖出 - **每条原因**来自具体因子触发条件(如"MACD 金叉""站上 MA20""PE 低估区间"),满足"建议必带原因"要求 - 结果写 `signals` 表,按天缓存 ### 5. 主题系统(`themes.py`) - 调色板驱动:CSS 用 `var(--xxx)` 变量,Python 图表/评分环/徽章读同一个调色板 dict - 右上角下拉切换,实时生效 - **新增风格**:往 `THEMES` 加一个调色板 dict,无需改任何其它代码 ### 6. SQLite 表设计 | 表 | 作用 | 缓存策略 | |---|---|---| | `stock_list` | 股票清单 | 周级 | | `daily_bars` | 日 K 线 (code,date 唯一) | 增量补缺 | | `spot` | 全市场快照 | 5 分钟 | | `fundamentals` | 个股基本面 | 周级 | | `signals` | 建议结果(评分+操作+原因JSON) | 按天 | | `meta` | 各数据源最后更新时间 | — | ## 快速开始 ```bash /opt/homebrew/bin/python3.11 -m venv .venv source .venv/bin/activate pip install -r requirements.txt streamlit run app.py ``` 浏览器打开 http://localhost:8501。 ## 使用 1. **投资建议列表**(默认页):点「开始/更新分析」→ 快照筛候选池 → 逐只评分(首次约数分钟,受限速保护)→ 评分排序,看原因,导出 CSV 2. **市场概览**:两市涨跌分布、涨停/跌停、涨幅/成交额/超跌榜 3. **个股分析**:搜索股票 → K 线 + 技术指标 + 估值 + 建议原因 右上角切换 4 套主题(卡其绿 / 深色金融 / 浅色简洁 / 深蓝科技)。 ## 自检 ```bash python demo.py # 离线:合成数据验证指标与建议结构 python demo.py --live 600519 # 在线:拉真实股票走完整链路(需网络) ``` ## 新环境部署 data.db 不用推送,首次启动自动建表(`app.py` 加载时执行 `db.init_db()`)。 ```bash git clone cd ashare-quant-analysis # 建 venv(macOS 用 Homebrew Python 3.11) source .venv/bin/activate pip install -r requirements.txt streamlit run app.py ``` 两点环境依赖:① Python 3.11(3.14 下 akshare 兼容未测);② 网络可达腾讯行情源。 ## 扩展 - **新主题**:`themes.py` 的 `THEMES` 加一个 dict - **新因子**:`analysis/scoring.py` 加一个 `_score_xxx()`,权重加进 `WEIGHTS` - **候选池大小**:`config.py` 的 `POOL_SIZE` - **限速频率**:`config.py` 的 `MIN_INTERVAL` / `JITTER_MIN` / `JITTER_MAX` ## 目录 ``` config.py 全局参数 data/ db.py SQLite 建表与读写 throttle.py 全局限速 + 抖动 + 重试退避 fetcher.py akshare 封装,三级缓存 analysis/ indicators.py 技术指标(本地计算) scoring.py 多因子评分 → 带原因建议 screener.py 候选池筛选 + 批量分析 themes.py 主题库 app.py Streamlit 三视图 demo.py 自检脚本 ``` ## 注意 - 建议仅供研究参考,不构成投资依据。 - 数据来自公开接口(akshare 腾讯行情源),存在延迟;东财源本网络不可达故未用。 - ROE/毛利率等深基本面依赖东财财务接口,不可达时自动降级(不影响评分)。 - 若代理导致国内行情源不通,把 `qt.gtimg.cn` 等加入 `NO_PROXY`。