5.2 KiB
5.2 KiB
期货行情分析系统 — 使用说明
基于 Docker + Python(tushare) 的中国期货行情分析系统。当前阶段已实现数据采集与三层加权打分模型,运行方式为脚本自动化(宿主机定时器触发 docker-compose run)。
环境准备
- Docker >= 20.10
- Docker Compose >= 2.0
- (可选) sqlite3 CLI 用于本地查库
快速开始
1. 配置 tushare token
将 token 写入 tushare/.env:
echo "TUSHARE_TOKEN=你的token" > tushare/.env
该文件已被 gitignore 排除,不会进入版本库。
2. 启动并跑当月主力
docker-compose run --rm tushare
不传参时,按 tushare/src/contracts.py 的 ROLLOVER_RULES 自动选 FG 玻璃当月主力(例如 2026-05 -> FG2609.ZCE),启动后会先打印 [AUTO] FG 当月主力 -> ...,然后:
- 从 tushare 拉取合约日线数据
- 写入 SQLite
data/futures.db - 运行三层打分模型
- 保存打分结果并输出到 stdout
- 通过 Bark 推送评分摘要
3. 跑其他合约或品种
# 显式指定合约
docker-compose run --rm tushare python -m src.main RB2510.SHF
docker-compose run --rm tushare python -m src.main I2601.DCE
# 按品种代号自动选当月主力(目前只配置了 FG)
docker-compose run --rm tushare python -m src.main --symbol FG
4. 玻璃 FG 主力轮换规则
| 当前自然月 | 主力合约 |
|---|---|
| 1、2、3 月 | 当年 05 |
| 4、5、6、7 月 | 当年 09 |
| 8、9、10、11 月 | 次年 01 |
| 12 月 | 次年 05 |
三层打分模型
综合分数公式
综合分数 = (短期动力 × 0.4) + (中期趋势 × 0.35) + (长期结构 × 0.25)
1. 短期动力(7 日窗口,权重 0.4)
逐日打分后取均值:
| 持仓变化 | 价格方向 | 得分 |
|---|---|---|
| 增仓 | 上涨 | 100(多头主动进攻) |
| 增仓 | 下跌 | 0(空头主动进攻) |
| 减仓 | 上涨 | 70(空头撤退) |
| 减仓 | 下跌 | 30(多头撤退) |
| 持平(|变化|<1%) | 上涨 | 60 |
| 持平(|变化|<1%) | 下跌 | 40 |
2. 中期趋势(15 日窗口,权重 0.35)
价格信号 = (今收 - 15日前收) / 15日前收
价格信号得分 = clamp(50 + 收益率×500, 0, 100)
资金意愿:
增仓上涨天数 > 增仓下跌天数 → 80
两者相当 → 50
增仓下跌天数 > 增仓上涨天数 → 20
模块得分 = 价格信号 × 0.6 + 资金意愿 × 0.4
3. 长期结构(30 日窗口,权重 0.25)
持仓变化幅度 = (30日日均持仓 - 30日前持仓) / 30日前持仓
> 10% → 90(显著增仓)
5%~10% → 70(温和增仓)
-5%~5% → 50(基本持平)
-10%~-5% → 30(温和减仓)
< -10% → 10(显著减仓)
信号解读
| 综合分数 | 信号 |
|---|---|
| 80-100 | 强烈看多 — 价格与资金共振 |
| 50-80 | 偏多/震荡偏强 |
| 40-50 | 偏空/震荡偏弱 |
| 0-40 | 强烈看空 — 资金主动打压 |
数据查询
SQLite 数据库位于 data/futures.db,可直接用 sqlite3 查询:
# 查看最新打分
sqlite3 data/futures.db "SELECT ts_code, trade_date, composite, signal FROM scores ORDER BY trade_date DESC LIMIT 5;"
# 查看合约日线
sqlite3 data/futures.db "SELECT trade_date, open, high, low, close, vol, oi FROM candles WHERE ts_code='FG2609.ZCE' ORDER BY trade_date DESC LIMIT 10;"
# 查看表结构
sqlite3 data/futures.db ".schema"
项目结构
trade/
├── docker-compose.yml # Docker Compose 编排
├── 使用说明.md # 本文件
├── data/ # SQLite 数据库目录(gitignored)
│ └── futures.db
├── .gitignore # Git 忽略配置
└── tushare/ # Python 数据服务
├── Dockerfile # 镜像构建
├── requirements.txt # Python 依赖
├── .env # TUSHARE_TOKEN(本地,不入库)
└── src/ # Python 包
├── models.py # 数据模型
├── fetcher.py # tushare 数据拉取
├── scorer.py # 打分模型核心
├── storage.py # SQLite 持久化
├── contracts.py # 主力合约轮换规则
├── notifier.py # Bark 推送
└── main.py # CLI 入口
技术栈
- Python 3.13 (alpine 基础镜像)
- tushare — 中国金融数据接口
- pandas — 数据处理
- SQLite — 本地数据存储
- Docker / Docker Compose — 容器化部署
常见问题
Q: 为什么某些日期返回空数据?
A: tushare 数据更新有延迟,且不同接口对 token 积分等级有要求。若 fut_daily 返回空但 trade_cal 正常,通常是该日期实际行情数据尚未入库。
Q: 合约代码格式?
A: 郑商所用 .ZCE 后缀(如 FG2609.ZCE),上期所用 .SHF,大商所用 .DCE。注意不是 .CZC。
Q: 如何定时自动跑?
A: 通过宿主机 cron / launchd 等定时器调用 docker-compose run --rm tushare ...。打分结束会通过 Bark 推送结果(见 tushare/src/notifier.py)。