基于 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%)
需要 Python ≥ 3.11。推荐使用项目根目录下的 .venv:
python3.11 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"所有需要配置的环境变量都集中在仓库根目录的 .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。
# 数据下载演示(拉取贵州茅台 + 平安银行 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_reportscripts/daily_signal_scan 跑出的信号会自动在本地模拟账户上成交:
- 持久化在
data/paper_account.db(SQLite,.gitignore已忽略) - 默认初始资金 100 万,双边手续费万 2.5(在
config.yaml的broker.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 风险"规则顺序(短路):
- 黑名单 — 对 BUY/SELL 都生效;
- 日亏损熔断 — 仅拦截 BUY,SELL(止损/平仓)总是放行;
- 单股仓位上限 — 仅对 BUY 生效,需要真实账户净值才会启用。
# 全部单测
pytest
# 带覆盖率报告
pytest --cov=config --cov=data --cov=signals --cov=scripts \
--cov=strategies --cov=backtest --cov-report=term-missing
# 仅跑快速单测
pytest -m unit# 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,规划中) |
- docs/roadmap.md — 阶段化进度看板
- docs/reference-projects.md — A 股量化开源生态调研
MIT — 仅供个人学习与研究使用,不构成投资建议。