From 7b6732488a5b89cf1422dea74e20611e1c690ea0 Mon Sep 17 00:00:00 2001 From: fish Date: Mon, 4 May 2026 23:08:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=96=87=E6=A1=A3=EF=BC=9A?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=89=E5=B1=82=E6=89=93=E5=88=86=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E6=8F=8F=E8=BF=B0=EF=BC=8C=E5=8F=8D=E6=98=A0=E7=9F=AD?= =?UTF-8?q?=E6=9C=9F=E5=B9=85=E5=BA=A6=E5=9B=A0=E5=AD=90=E3=80=81=E4=B8=AD?= =?UTF-8?q?=E6=9C=9F=E8=BF=9E=E7=BB=AD=E5=8C=96=E3=80=81=E9=95=BF=E6=9C=9F?= =?UTF-8?q?=E4=BB=B7=E6=A0=BC=E7=BB=B4=E5=BA=A6=E3=80=81=E6=B3=A2=E5=8A=A8?= =?UTF-8?q?=E7=8E=87=E8=B0=83=E6=95=B4=E7=AD=89=E6=96=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- CLAUDE.md | 2 +- README.md | 61 ++++++++++++++++++++++++++++++++++--------------------- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 504a17a..39692a5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -49,7 +49,7 @@ docker-compose -f docker-compose.trade.yml exec postgres psql -U trade -d future **主力轮换规则**(`contracts.py`):每个品种在 `ROLLOVER_RULES` 中维护 `month -> (主力月, 年份偏移)` 表。FG 当前规则:1-3/12 月→05、4-7 月→09、8-11 月→01,其中 8-11 月与 12 月跨年(`year_offset=1`)。新增品种(如 RB、I)只需在该 dict 里加一条,无需改 main 流程。 -**三层打分模型**(`scorer.py`):综合 = 短期(7日,0.4) + 中期(15日,0.35) + 长期(30日,0.25)。`score_daily()` 要求 DataFrame ≥31 行,`fetcher.fetch_contract` 默认拉一个合约的全历史(实际 100+ 行),按 `trade_date` 升序排列后供打分使用。打分结果通过 `dataclass ScoreResult` + `ScoreDetail` 流转,`storage.save_score` 把 detail 序列化为 `detail_json` 文本列。 +**三层打分模型**(`scorer.py`):综合 = (短期(7日,0.4) + 中期(15日,0.35) + 长期(30日,0.25)) × 波动率惩罚系数。短期引入幅度因子(价格/OI变化率)和量能确认,按象限(增仓涨/跌、减仓涨/跌、持平)给基础分再叠加加成;中期资金意愿连续化(50 + (增仓涨-增仓跌)/15×50);长期加入30日价格趋势分与OI趋势分 4:6 合成;高波动品种综合分打 85-100 折。`score_daily()` 要求 DataFrame ≥31 行,`fetcher.fetch_contract` 默认拉一个合约的全历史(实际 100+ 行),按 `trade_date` 升序排列后供打分使用。打分结果通过 `dataclass ScoreResult` + `ScoreDetail` 流转,`storage.save_score` 把 detail 序列化为 `detail_json` 文本列。 **PostgreSQL 作为业务数据库**:docker-compose 编排 `postgres:18.3-alpine3.23`,`tushare` 与 `web` 服务均通过 `DATABASE_URL` 连接。`storage.py` 使用 `psycopg3` 驱动,`candles` 与 `scores` 表以 `ON CONFLICT (ts_code, trade_date) DO UPDATE` 实现幂等,可反复重跑同一天。`scores` 表主键为 `UUID DEFAULT uuidv7() PRIMARY KEY`(见 `models.py` 与 `storage.py`)。 diff --git a/README.md b/README.md index 9fbad6c..9ef03e2 100644 --- a/README.md +++ b/README.md @@ -76,32 +76,39 @@ docker-compose -f docker-compose.trade.yml run --rm tushare python -m src.main - ### 综合分数公式 ``` -综合分数 = (短期动力 × 0.4) + (中期趋势 × 0.35) + (长期结构 × 0.25) +综合分数 = (短期动力 × 0.4 + 中期趋势 × 0.35 + 长期结构 × 0.25) × 波动率惩罚系数 ``` ### 1. 短期动力(7 日窗口,权重 0.4) -逐日打分后取均值: +逐日打分后取均值。每日评分 = (象限基础分 + 幅度加成) × 量能确认,产出 0-100 连续值。 -| 持仓变化 | 价格方向 | 得分 | -|---------|---------|------| -| 增仓 | 上涨 | 100(多头主动进攻) | -| 增仓 | 下跌 | 0(空头主动进攻) | -| 减仓 | 上涨 | 70(空头撤退) | -| 减仓 | 下跌 | 30(多头撤退) | -| 持平(\|变化\|<1%) | 上涨 | 60 | -| 持平(\|变化\|<1%) | 下跌 | 40 | +**象限基础分**(持仓与价格方向): + +| 象限 | 持仓变化 | 价格方向 | 基础分 | +|------|---------|---------|--------| +| accumulation(增仓上涨) | 增仓 | 上涨 | 75 | +| distribution(增仓下跌) | 增仓 | 下跌 | 25 | +| covering(减仓上涨) | 减仓 | 上涨 | 65 | +| liquidation(减仓下跌) | 减仓 | 下跌 | 20 | +| flat(持平) | \|变化\|<1% | 上涨 | 60 | +| flat(持平) | \|变化\|<1% | 下跌 | 40 | + +**幅度加成**(根据 OI 变化率和涨跌幅放大有利方向得分): +- OI 变化率封顶 5%,价格涨跌幅封顶 3% +- 增仓上涨 / 减仓下跌(有利方向):加成 = (OI 幅度 + 价格幅度) / 2 × 20 +- 持仓持平:加成 = 价格幅度 × 10 +- 增仓下跌 / 减仓上涨(不利方向):无加成 + +**量能确认**:`量比 = 当日成交量 / 7 日均量`,系数范围 [0.9, 1.2],量比 1.5 以上封顶 ### 2. 中期趋势(15 日窗口,权重 0.35) ``` -价格信号 = (今收 - 15日前收) / 15日前收 -价格信号得分 = clamp(50 + 收益率×500, 0, 100) +价格收益率 = (今收 - 15日前收) / 15日前收 +价格信号分 = clamp(50 + 收益率 × 500, 0, 100) -资金意愿: - 增仓上涨天数 > 增仓下跌天数 → 80 - 两者相当 → 50 - 增仓下跌天数 > 增仓上涨天数 → 20 +资金意愿 = 50 + (增仓上涨天数 - 增仓下跌天数) / 15 × 50 (连续值 0-100) 模块得分 = 价格信号 × 0.6 + 资金意愿 × 0.4 ``` @@ -109,15 +116,23 @@ docker-compose -f docker-compose.trade.yml run --rm tushare python -m src.main - ### 3. 长期结构(30 日窗口,权重 0.25) ``` -持仓变化幅度 = (30日日均持仓 - 30日前持仓) / 30日前持仓 +OI 趋势分 = clamp(50 + OI变化幅度 × 250, 0, 100) (权重 60%) +价格趋势分 = clamp(50 + 30日价格收益率 × 200, 0, 100) (权重 40%) -> 10% → 90(显著增仓) -5%~10% → 70(温和增仓) --5%~5% → 50(基本持平) --10%~-5% → 30(温和减仓) -< -10% → 10(显著减仓) +模块得分 = OI 趋势分 × 0.6 + 价格趋势分 × 0.4 ``` +### 4. 波动率调整 + +基于近 30 日日收益率标准差和 ATR%(平均真实波幅/均价): + +``` +日波动率 ≤ 1.5% → 惩罚系数 = 1.0(无惩罚) +日波动率 > 1.5% → 惩罚系数 = max(0.85, 1.0 - (日波动率 - 1.5%) × 10) +``` + +高波动品种的综合分会被适当打折,最低打 85 折。 + ### 信号解读 | 综合分数 | 信号 | @@ -237,7 +252,7 @@ docker-compose -f docker-compose.trade.yml logs -f web ### 3. 页面说明 -- **打分列表** `/scores`:按合约、日期、条数筛选,展示综合分/信号/三层得分;点击「明细」弹抽屉,显示短期 7 日逐日打分、中期(15d)价格收益与资金意愿、长期(30d)持仓变化。 +- **打分列表** `/scores`:按合约、日期、条数筛选,展示综合分/信号/三层得分;点击「明细」弹抽屉,显示短期 7 日逐日打分(涨跌幅/OI变化%/量比/象限)、中期(15d)价格收益与资金意愿、长期(30d)OI/价格趋势分与波动率调整。 - **K 线 / 持仓** `/chart`:选合约 + 日期区间,主图蜡烛(开高低收),副图持仓量曲线;鼠标拖选缩放。 - **用户管理** `/admin/users`:仅管理员可见。可创建子账号(`user` 默认,亦可建 `admin`)、重置密码、禁用/启用、删除;不允许对自己执行禁用或删除。