Skip to content

Repository files navigation

A 股量化交易系统

基于 Python 的 A 股自动化交易系统,支持回测、信号生成、半自动交易。

当前阶段:数据层 ✅ → 回测引擎 ✅ → 飞书信号推送 ✅。 进度详见 docs/roadmap.md

项目结构

quant-trading/
├── data/             # 行情获取与本地存储 (AKShare → Parquet)
├── strategies/       # Backtrader 策略 (双均线 / 布林带均值回归)
├── backtest/         # 回测引擎 + 绩效 + 网格搜索 + 组合回测
├── risk/             # 风控 (黑名单 / 单股仓位 / 日亏损熔断)
├── signals/          # 飞书 Bot 推送
├── broker/           # 模拟券商 (PaperBroker, SQLite 持久化)
├── config/           # 配置文件与 Settings
├── utils/            # 通用工具
├── notebooks/        # Jupyter 分析笔记
├── scripts/          # 定时任务入口 (cron)
├── examples/         # 可执行示例
└── tests/            # 单元测试 (覆盖率 ≥ 95%)

快速开始

1. 环境搭建

需要 Python ≥ 3.11。推荐使用项目根目录下的 .venv

python3.11 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

2. 配置

所有需要配置的环境变量都集中在仓库根目录的 .env.example 中, 按"必需 / 可选"分组并附用途说明。复制一份再填:

cp .env.example .env
$EDITOR .env
export $(grep -v '^#' .env | xargs)        # 加载到当前 shell

最小可用配置只需一个变量:

export QT_FEISHU_WEBHOOK="https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx"

非敏感参数(watchlist、回测初始资金、手续费等)在 config/config.yaml 中调整。 敏感信息(webhook、token)一律走环境变量,不要写进 yaml。

3. 运行示例

# 数据下载演示(拉取贵州茅台 + 平安银行 1 年日线)
python -m examples.demo_data

# 回测演示(双均线 + 均值回归 各跑一遍,结束后自动推送报告到飞书)
python -m examples.run_backtest

# 网格搜索:穷举 SMA 参数组合,按夏普排序,找最优 + 暴露过拟合
python -m examples.run_optimization

# 组合回测:watchlist 多只股票同时跑同一策略,资金等权分配
python -m examples.run_portfolio

# 单条信号推送(飞书 Webhook 已配置时生效)
python -m examples.send_signal

# 每日收盘简报(适合放进 cron)
python -m scripts.daily_report

# 每日信号扫描:扫描 → 风控过滤 → 模拟成交 → 飞书账户简报
python -m scripts.daily_signal_scan

# 账户每日简报(独立于信号扫描,仅查看模拟账户状态)
python -m scripts.account_report

模拟账户

scripts/daily_signal_scan 跑出的信号会自动在本地模拟账户上成交:

  • 持久化在 data/paper_account.db(SQLite,.gitignore 已忽略)
  • 默认初始资金 100 万,双边手续费万 2.5(在 config.yamlbroker.paper 段调整)
  • 风控规则使用真实账户上下文 —— 黑名单、单股仓位上限、日亏损熔断三条全部生效

查看当前账户状态:

from broker import open_paper_broker
b = open_paper_broker()
print("现金:", b.get_cash())
print("持仓:", b.get_positions({}))
print("最近成交:", b.list_trades(limit=10))
print("历史快照:", b.list_snapshots(limit=10))

当前是纯本地模拟。macOS 同花顺客户端没有公开 API,EasyTrader/xtquant 仅 Windows, 接入真实账户需要走正式券商 API(华泰 PTrade / 中信 Q-API / 盈透 IB Gateway)。

风控规则

config/config.yaml 中的 risk: 段控制 daily_signal_scan 推送前的过滤:

risk:
  max_position_pct: 0.30        # 单股最大仓位占比(接入实盘后生效)
  daily_loss_limit_pct: -3.0    # 当日组合亏损 ≤ 此值时熔断 BUY 信号
  blacklist:
    - code: "688999"
      reason: "ST 风险"

规则顺序(短路):

  1. 黑名单 — 对 BUY/SELL 都生效;
  2. 日亏损熔断 — 仅拦截 BUY,SELL(止损/平仓)总是放行;
  3. 单股仓位上限 — 仅对 BUY 生效,需要真实账户净值才会启用。

4. 测试

# 全部单测
pytest

# 带覆盖率报告
pytest --cov=config --cov=data --cov=signals --cov=scripts \
       --cov=strategies --cov=backtest --cov-report=term-missing

# 仅跑快速单测
pytest -m unit

定时任务(cron 示例)

# A 股 15:00 收盘后 30 分钟推送每日简报
30 15 * * 1-5 cd /path/to/quant-trading && \
  QT_FEISHU_WEBHOOK="https://open.feishu.cn/..." \
  .venv/bin/python -m scripts.daily_report >> logs/daily.log 2>&1

# 收盘后 35 分钟扫描策略信号 + 模拟成交 + 推送
35 15 * * 1-5 cd /path/to/quant-trading && \
  QT_FEISHU_WEBHOOK="https://open.feishu.cn/..." \
  .venv/bin/python -m scripts.daily_signal_scan >> logs/scan.log 2>&1

# 收盘后 50 分钟推送账户简报(即使没新信号也会发)
50 15 * * 1-5 cd /path/to/quant-trading && \
  QT_FEISHU_WEBHOOK="https://open.feishu.cn/..." \
  .venv/bin/python -m scripts.account_report >> logs/account.log 2>&1

技术栈

层级 方案
语言 Python 3.11
数据源 AKShare(新浪 → 主,东财 → 备)
回测 Backtrader
存储 Parquet(按股票分文件)
通知 飞书 Bot Webhook
实盘 同花顺客户端(EasyTrader / xtquant,规划中)

文档

License

MIT — 仅供个人学习与研究使用,不构成投资建议

About

A股量化交易系统 - paper trading + 多账户 AI 策略 + 板块资金流追踪

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages