143 lines
4.1 KiB
Markdown
143 lines
4.1 KiB
Markdown
# AITrading 基础设施 新增
|
||
|
||
本项目提供一个可直接在 Docker 中运行的量化交易基础设施,包含:
|
||
|
||
- Go 实时行情采集服务(Binance WebSocket K 线 + Redis Publisher 接口)
|
||
- Python 本地 K 线动态展示工具(pandas + mplfinance)
|
||
- Backtrader 回测框架(支持 Strategy Class 快速接入)
|
||
- Go 与 Python 之间统一 JSON 数据交换协议
|
||
|
||
## 目录结构
|
||
|
||
```text
|
||
.
|
||
├── docker-compose.yml
|
||
├── go-service
|
||
│ ├── Dockerfile
|
||
│ ├── go.mod
|
||
│ └── main.go
|
||
├── python-app
|
||
│ ├── Dockerfile
|
||
│ ├── requirements.txt
|
||
│ └── app
|
||
│ ├── data_protocol.py
|
||
│ ├── kline_viewer.py
|
||
│ ├── backtest_runner.py
|
||
│ ├── strategies
|
||
│ │ ├── __init__.py
|
||
│ │ └── sma_cross.py
|
||
│ └── sample_data
|
||
│ └── klines.jsonl
|
||
└── shared
|
||
└── protocol.md
|
||
```
|
||
|
||
## 快速启动(Docker)
|
||
|
||
默认已使用国内 Docker Hub 镜像前缀(`m.daocloud.io/docker.io/library`)加速基础镜像拉取。
|
||
如需切换其它镜像代理,可先设置:
|
||
|
||
```bash
|
||
export DOCKER_MIRROR_PREFIX=m.daocloud.io/docker.io/library
|
||
```
|
||
|
||
1. 构建并启动 Redis + Go 行情服务:
|
||
|
||
```bash
|
||
docker compose up --build redis go-service
|
||
```
|
||
|
||
2. 单独运行 Python 动态 K 线展示(实时订阅 Redis):
|
||
|
||
```bash
|
||
docker compose run --rm python-app python app/kline_viewer.py \
|
||
--redis-host redis \
|
||
--redis-port 6379 \
|
||
--channel kline.stream
|
||
```
|
||
|
||
3. 运行 Backtrader 回测(可指定自定义策略类):
|
||
|
||
```bash
|
||
docker compose run --rm python-app python app/backtest_runner.py \
|
||
--input app/sample_data/klines.jsonl \
|
||
--strategy strategies.sma_cross.SmaCrossStrategy \
|
||
--strategy-param fast=5 \
|
||
--strategy-param slow=13
|
||
```
|
||
|
||
4. 股票速查入口(输入代码/名称):
|
||
|
||
```bash
|
||
./start.sh local quote 600519
|
||
./start.sh local quote 贵州茅台
|
||
```
|
||
|
||
5. 启动简单前端页面(信息 + 曲线 + 买卖点):
|
||
|
||
```bash
|
||
./start.sh local web
|
||
```
|
||
|
||
打开浏览器访问:`http://localhost:8000`
|
||
|
||
## 多通道数据接入(解耦)
|
||
|
||
当前已将上层业务与下游数据源解耦,上层统一走 `market` 服务层:
|
||
|
||
- `MARKET_CHANNEL=cn` + `MARKET_PROVIDER=akshare`(默认)
|
||
- `MARKET_CHANNEL=cn` + `MARKET_PROVIDER=cmesdata`(需 `CMES_TOKEN`)
|
||
- `MARKET_CHANNEL=cn|hk|us` + `MARKET_PROVIDER=futu`(需本地运行 Futu OpenD)
|
||
|
||
示例:
|
||
|
||
```bash
|
||
export MARKET_CHANNEL=cn
|
||
export MARKET_PROVIDER=akshare
|
||
# 或使用 cmesdata
|
||
# export MARKET_PROVIDER=cmesdata
|
||
# export CMES_TOKEN=你的token
|
||
# 或使用 futu(需先启动 OpenD)
|
||
# export MARKET_PROVIDER=futu
|
||
# export FUTU_HOST=127.0.0.1
|
||
# export FUTU_PORT=11111
|
||
# export FUTU_MARKET=cn # 可选: cn/hk/us,默认跟随 MARKET_CHANNEL
|
||
# export FUTU_IS_ENCRYPT=0 # 可选: 1/0
|
||
```
|
||
|
||
说明:
|
||
|
||
- `web_app.py` 与 `stock_lookup.py` 不再直接依赖具体 SDK
|
||
- 新增市场(如 `us` / `hk`)时,只需新增 Provider 并在 `market/factory.py` 注册
|
||
- `futu` Provider 已接入:支持按代码/名称检索股票与日 K 线读取(通过 OpenD)
|
||
|
||
## Go 服务说明
|
||
|
||
- 默认订阅:`btcusdt` `1m` K 线
|
||
- 会将标准 JSON K 线数据打印到 stdout
|
||
- 预留 `RedisPublisher` 接口,默认实现为 `NoopPublisher`
|
||
- 若配置 Redis,将自动切换到 `RedisChannelPublisher`
|
||
|
||
可用环境变量:
|
||
|
||
- `BINANCE_SYMBOL`(默认 `btcusdt`)
|
||
- `BINANCE_INTERVAL`(默认 `1m`)
|
||
- `REDIS_ADDR`(例如 `redis:6379`)
|
||
- `REDIS_PASSWORD`(可选)
|
||
- `REDIS_DB`(默认 `0`)
|
||
- `REDIS_CHANNEL`(默认 `kline.stream`)
|
||
|
||
## Python 回测快速接入策略
|
||
|
||
你可以新增一个策略类并通过完整路径接入:
|
||
|
||
- 文件示例:`python-app/app/strategies/my_strategy.py`
|
||
- 类示例:`class MyStrategy(bt.Strategy): ...`
|
||
- 启动参数:`--strategy strategies.my_strategy.MyStrategy`
|
||
- 参数注入:`--strategy-param key=value`(可重复传入)
|
||
- 回测简报自动输出:`Final Value`、`Max Drawdown (%)`、`Sharpe Ratio`
|
||
|
||
## 协议定义
|
||
|
||
统一 JSON 格式位于 `shared/protocol.md`,Go 与 Python 都使用同一字段语义与时间戳单位(毫秒)。
|