diff --git a/discuss/20260727-讨论.md b/discuss/20260727-讨论.md index 57a7e15..1c035ba 100644 --- a/discuss/20260727-讨论.md +++ b/discuss/20260727-讨论.md @@ -79,3 +79,89 @@ result = detect_converging_triangle(high, low, close, volume, params) - 分位数回归: `fit_boundary_quantile()` - 锚点拟合: `fit_boundary_anchor()` - 分发函数: `fit_pivot_line_dispatch()` + +# 拟合度分数低,强度分却整体偏高 + + +--- + +## 已实现:边界利用率分数(2026-01-27) + +### 问题分析 + +观察图中 SZ002748 世龙实业: +- 宽度比:0.12(非常收敛) +- 强度分:0.177(排名第三) +- 但肉眼观察:价格走势与三角形边界之间有**大量空白** + +**原因**: +- 原权重:收敛分 20%、拟合贴合度 15% +- 当宽度比 0.12 时,收敛分 = 1 - 0.12 = 0.88 +- 收敛分贡献 = 0.20 × 0.88 = 0.176 ≈ 全部强度分 +- **收敛分只衡量"形状收窄",不衡量"价格是否贴近边界"** + +### 解决方案 + +新增**边界利用率**分数,衡量价格走势对三角形通道空间的利用程度。 + +### 新增函数 + +```python +def calc_boundary_utilization( + high, low, + upper_slope, upper_intercept, + lower_slope, lower_intercept, + start, end, +) -> float: + """ + 计算边界利用率 (0~1) + + 对窗口内每一天: + 1. 计算价格到上下边界的距离 + 2. 空白比例 = (到上沿距离 + 到下沿距离) / 通道宽度 + 3. 当日利用率 = 1 - 空白比例 + + 返回平均利用率 + """ +``` + +### 新权重配置 + +| 分量 | 原权重 | 新权重 | 说明 | +|------|--------|--------|------| +| 突破幅度 | 50% | **50%** | 不变 | +| 收敛分 | 20% | **15%** | 降低 | +| 成交量分 | 15% | **10%** | 降低 | +| 拟合贴合度 | 15% | **10%** | 降低 | +| **边界利用率** | - | **15%** | 新增 | + +### 空白惩罚(新增) + +为避免“通道很宽但价格很空”的误判,加入空白惩罚: + + +``` +UTILIZATION_FLOOR = 0.20 +惩罚系数 = min(1, boundary_utilization / UTILIZATION_FLOOR) +最终强度分 = 原强度分 × 惩罚系数 +``` + +当边界利用率明显偏低时,总分会被进一步压制。 + +### 结果字段 + +`ConvergingTriangleResult` 新增字段: +```python +boundary_utilization: float = 0.0 # 边界利用率分数 +``` + +### 效果 + +- 价格贴近边界(空白少)→ 利用率高 → 强度分高 +- 价格远离边界(空白多)→ 利用率低 → 强度分被惩罚 +- 当边界利用率 < 0.20 时,强度分按比例衰减(空白惩罚) +- 解决"形状收敛但空白多"的误判问题 + +# 上/下沿线,有些点没有碰到线的边缘 + + \ No newline at end of file diff --git a/discuss/images/2026-01-27-16-26-02.png b/discuss/images/2026-01-27-16-26-02.png new file mode 100644 index 0000000..d1bf899 Binary files /dev/null and b/discuss/images/2026-01-27-16-26-02.png differ diff --git a/discuss/images/2026-01-27-17-56-30.png b/discuss/images/2026-01-27-17-56-30.png new file mode 100644 index 0000000..b5a6a9b Binary files /dev/null and b/discuss/images/2026-01-27-17-56-30.png differ diff --git a/discuss/images/2026-01-27-17-56-41.png b/discuss/images/2026-01-27-17-56-41.png new file mode 100644 index 0000000..4330600 Binary files /dev/null and b/discuss/images/2026-01-27-17-56-41.png differ diff --git a/discuss/images/2026-01-27-18-00-32.png b/discuss/images/2026-01-27-18-00-32.png new file mode 100644 index 0000000..ebd6bc1 Binary files /dev/null and b/discuss/images/2026-01-27-18-00-32.png differ diff --git a/discuss/images/2026-01-27-18-01-07.png b/discuss/images/2026-01-27-18-01-07.png new file mode 100644 index 0000000..c8ef351 Binary files /dev/null and b/discuss/images/2026-01-27-18-01-07.png differ diff --git a/discuss/images/2026-01-27-18-49-17.png b/discuss/images/2026-01-27-18-49-17.png new file mode 100644 index 0000000..fcaec68 Binary files /dev/null and b/discuss/images/2026-01-27-18-49-17.png differ diff --git a/discuss/images/2026-01-27-18-49-33.png b/discuss/images/2026-01-27-18-49-33.png new file mode 100644 index 0000000..3c0e30b Binary files /dev/null and b/discuss/images/2026-01-27-18-49-33.png differ diff --git a/outputs/converging_triangles/stock_viewer.html b/outputs/converging_triangles/stock_viewer.html index b34e933..0d1d316 100644 --- a/outputs/converging_triangles/stock_viewer.html +++ b/outputs/converging_triangles/stock_viewer.html @@ -755,6 +755,33 @@ color: var(--accent-warm); } + /* Detail Toggle */ + .detail-toggle { + padding: 10px 18px; + background: var(--bg-card); + border: 1px solid var(--border-subtle); + border-radius: 10px; + color: var(--text-secondary); + font-size: 14px; + font-family: 'Noto Sans SC', sans-serif; + cursor: pointer; + transition: all var(--transition-fast); + display: flex; + align-items: center; + gap: 6px; + } + + .detail-toggle:hover { + border-color: var(--accent-primary); + color: var(--accent-primary); + } + + .detail-toggle.active { + background: rgba(0, 212, 170, 0.1); + border-color: var(--accent-primary); + color: var(--accent-primary); + } + /* Filter Chips */ .filter-chips { display: flex; @@ -915,6 +942,16 @@ background: var(--accent-cool); } +