此前仓库无任何依赖声明。按 AST 扫描全部 import 后按用途切分:
requirements.txt 为核心运行时 8 个包,requirements-dev.txt 追加测试与
research/ 所需。
matplotlib / mplfinance / xgboost / scikit-learn 只出现在 ChanPY.py、
ChanLun_Classifier.py、Find_Trend.py、ChanHeng.py 这四个零引用文件中,
故不纳入清单;ChanPY.py 依赖的外部 chan.py 库本就未安装。
README 记录目录结构、启动方式、库用法、分析流程九步与数据约定,并注明
三处现存问题:web/DEPLOY_GUIDE.md 引用的 6 个部署脚本已在 7f393b9 删除、
web/README.txt 指向不存在的 web/requirements.txt、systemd unit 的端口
8123 与 config.py 默认的 8128 不一致且 gunicorn 未声明。
清单已在全新空 venv 中验证:仅装 requirements.txt 时 57 个模块可导入、
Flask 16 条路由正常;装 dev 清单后测试 24 通过。
Co-authored-by: Cursor <cursoragent@cursor.com>
131 lines
5.6 KiB
Markdown
131 lines
5.6 KiB
Markdown
# Chan — 缠论分析引擎
|
||
|
||
把 OHLCV K 线拆成缠论结构(K 线单元 → 合并 K 线 → 分型 → 笔 → 线段 → 中枢 → 买卖点),
|
||
配一个 TradingView Charting Library 的 Web 界面,外加一套验证信号有效性的回测脚本。
|
||
|
||
标的不限:加密永续(ccxt)与 A 股(akshare)都走同一条分析链路。
|
||
|
||
```
|
||
chanlun/ 缠论引擎,纯 pandas/numpy,无外部指标库依赖
|
||
web/ Flask API + 图表界面
|
||
research/ 信号有效性验证脚本(step1 ~ step30)
|
||
data/ 本地 K 线(freqtrade 的 feather 格式)
|
||
```
|
||
|
||
## 安装
|
||
|
||
需要 Python ≥ 3.11(pandas 3.x / numpy 2.x 的要求,不是本项目代码的限制)。
|
||
|
||
```bash
|
||
python -m venv .venv
|
||
.venv/bin/pip install -r requirements.txt # 核心运行时,8 个包
|
||
.venv/bin/pip install -r requirements-dev.txt # 另加测试与 research/ 所需
|
||
```
|
||
|
||
## 跑 Web
|
||
|
||
```bash
|
||
cd web
|
||
../.venv/bin/python app.py # 默认 http://0.0.0.0:8128
|
||
```
|
||
|
||
从仓库根跑 `.venv/bin/python web/app.py` 也可以——Python 会把脚本所在目录放进 `sys.path`。
|
||
但**不能用 `python -m web.app`**,也不能 `import web.app`:`web/` 内部是无前缀导入
|
||
(`import config`、`from api.analyze import bp`),`-m` 方式下 `sys.path` 里是仓库根而不是
|
||
`web/`,会 `ModuleNotFoundError: No module named 'config'`。
|
||
|
||
配置全部走环境变量,见 `web/config.py`:
|
||
|
||
| 变量 | 默认值 | 用途 |
|
||
|------|--------|------|
|
||
| `FLASK_HOST` / `FLASK_PORT` | `0.0.0.0` / `8128` | 监听地址 |
|
||
| `DATA_SERVICE_URL` | `https://provider.jackyu66.com` | 行情 REST 源 |
|
||
| `DATA_SERVICE_WS_URL` | `wss://jackyu66.com/ws` | 行情 WebSocket 源 |
|
||
| `ASHARE_DP_URL` | `http://103.179.242.166:8000` | A 股数据源 |
|
||
| `CHAN_HTTP_PROXY` | 未设置则不走代理 | ccxt / HTTP 代理 |
|
||
| `MACD_FACTOR` / `MACD_SMOOTH` | `1` / `1` | MACD 周期倍数,默认 12/26/9 |
|
||
|
||
主要接口:`GET /api/analyze` 返回某标的某周期的完整缠论结构,`/api/klines/recent`
|
||
取最新 K 线,`/api/trend_filter` 与 `/api/trend_detail` 做多周期趋势筛选,
|
||
`/api/symbols`、`/api/search_stock`、`/api/sectors` 等负责标的检索。页面在 `/` 与 `/chan_tv`。
|
||
|
||
## 作为库使用
|
||
|
||
```python
|
||
import pandas as pd
|
||
from chanlun import TF_DF
|
||
|
||
# 需要 date/open/high/low/close/volume 六列,date 为 datetime
|
||
df = pd.read_feather("data/binance/futures/BTC_USDT_USDT-1h-futures.feather")
|
||
|
||
tf = TF_DF(df, interval=1, timeframe="1h")
|
||
|
||
len(tf.klu_list) # K 线单元
|
||
len(tf.klc_list) # 合并 K 线(处理包含关系后)
|
||
len(tf.bi_list) # 笔
|
||
len(tf.seg_list) # 线段
|
||
len(tf.zs_list) # 中枢
|
||
tf.bi_list[-1].dir # Chan_BI_DIR.DOWN
|
||
tf.chanmacd # MACD 结构分析(背驰判定用)
|
||
```
|
||
|
||
**`interval` 的单位是分钟**,对传入的 df 做重采样;`interval=1` 是特例,表示原样使用、
|
||
不重采样。所以拿 1h 的 feather 要传 `interval=1`,拿 1m 数据想看 1h 才传 `interval=60`:
|
||
|
||
```python
|
||
df1m = pd.read_feather("data/binance/futures/BTC_USDT_USDT-1m-futures.feather")
|
||
TF_DF(df1m, interval=5, timeframe="5m")
|
||
TF_DF(df1m, interval=60, timeframe="1h")
|
||
```
|
||
|
||
传错不会报错,只会静默给出错误周期的结构——1h 数据配 `interval=4` 相当于按 4 分钟
|
||
重采样,结果与 `interval=1` 完全相同。
|
||
|
||
## 分析流程
|
||
|
||
`TF_DF.init_TF_DF()` 按顺序做这几步,每步的实现在 `chanlun/pipeline/builders/` 下同名文件:
|
||
|
||
1. `resample_to_interval` — 重采样(`interval != 1` 时)
|
||
2. `add_indicators` — 追加 33 列指标(MACD / BBANDS / EMA / RSI / ATR 等)
|
||
3. `cal_kl_data` → `klu_list` — K 线单元
|
||
4. `get_klc_list` → `klc_list` — 按包含关系合并 K 线,并标记分型
|
||
5. `cal_bi_list` → `bi_list` — 笔
|
||
6. `cal_bi_zs_list_pure` → `bi_zs_list` — 笔中枢
|
||
7. `get_seg_list` → `seg_list` — 线段
|
||
8. `get_zs_list` / `get_big_zs_list` — 中枢与大级别中枢
|
||
9. `ChanMACD(klu_list)` — MACD 段 / 柱堆结构,供背驰判定
|
||
|
||
## 数据
|
||
|
||
`data/<交易所>/futures/<SYMBOL>-<周期>-futures.feather`,即 freqtrade 的下载格式,
|
||
如 `data/binance/futures/BTC_USDT_USDT-1h-futures.feather`。
|
||
`research/lib/data.py` 负责定位:`BTC/USDT:USDT` + `1h` 会解析到上面这个路径,
|
||
找不到本地文件则回落到远端拉取。
|
||
|
||
## 测试
|
||
|
||
```bash
|
||
.venv/bin/python -m pytest chanlun/tests web/tests -q
|
||
```
|
||
|
||
`chanlun/tests/test_ta_compat.py` 有个**需要注意的陷阱**:它把 `chanlun/indicators/ta.py`
|
||
的输出逐 bar 钉在 TA-Lib 上,但 **TA-Lib 不存在时会静默跳过**。也就是说改了 `ta.py`
|
||
之后在没装 TA-Lib 的环境里跑,测试会显示通过,其实一项都没验证。改动那个文件时请先装:
|
||
|
||
```bash
|
||
sudo apt-get install -y libta-lib0 ta-lib-dev
|
||
.venv/bin/pip install TA-Lib technical
|
||
```
|
||
|
||
## 已知问题
|
||
|
||
- **`web/DEPLOY_GUIDE.md` 已失效**:它引用的 `deploy_venv.sh`、`stop_venv.sh`、
|
||
`status_venv.sh` 等 6 个脚本都在 `7f393b9` 精简提交里删掉了,目前没有部署脚本。
|
||
两个 systemd unit 文件(`web/chanlun-web*.service`)仍可参考,但它们用 gunicorn
|
||
且写死端口 8123,与 `config.py` 默认的 8128 不一致,gunicorn 也不在依赖清单里。
|
||
- **`web/README.txt` 已过时**:它说的 `web/requirements.txt` 不存在,依赖清单在仓库根目录。
|
||
- **四个零引用的死文件**:`chanlun/analysis/` 下的 `ChanPY.py`、`ChanLun_Classifier.py`、
|
||
`Find_Trend.py`、`ChanHeng.py` 全项目无人引用。`ChanPY.py` 依赖未安装的外部 chan.py 库,
|
||
另外三个需要 matplotlib / mplfinance / xgboost / scikit-learn——这些都**不在**依赖清单里,
|
||
是有意为之。要用得自行安装。
|