diff --git a/discuss/20260129-讨论.md b/discuss/20260129-讨论.md index e69de29..7b4e6dd 100644 --- a/discuss/20260129-讨论.md +++ b/discuss/20260129-讨论.md @@ -0,0 +1,38 @@ +## 收敛三角形函数本身 + +总体思路:用户可调整"强度分"中的每个参数,最终筛选出符合预期的个股。 + +1. **"拟合贴合度"与"边界利用率",是否可以合并为一个维度?** ✅ 已完成 + - **结论**:不建议合并,两者测量的是不同维度 + - **优化**:重命名为"形态规则度"和"价格活跃度",更直观 + - **详情**:见 `docs/命名优化_拟合贴合度_边界利用率_重命名.md` + +2. **"强度分"中需要新增"角度"参数**:即斜率、三角形的旋转角度。 ✅ 已完成 + - **实现方式**:新增"倾斜度分"作为第6个维度 + - **权重分配**:从突破幅度分中分配5%(50% → 45%) + - **详情**:见 `docs/强度分_增加角度参数_深度分析.md` +3. **"强度分"内所有参数需保持在 0-1 区间**,便于 LLM 调参;要求均匀/正态分布,默认值为 0.5。 +**目前所有 6 个强度分参数都已经在 0-1 区间内**。以下是各分量的归一化方式总结: + +| 分量 | 归一化方式 | 范围保证 | +|------|-----------|---------| +| **突破幅度分** (`price_score`) | `np.tanh(pct * 15.0)` | tanh 输出 [0, 1](因为 pct ≥ 0) | +| **收敛度分** (`convergence_score`) | `max(0, min(1, 1 - width_ratio))` | 显式 clamp 到 [0, 1] | +| **成交量分** (`volume_score`) | `min(1, max(0, volume_ratio - 1))` | 显式 clamp 到 [0, 1] | +| **形态规则度** (`geometry_score`) | `exp(-error * 20)` + clamp | 指数衰减 + 显式 clamp | +| **价格活跃度** (`activity_score`) | 逐日计算 `1 - blank_ratio` 的平均 + clamp | 每日 clamp + 最终 clamp | +| **倾斜度分** (`tilt_score`) | `(1 ± tilt) / 2` + clamp | 显式 clamp 到 [0, 1] | + +### 形态规则度和价格活跃度的归一化详解 + +关于**形态规则度** (`geometry_score`) 和**价格活跃度** (`activity_score`) 这两个分量的详细归一化实现,请参阅: + +**详细文档**:[`docs/强度分_形态规则度和价格活跃度_归一化详解.md`](../docs/强度分_形态规则度和价格活跃度_归一化详解.md) + +**核心要点**: +- **形态规则度**:使用指数衰减映射 `exp(-mean_rel_error * 20)`,测量枢轴点到拟合线的贴合程度 +- **价格活跃度**:使用线性反转 `1 - blank_ratio` + 双重clamp,逐日计算通道空间利用率后取平均 + +两者都严格保证输出在 [0, 1] 区间,满足强度分系统的设计要求。 + +--- diff --git a/docs/命名优化_完成总结.md b/docs/命名优化_完成总结.md new file mode 100644 index 0000000..b0d8d0b --- /dev/null +++ b/docs/命名优化_完成总结.md @@ -0,0 +1,185 @@ +# 命名优化完成总结 + +## ✅ 全部修改完成 + +截止 2026-01-29,所有文件中的"拟合贴合度/边界利用率"已全部重命名为"形态规则度/价格活跃度"。 + +--- + +## 📊 修改统计 + +### 文件总数:11 个 + +#### 核心源文件(3个) +1. ✅ `src/converging_triangle.py` +2. ✅ `src/converging_triangle_optimized.py` +3. ✅ `src/triangle_detector_api.py` + +#### 脚本文件(6个) +4. ✅ `scripts/plot_converging_triangles.py` +5. ✅ `scripts/test_full_pipeline.py` +6. ✅ `scripts/test_optimization_comparison.py` +7. ✅ `scripts/generate_stock_viewer.py` +8. ✅ `scripts/README_performance_tests.md` +9. ✅ `tests/test_renaming.py` + +#### 文档文件(3个) +10. ✅ `docs/强度分组成梳理.md` +11. ✅ `docs/命名优化_拟合贴合度_边界利用率_重命名.md` + +#### 讨论文件(1个) +12. ✅ `discuss/20260129-讨论.md` + +--- + +## 🔄 命名映射完整表 + +| 类别 | 旧名称 | 新名称 | 位置 | +|------|--------|--------|------| +| **Python变量** | `fitting_score` | `geometry_score` | 所有Python文件 | +| **Python变量** | `fitting_adherence` | `geometry_score` | 所有Python文件 | +| **Python变量** | `boundary_utilization` | `activity_score` | 所有Python文件 | +| **Python变量** | `utilization_score` | `activity_score` | 所有Python文件 | +| **Python函数** | `calc_fitting_adherence()` | `calc_geometry_score()` | 所有Python文件 | +| **Python函数** | `calc_boundary_utilization()` | `calc_activity_score()` | 所有Python文件 | +| **Python常量** | `W_FITTING` | `W_GEOMETRY` | 权重配置 | +| **Python常量** | `W_UTILIZATION` | `W_ACTIVITY` | 权重配置 | +| **Python常量** | `UTILIZATION_FLOOR` | `ACTIVITY_FLOOR` | 惩罚阈值 | +| **JavaScript字段** | `boundaryUtilization` | `activityScore` | HTML/JS文件 | +| **中文术语** | "拟合贴合度" | "形态规则度" | 所有文档和UI | +| **中文术语** | "边界利用率" | "价格活跃度" | 所有文档和UI | +| **注释/文档** | "拟合贴合度分" | "形态规则度" | 注释和文档 | +| **注释/文档** | "边界利用率分" | "价格活跃度" | 注释和文档 | +| **图表标题** | "利用率惩罚" | "活跃度惩罚" | 图表生成代码 | + +--- + +## 📝 强度分组成(最终版) + +``` +总强度 = 价格分×50% + 收敛分×15% + 成交量分×10% + 形态规则度×10% + 价格活跃度×15% +``` + +| 序号 | 中文名称 | 权重 | 英文字段 | 说明 | +|------|---------|------|----------|------| +| 1 | 突破幅度分 | 50% | `price_score` | 价格突破边界的力度 | +| 2 | 收敛度分 | 15% | `convergence_score` | 三角形收敛的紧密程度 | +| 3 | 成交量分 | 10% | `volume_score` | 突破时的放量程度 | +| 4 | **形态规则度** | 10% | **`geometry_score`** | 形态的几何标准性 | +| 5 | **价格活跃度** | 15% | **`activity_score`** | 价格振荡的充分性 | + +**空白惩罚**:当价格活跃度 < 20% 时,总强度 × 惩罚系数 + +--- + +## 🎯 重命名原因 + +### 问题诊断 +1. **"拟合贴合度"** - 过于技术化,不够直观 +2. **"边界利用率"** - 容易让人误以为两者是同一维度 + +### 解决方案 +- **"形态规则度"** (Geometry Score) + - 直观:一看就知道是衡量形态标准性 + - 准确:测量枢轴点的几何规则性 + +- **"价格活跃度"** (Activity Score) + - 直观:一看就知道是衡量价格活跃程度 + - 准确:测量价格振荡的充分性 + +### 核心差异 + +| 维度 | 形态规则度 | 价格活跃度 | +|------|----------|----------| +| **测量对象** | 4-8个关键枢轴点 | 240天全部价格 | +| **测量内容** | 几何规则性 | 振荡充分性 | +| **物理意义** | 形态的结构完整性 | 形态的有效性/真实性 | +| **失效场景** | 形态不标准,可能是噪音 | 形态虽标准,但缺乏真实博弈 | + +--- + +## ✅ 验证清单 + +### 代码验证 +- [x] 所有Python文件语法检查通过 +- [x] 函数导入测试成功 +- [x] 数据类字段验证通过 +- [x] Numba优化版本正常加载 +- [x] 所有脚本可以正常导入 + +### UI验证 +- [x] 图表标题使用新名称 +- [x] HTML查看器使用新字段名 +- [x] JavaScript代码使用新字段名 + +### 文档验证 +- [x] 所有Markdown文档已更新 +- [x] 代码注释已更新 +- [x] API文档已更新 + +--- + +## 📌 后续工作 + +### 需要重新生成的内容 +1. **outputs/converging_triangles/stock_viewer.html** + - 需要运行 `generate_stock_viewer.py` 重新生成 + - 会使用新的字段名 `activityScore` + +2. **所有PNG图表** + - 需要运行 `pipeline_converging_triangle.py` 重新生成 + - 标题会显示"形态规则度"和"价格活跃度" + +### 运行命令 +```bash +# 重新运行完整流程 +python scripts/pipeline_converging_triangle.py --clean --all-stocks + +# 或分步运行 +python scripts/detect_all_stocks.py +python scripts/generate_stock_viewer.py +``` + +--- + +## 💾 向后兼容性 + +### ⚠️ 破坏性变更 +此次重命名是**破坏性变更**,旧代码需要更新: + +#### Python代码 +```python +# ❌ 旧代码(不再工作) +result.fitting_score +result.boundary_utilization +components.utilization_score + +# ✅ 新代码 +result.geometry_score +result.activity_score +components.activity_score +``` + +#### JavaScript代码 +```javascript +// ❌ 旧代码(不再工作) +stock.boundaryUtilization + +// ✅ 新代码 +stock.activityScore +``` + +--- + +## 📚 相关文档 + +- **详细设计文档**: `docs/命名优化_拟合贴合度_边界利用率_重命名.md` +- **强度分说明**: `docs/强度分组成梳理.md` +- **讨论记录**: `discuss/20260129-讨论.md` + +--- + +**更新时间**: 2026-01-29 +**更新人员**: AI Assistant +**变更类型**: 破坏性命名优化 +**影响范围**: 全项目 diff --git a/docs/命名优化_拟合贴合度_边界利用率_重命名.md b/docs/命名优化_拟合贴合度_边界利用率_重命名.md new file mode 100644 index 0000000..563fa3c --- /dev/null +++ b/docs/命名优化_拟合贴合度_边界利用率_重命名.md @@ -0,0 +1,204 @@ +# 命名优化:拟合贴合度 → 形态规则度,边界利用率 → 价格活跃度 + +## 一、重命名原因 + +### 1. 原命名的问题 +- **"拟合贴合度"**:过于技术化,不够直观 +- **"边界利用率"**:容易让人误以为是同一个维度的不同表述 + +### 2. 新命名的优势 +- **"形态规则度"** (Geometry Score):直观表达形态的几何标准性 +- **"价格活跃度"** (Activity Score):直观表达价格振荡的充分性 + +## 二、核心差异说明 + +| 维度 | 形态规则度 | 价格活跃度 | +|------|----------|----------| +| **测量对象** | 关键枢轴点(4-8个) | 全部价格(240天) | +| **测量内容** | 几何规则性 | 价格活跃度 | +| **物理意义** | 形态的**结构完整性** | 形态的**有效性/真实性** | +| **失效场景** | 形态不标准,可能是噪音 | 形态虽标准,但缺乏真实博弈 | + +## 三、命名映射表 + +### 3.1 变量/函数命名 + +| 旧名称 | 新名称 | 说明 | +|--------|--------|------| +| `fitting_adherence` | `geometry_score` | 形态规则度分数 | +| `fitting_score` | `geometry_score` | 形态规则度分数(输出) | +| `boundary_utilization` | `activity_score` | 价格活跃度分数 | +| `utilization_score` | `activity_score` | 价格活跃度分数(输出) | +| `calc_fitting_adherence()` | `calc_geometry_score()` | 计算形态规则度 | +| `calc_boundary_utilization()` | `calc_activity_score()` | 计算价格活跃度 | +| `W_FITTING` | `W_GEOMETRY` | 形态规则度权重 | +| `W_UTILIZATION` | `W_ACTIVITY` | 价格活跃度权重 | +| `UTILIZATION_FLOOR` | `ACTIVITY_FLOOR` | 价格活跃度下限 | + +### 3.2 优化版函数命名 + +| 旧名称 | 新名称 | +|--------|--------| +| `calc_fitting_adherence_numba()` | `calc_geometry_score_numba()` | +| `calc_boundary_utilization_numba()` | `calc_activity_score_numba()` | +| `calc_fitting_adherence_optimized()` | `calc_geometry_score_optimized()` | +| `calc_boundary_utilization_optimized()` | `calc_activity_score_optimized()` | + +## 四、修改的文件列表 + +### 4.1 核心文件 +1. **src/converging_triangle.py** ✅ + - 数据类字段重命名 + - 函数名称重命名 + - 函数文档字符串更新 + - 函数调用更新 + - 权重常量重命名 + +2. **src/converging_triangle_optimized.py** ✅ + - Numba优化函数重命名 + - 封装函数重命名 + - 批量检测函数更新 + - 返回值数组重命名 + +3. **src/triangle_detector_api.py** ✅ + - `StrengthComponents` 类字段更新 + - 文档字符串更新 + - 结果构建代码更新 + +### 4.2 脚本文件 +4. **scripts/plot_converging_triangles.py** ✅ + - 导入语句更新 + - 函数调用更新 + - 变量名更新 + - 图表标题和标签更新 + +5. **scripts/test_full_pipeline.py** ✅ + - 导入语句更新 + - 函数覆盖更新 + - 列名更新 + +6. **scripts/test_optimization_comparison.py** ✅ + - 导入语句更新 + - 函数名更新 + +7. **scripts/generate_stock_viewer.py** ✅ + - 字段名更新 + +8. **scripts/README_performance_tests.md** ✅ + - 文档更新 + +### 4.2 数据结构变更 + +#### ConvergingTriangleResult (converging_triangle.py) +```python +# 旧字段 +fitting_score: float = 0.0 +boundary_utilization: float = 0.0 + +# 新字段 +geometry_score: float = 0.0 +activity_score: float = 0.0 +``` + +#### StrengthComponents (triangle_detector_api.py) +```python +# 旧字段 +fitting_score: float +utilization_score: float + +# 新字段 +geometry_score: float +activity_score: float +``` + +## 五、强度分组成(更新后) + +``` +总强度 = 价格分×50% + 收敛分×15% + 成交量分×10% + 形态规则度×10% + 价格活跃度×15% +``` + +| 序号 | 组成部分 | 权重 | 英文名 | 说明 | +|------|---------|------|--------|------| +| 1 | **突破幅度分** | 50% | `price_score` | 价格突破上/下沿的幅度 | +| 2 | **收敛度分** | 15% | `convergence_score` | 三角形收敛程度 | +| 3 | **成交量分** | 10% | `volume_score` | 突破时的放量程度 | +| 4 | **形态规则度** | 10% | `geometry_score` | 枢轴点到拟合线的贴合程度 | +| 5 | **价格活跃度** | 15% | `activity_score` | 价格走势对通道空间的利用程度 | + +## 六、向后兼容性 + +### 6.1 破坏性变更 +⚠️ **注意**:此次重命名是**破坏性变更**,以下代码需要更新: + +1. **依赖旧字段名的代码** +```python +# 旧代码(不再工作) +result.fitting_score +result.boundary_utilization +components.fitting_score +components.utilization_score + +# 新代码 +result.geometry_score +result.activity_score +components.geometry_score +components.activity_score +``` + +2. **调用旧函数名的代码** +```python +# 旧代码(不再工作) +from converging_triangle import calc_fitting_adherence, calc_boundary_utilization + +# 新代码 +from converging_triangle import calc_geometry_score, calc_activity_score +``` + +### 6.2 迁移建议 + +如果你的项目中有旧代码,可以: + +1. **查找替换**:全局搜索并替换旧名称 +2. **检查导入**:确保导入语句使用新名称 +3. **更新文档**:更新相关文档和注释 +4. **测试验证**:运行测试确保功能正常 + +## 七、验证 + +### 7.1 语法检查 +所有文件已通过Python语法检查: +```bash +✅ src/converging_triangle.py +✅ src/converging_triangle_optimized.py +✅ src/triangle_detector_api.py +✅ scripts/plot_converging_triangles.py +✅ scripts/test_full_pipeline.py +✅ scripts/test_optimization_comparison.py +✅ scripts/generate_stock_viewer.py +``` + +### 7.2 导入测试 +```bash +✅ 核心函数导入成功 +✅ 数据类字段验证成功 +✅ Numba优化版本正常加载 +``` + +### 7.3 修改统计 +- **文件总数**: 8个 +- **核心源文件**: 3个 +- **脚本文件**: 5个 +- **替换次数**: 约150处 + +## 八、后续工作建议 + +1. **更新可视化代码**:如果有图表显示这些指标,需要更新标签 +2. **更新API文档**:更新 `triangle_api_reference.md` 中的描述 +3. **更新示例代码**:更新所有示例中的字段名 +4. **测试验证**:运行完整的测试套件确保功能正常 + +--- + +**修改日期**: 2026-01-29 +**修改原因**: 提高命名的直观性,避免用户混淆两个指标的含义 +**影响范围**: 核心API字段名和函数名 diff --git a/docs/强度分_增加角度参数_深度分析.md b/docs/强度分_增加角度参数_深度分析.md new file mode 100644 index 0000000..934ef9a --- /dev/null +++ b/docs/强度分_增加角度参数_深度分析.md @@ -0,0 +1,434 @@ +# 强度分中增加"角度"参数的深度分析 + +## 一、问题背景 + +根据讨论记录(`discuss/20260129-讨论.md`),需要在"强度分"中新增"角度"参数,即斜率、三角形的旋转角度。 + +## 二、当前"强度分"的组成结构 + +### 2.1 现有五大维度 + +根据 `docs/强度分组成梳理.md`,当前强度分由以下**5个组成部分**加权求和(总权重100%): + +| 序号 | 组成部分 | 权重 | 英文字段名 | 说明 | +|------|---------|------|-----------|------| +| 1 | **突破幅度分** | 50% | `price_score` | 价格突破上/下沿的幅度(tanh归一化) | +| 2 | **收敛度分** | 15% | `convergence_score` | 三角形收敛程度(1 - width_ratio) | +| 3 | **成交量分** | 10% | `volume_score` | 突破时的放量程度 | +| 4 | **形态规则度** | 10% | `geometry_score` | 枢轴点到拟合线的贴合程度 | +| 5 | **价格活跃度** | 15% | `activity_score` | 价格对通道空间的利用程度 | + +**计算公式**: +```python +strength = ( + 0.50 × 突破幅度分 + + 0.15 × 收敛度分 + + 0.10 × 成交量分 + + 0.10 × 形态规则度 + + 0.15 × 价格活跃度 +) +``` + +### 2.2 现有的斜率数据 + +实际上,代码中**已经计算并存储了斜率信息**: + +```python +# converging_triangle.py: line 86-87 +upper_slope: float = 0.0 # 上沿斜率 +lower_slope: float = 0.0 # 下沿斜率 +``` + +但这些斜率**未被纳入强度分计算**,仅用于: +1. **形态识别约束**:确保三角形相向收敛(上沿向下,下沿向上) +2. **可视化展示**:绘制三角形边界线 + + +## 三、"角度"参数的含义与作用 + +### 3.1 "角度"的数学定义 + +收敛三角形有**两条边界线**,因此涉及到**多个角度**: + +#### 方案A:上沿/下沿的倾斜角度(独立角度) +- **上沿角度**:`θ_upper = arctan(upper_slope)` +- **下沿角度**:`θ_lower = arctan(lower_slope)` + +示例: +- 上沿斜率 = -0.05 → 角度 ≈ -2.86°(向下倾斜) +- 下沿斜率 = +0.03 → 角度 ≈ +1.72°(向上倾斜) + +#### 方案B:三角形的整体倾斜方向(合成角度) +- **三角形中轴角度**:`θ_mid = arctan((upper_slope + lower_slope) / 2)` + - 中轴向上倾斜 → 上升三角形 + - 中轴向下倾斜 → 下降三角形 + - 中轴接近水平 → 对称三角形 + +#### 方案C:三角形的收敛角度(张角) +- **收敛角度**:`θ_apex = arctan(upper_slope - lower_slope)` + - 反映三角形收敛的"尖锐程度" + - 张角越小 → 形态越尖锐,预示突破可能更强 + +### 3.2 "角度"参数的技术分析意义 + +| 角度类型 | 技术分析含义 | 对突破的影响 | +|---------|-------------|------------| +| **上沿倾斜度** | 压力线的陡峭程度 | 过于陡峭可能表示抛压过大 | +| **下沿倾斜度** | 支撑线的强度 | 陡峭向上表示买盘强劲 | +| **中轴倾斜方向** | 市场整体趋势偏向 | 向上偏=多头趋势,向下偏=空头趋势 | +| **收敛张角** | 多空力量博弈的紧张度 | 张角越小=能量积蓄越充分 | + +### 3.3 用户需求推测 + +根据"用户可调整强度分中的每个参数"的需求,增加"角度"参数的目的可能是: + +1. **筛选特定形态**:只要对称三角形(中轴接近水平)或只要上升/下降三角形 +2. **控制倾斜度**:排除过于陡峭或过于平缓的形态 +3. **评估突破质量**:角度影响突破的有效性(如陡峭向上的支撑线更可能向上突破) + + +## 四、增加"角度"参数的具体实现方案 + +### 4.1 推荐方案:增加"中轴倾斜度分" + +**核心思路**:将三角形的整体倾斜方向纳入强度分,反映市场趋势的偏向性。 + +#### 4.1.1 计算方法 + +```python +def calc_tilt_score( + upper_slope: float, + lower_slope: float, + breakout_dir: str, +) -> float: + """ + 计算三角形倾斜度分 (0~1) + + 衡量三角形中轴的倾斜方向与突破方向的一致性。 + 趋势偏向与突破方向一致时,得分越高。 + + 计算方法: + 1. 计算中轴斜率:mid_slope = (upper_slope + lower_slope) / 2 + 2. 计算倾斜度:tilt = arctan(mid_slope) / (π/4),归一化到 [-1, +1] + - 向上倾斜(上升三角形):tilt > 0 + - 向下倾斜(下降三角形):tilt < 0 + - 对称三角形:tilt ≈ 0 + 3. 根据突破方向计算得分: + - 向上突破:score = (1 + tilt) / 2 # 倾斜向上时得分高 + - 向下突破:score = (1 - tilt) / 2 # 倾斜向下时得分高 + + 归一化映射(以向上突破为例): + - 上升三角形(中轴向上15°)+ 向上突破 → 得分 0.85 + - 对称三角形(中轴水平) + 向上突破 → 得分 0.50 + - 下降三角形(中轴向下15°)+ 向上突破 → 得分 0.15(逆势突破) + + Args: + upper_slope: 上沿斜率 + lower_slope: 下沿斜率 + breakout_dir: 突破方向 "up" | "down" | "none" + + Returns: + tilt_score: 0~1,越大表示倾斜方向与突破方向越一致 + """ + import math + + # 1. 计算中轴斜率 + mid_slope = (upper_slope + lower_slope) / 2.0 + + # 2. 计算倾斜角度(弧度),并归一化到 [-1, +1] + # 使用 arctan(slope) / (π/4) 映射: + # - 45° 向上 → +1 + # - 0° 水平 → 0 + # - 45° 向下 → -1 + angle_rad = math.atan(mid_slope) + tilt = angle_rad / (math.pi / 4) # 归一化到 [-1, +1] + tilt = max(-1.0, min(1.0, tilt)) # 限制在 [-1, 1] + + # 3. 根据突破方向计算得分 + if breakout_dir == "up": + # 向上突破:倾斜向上时得分高 + score = (1.0 + tilt) / 2.0 + elif breakout_dir == "down": + # 向下突破:倾斜向下时得分高 + score = (1.0 - tilt) / 2.0 + else: + # 未突破:使用中性分数(0.5) + score = 0.5 + + return max(0.0, min(1.0, score)) +``` + +#### 4.1.2 权重分配调整 + +新增"倾斜度分"后,需要调整权重(保持总和100%): + +**方案1:从"突破幅度分"中分配** +```python +W_PRICE = 0.45 # 突破幅度权重(从50%降至45%) +W_CONVERGENCE = 0.15 # 收敛度权重 +W_VOLUME = 0.10 # 成交量权重 +W_GEOMETRY = 0.10 # 形态规则度权重 +W_ACTIVITY = 0.15 # 价格活跃度权重 +W_TILT = 0.05 # 倾斜度权重(新增,占5%) +``` + +**方案2:均匀分配** +```python +W_PRICE = 0.47 # 突破幅度权重(50% → 47%) +W_CONVERGENCE = 0.13 # 收敛度权重(15% → 13%) +W_VOLUME = 0.08 # 成交量权重(10% → 8%) +W_GEOMETRY = 0.10 # 形态规则度权重 +W_ACTIVITY = 0.15 # 价格活跃度权重 +W_TILT = 0.07 # 倾斜度权重(新增,占7%) +``` + +#### 4.1.3 修改位置 + +需要修改以下文件: + +1. **`src/converging_triangle.py`** + - 在 `ConvergingTriangleResult` 中新增字段: + ```python + tilt_score: float = 0.0 # 倾斜度分数 + ``` + - 新增函数 `calc_tilt_score()` + - 修改 `calc_breakout_strength()` 函数,纳入倾斜度分 + +2. **`src/converging_triangle_optimized.py`** + - 新增 Numba 优化版本的 `calc_tilt_score_numba()` + - 修改 `calc_breakout_strength_numba()` + +3. **`src/triangle_detector_api.py`** + - 在 `StrengthComponents` 中新增: + ```python + tilt_score: float # 倾斜度分数 + ``` + +4. **`docs/强度分组成梳理.md`** + - 更新为6个组成部分,添加倾斜度的说明 + + +### 4.2 备选方案:增加"收敛角度分" + +**核心思路**:将三角形的收敛尖锐程度纳入强度分。 + +```python +def calc_apex_angle_score( + upper_slope: float, + lower_slope: float, +) -> float: + """ + 计算收敛角度分 (0~1) + + 衡量三角形的收敛尖锐程度(张角大小)。 + 张角越小(形态越尖锐),得分越高。 + + 计算方法: + 1. 张角 = arctan(upper_slope - lower_slope) + 2. 归一化到 [0, 1]: + - 张角 < 5° → 得分 1.0 (极度尖锐) + - 张角 ≈ 15° → 得分 0.7 + - 张角 ≈ 30° → 得分 0.4 + - 张角 > 45° → 得分 0.1 (过于开阔) + + Args: + upper_slope: 上沿斜率 + lower_slope: 下沿斜率 + + Returns: + angle_score: 0~1,越大表示形态越尖锐 + """ + import math + + # 计算张角(绝对值) + slope_diff = abs(upper_slope - lower_slope) + angle_rad = math.atan(slope_diff) + angle_deg = math.degrees(angle_rad) + + # 指数衰减归一化(张角越大分数越低) + # 使用 exp(-angle_deg / 20) 映射: + # - 0° → 1.00 + # - 10° → 0.61 + # - 20° → 0.37 + # - 30° → 0.22 + # - 45° → 0.11 + score = math.exp(-angle_deg / 20.0) + + return max(0.0, min(1.0, score)) +``` + + +## 五、对"LLM 调参"友好性的考虑 + +### 5.1 要求所有参数在 0-1 区间 + +根据讨论记录第3点:"强度分内所有参数需保持在 0-1 区间,便于 LLM 调参;要求均匀/正态分布,默认值为 0.5。" + +#### 当前"角度"的原始值范围 +- 斜率范围:约 -0.1 ~ +0.1(受代码约束) +- 角度范围:约 -5.7° ~ +5.7°(arctan(±0.1)) + +#### 归一化到 [0, 1] 的方法 + +**方法1:线性归一化** +```python +# 将 [-5.7°, +5.7°] 映射到 [0, 1] +normalized = (angle_deg + 5.7) / 11.4 +# 默认值 0.5 对应 0° (水平) +``` + +**方法2:sigmoid 归一化** +```python +# 使用 sigmoid 函数,0° 映射到 0.5 +normalized = 1 / (1 + exp(-angle_deg / 3)) +# 默认值 0.5 对应 0° +``` + +**方法3:绝对值归一化(仅关心角度大小,不关心方向)** +```python +# 将 [0°, 5.7°] 映射到 [0, 1] +normalized = abs(angle_deg) / 5.7 +# 默认值 0.5 对应 约 2.85° +``` + +### 5.2 为 LLM 设计的可调参数接口 + +在 `triangle_detector_api.py` 中新增参数: + +```python +@dataclass +class DetectionParams: + """检测参数,都有合理默认值,大多数场景无需调整""" + # ===== 用户可调参数 ===== + window: int = 240 + min_convergence: float = 0.45 + breakout_threshold: float = 0.005 + volume_multiplier: float = 1.5 + + # 【新增】角度相关参数 + tilt_preference: float = 0.5 # 倾斜偏好 [0, 1] + # 0=偏好下降三角形,0.5=中性,1=偏好上升三角形 + + apex_angle_preference: float = 0.5 # 收敛角度偏好 [0, 1] + # 0=偏好开阔形态,0.5=中性,1=偏好尖锐形态 + + # 【新增】权重配置 + weight_price: float = 0.45 # 突破幅度权重 + weight_convergence: float = 0.15 # 收敛度权重 + weight_volume: float = 0.10 # 成交量权重 + weight_geometry: float = 0.10 # 形态规则度权重 + weight_activity: float = 0.15 # 价格活跃度权重 + weight_tilt: float = 0.05 # 倾斜度权重(新增) +``` + + +## 六、实现步骤总结 + +### 6.1 短期方案(最小改动) + +**仅暴露斜率信息,不改变强度分计算** + +1. 在 API 返回结果中添加斜率字段的解释说明 +2. 在可视化和导出中突出显示角度信息 +3. 用户可以在后处理时根据角度手动筛选 + +**优点**:零风险,不影响现有逻辑 +**缺点**:未真正集成到强度分,用户需要自己处理 + +### 6.2 中期方案(推荐) + +**增加"倾斜度分"作为第6个维度** + +1. 新增 `calc_tilt_score()` 函数 +2. 修改 `calc_breakout_strength()` 将倾斜度纳入加权 +3. 调整权重配置(建议从突破幅度中分出5%) +4. 更新文档和测试 + +**优点**:有实际技术分析意义,易于理解 +**缺点**:需要调整权重,可能影响现有结果的一致性 + +### 6.3 长期方案(完全可配置) + +**允许用户自定义强度分的权重** + +1. 将所有权重作为参数暴露给 LLM +2. 新增多种角度相关的分数(倾斜度、收敛角度、上下沿独立角度) +3. 用户可以根据自己的策略调整权重组合 + +**优点**:最大灵活性,适应不同交易策略 +**缺点**:复杂度高,需要大量测试和文档支持 + + +## 七、潜在的技术挑战与注意事项 + +### 7.1 数值稳定性 +- 斜率接近0时,角度变化敏感,需要设置阈值 +- 极端情况(垂直线)需要特殊处理 + +### 7.2 多重共线性 +- 倾斜度与"收敛度"可能相关(如对称三角形收敛度通常更高) +- 需要验证新参数是否引入冗余信息 + +### 7.3 历史数据回测 +- 增加新参数后,需要重新回测所有历史数据 +- 评估对现有高强度信号的影响 + +### 7.4 用户理解成本 +- "角度"参数的含义可能不如"突破幅度"直观 +- 需要提供清晰的文档和示例 + + +## 八、推荐的实施路径 + +### 阶段1:数据验证(2小时) +1. 统计现有数据中斜率的分布情况 +2. 分析角度与突破强度的相关性 +3. 确认增加角度参数的必要性 + +### 阶段2:方案确认(1小时) +1. 与用户确认具体需求(是倾斜度、收敛角度还是其他?) +2. 确定权重分配方案 +3. 确定参数归一化方式 + +### 阶段3:代码实现(4小时) +1. 修改 `converging_triangle.py`(1.5小时) +2. 修改 `converging_triangle_optimized.py`(1.5小时) +3. 修改 `triangle_detector_api.py`(1小时) + +### 阶段4:测试与验证(3小时) +1. 单元测试(1小时) +2. 历史数据回测(1小时) +3. 可视化验证(1小时) + +### 阶段5:文档更新(1小时) +1. 更新 `docs/强度分组成梳理.md` +2. 更新 API 文档 +3. 添加使用示例 + +**总计**:约 11 小时 + + +## 九、决策建议 + +根据以上分析,我的建议是: + +1. **采用中期方案(增加倾斜度分)** + - 有明确的技术分析意义 + - 实现成本适中 + - 对现有系统影响可控 + +2. **参数设计** + - 新增 `tilt_score` 作为第6个维度 + - 权重从突破幅度中分配 5% + - 归一化到 [0, 1],默认值 0.5 + +3. **下一步行动** + - 与用户确认具体需求(是否就是"倾斜度") + - 进行小规模数据验证 + - 如果验证通过,再进入实施阶段 + +--- + +**文档创建时间**:2026-01-29 +**作者**:AI Assistant +**状态**:待用户确认 diff --git a/docs/强度分_形态规则度和价格活跃度_归一化详解.md b/docs/强度分_形态规则度和价格活跃度_归一化详解.md new file mode 100644 index 0000000..9fac7f7 --- /dev/null +++ b/docs/强度分_形态规则度和价格活跃度_归一化详解.md @@ -0,0 +1,137 @@ +# 强度分:形态规则度和价格活跃度的归一化详解 + +本文档详细说明**形态规则度** (`geometry_score`) 和**价格活跃度** (`activity_score`) 这两个强度分量的归一化实现方式。 + +--- + +## 4. 形态规则度 (`geometry_score`) 的归一化 + +**目的**:测量枢轴点(4-8个关键点)到拟合线的贴合程度,形态越规则得分越高。 + +### 计算步骤 + +```python +# 1. 计算相对误差:遍历所有枢轴点 +for i in range(n): + fitted_value = slope * pivot_indices[i] + intercept + rel_error = abs(pivot_values[i] - fitted_value) / max(abs(fitted_value), 1e-9) + sum_rel_error += rel_error + +# 2. 计算平均相对误差 +mean_rel_error = sum_rel_error / n + +# 3. 指数衰减归一化 +SCALE_FACTOR = 20.0 +geometry_score = np.exp(-mean_rel_error * SCALE_FACTOR) + +# 4. 显式 clamp 到 [0, 1] +geometry_score = min(1.0, max(0.0, geometry_score)) +``` + +### 归一化原理 + +- **输入**:`mean_rel_error` ∈ [0, +∞)(平均相对误差,0 = 完美拟合) +- **指数衰减**:`exp(-mean_rel_error * 20)` 将误差映射到 (0, 1] 区间 + - 误差 = 0 → 得分 = 1.0(完美拟合) + - 误差 = 0.05 → 得分 ≈ 0.37(中等拟合) + - 误差 = 0.10 → 得分 ≈ 0.14(较差拟合) + - 误差 → ∞ → 得分 → 0(完全不拟合) +- **缩放因子 20**:决定衰减速度,值越大对误差越敏感 + +### 范围保证 + +- 指数函数 `exp(-x)` 对于 x ≥ 0,输出自然在 (0, 1] 区间 +- 最后显式 clamp 确保异常情况下也在 [0, 1] + +### 实现位置 + +- 函数名:`calc_geometry_score_numba()` +- 文件:`src/converging_triangle_optimized.py`(第350-374行) + +--- + +## 5. 价格活跃度 (`activity_score`) 的归一化 + +**目的**:测量价格在通道内的振荡充分性,识别真实博弈 vs 僵尸形态。 + +### 计算步骤 + +```python +# 1. 逐日计算活跃度(遍历 240 天完整数据) +total_activity = 0.0 +valid_days = 0 + +for i in range(start, end + 1): + # 1.1 计算当日通道宽度 + upper_line = upper_slope * i + upper_intercept + lower_line = lower_slope * i + lower_intercept + channel_width = upper_line - lower_line + + if channel_width <= 0: + continue + + # 1.2 计算空白距离 + dist_to_upper = max(0.0, upper_line - high[i]) # 高点未触及上沿的距离 + dist_to_lower = max(0.0, low[i] - lower_line) # 低点未触及下沿的距离 + + # 1.3 计算空白比例 + blank_ratio = (dist_to_upper + dist_to_lower) / channel_width + + # 1.4 单日活跃度 = 1 - 空白比例,并 clamp 到 [0, 1] + day_activity = max(0.0, min(1.0, 1.0 - blank_ratio)) + + total_activity += day_activity + valid_days += 1 + +# 2. 计算平均活跃度(已自动在 [0, 1] 区间) +activity_score = total_activity / valid_days +``` + +### 归一化原理 + +- **输入**:每日的 `blank_ratio`(空白比例)∈ [0, +∞) + - 0 = 价格完全填满通道(高点触上沿且低点触下沿) + - 1 = 价格只占通道一半空间 + - \> 1 = 价格严重偏离通道(理论上不应出现) +- **反转**:`1 - blank_ratio` 将"空白"转为"活跃" + - blank_ratio = 0 → activity = 1(最活跃) + - blank_ratio = 0.5 → activity = 0.5(中等活跃) + - blank_ratio = 1 → activity = 0(不活跃) +- **双重 clamp**: + 1. **每日 clamp**:`max(0.0, min(1.0, ...))` 确保单日得分在 [0, 1] + 2. **最终平均**:因为每日都在 [0, 1],平均值自然在 [0, 1] + +### 范围保证 + +- 每日活跃度通过双边 clamp 严格限制在 [0, 1] +- 最终得分是所有有效日的平均值,数学上保证在 [0, 1] + +### 实际意义 + +- **0.8-1.0**:价格充分振荡,真实博弈形态 +- **0.5-0.8**:价格较活跃,形态有效 +- **0.2-0.5**:价格偏弱,形态存疑 +- **< 0.2**:僵尸形态,触发空白惩罚机制 + +### 实现位置 + +- 函数名:`calc_activity_score_numba()` +- 文件:`src/converging_triangle_optimized.py`(第378-412行) + +--- + +## 总结 + +这两个分量的归一化方式各有特点: + +1. **形态规则度**:使用指数衰减映射,对误差敏感度高,适合质量评估 +2. **价格活跃度**:使用线性反转+双重clamp,逐日计算后取平均,适合统计性指标 + +两者都严格保证输出在 [0, 1] 区间,满足强度分系统的设计要求。 + +--- + +**文档创建日期**:2026-01-29 +**相关文档**: +- `docs/强度分组成梳理.md`:6个强度分量的完整说明 +- `discuss/20260129-讨论.md`:强度分参数讨论 diff --git a/docs/强度分组成梳理.md b/docs/强度分组成梳理.md new file mode 100644 index 0000000..3eabb00 --- /dev/null +++ b/docs/强度分组成梳理.md @@ -0,0 +1,99 @@ +# 强度分组成梳理 + +根据当前代码,**强度分由 6 个组成部分**: + +```python +# 权重配置(调整后,总和 = 100%) +W_PRICE = 0.45 # 突破幅度权重(从50%降至45%) +W_CONVERGENCE = 0.15 # 收敛度权重 +W_VOLUME = 0.10 # 成交量权重 +W_GEOMETRY = 0.10 # 形态规则度权重 +W_ACTIVITY = 0.15 # 价格活跃度权重 +W_TILT = 0.05 # 倾斜度权重(新增) +``` + +## 组成详情 + +| 序号 | 组成部分 | 权重 | 英文字段名 | 说明 | 归一化方式 | 范围保证 | +|------|---------|------|-----------|------|-----------|---------| +| 1 | **突破幅度分** | 45% | `price_score` | 价格突破上/下沿的幅度 | `np.tanh(pct * 15.0)` | tanh 输出 [0, 1](因为 pct ≥ 0) | +| 2 | **收敛度分** | 15% | `convergence_score` | 三角形收敛程度(1 - width_ratio) | `max(0, min(1, 1 - width_ratio))` | 显式 clamp 到 [0, 1] | +| 3 | **成交量分** | 10% | `volume_score` | 突破时的放量程度 | `min(1, max(0, volume_ratio - 1))` | 显式 clamp 到 [0, 1] | +| 4 | **形态规则度** | 10% | `geometry_score` | 枢轴点到拟合线的贴合程度,形态的几何标准性 | `exp(-error * 20)` + clamp | 指数衰减 + 显式 clamp | +| 5 | **价格活跃度** | 15% | `activity_score` | 价格走势对通道空间的利用程度,振荡充分性 | 逐日计算 `1 - blank_ratio` 的平均 + clamp | 每日 clamp + 最终 clamp | +| 6 | **倾斜度分** | 5% | `tilt_score` | 中轴倾斜方向与突破方向的一致性(新增) | `(1 ± tilt) / 2` + clamp | 显式 clamp 到 [0, 1] | + +**总计:100%** + +## 计算公式 + +```python +strength = ( + 0.45 × 突破幅度分 + + 0.15 × 收敛度分 + + 0.10 × 成交量分 + + 0.10 × 形态规则度 + + 0.15 × 价格活跃度 + + 0.05 × 倾斜度分 +) +``` + +## 空白惩罚机制 + +当**价格活跃度**低于 20% 时,会对总强度进行额外的降分惩罚,避免"通道很宽但价格很空"的误判。 + +## 命名说明 + +> **注意**:自 2026-01-29 起,原"拟合贴合度"重命名为"形态规则度",原"边界利用率"重命名为"价格活跃度",以更直观地表达其含义。 +> +> - **形态规则度**:测量枢轴点的几何标准性(4-8个关键点) +> - **价格活跃度**:测量价格振荡的充分性(240天完整数据) +> +> 详见:`docs/命名优化_拟合贴合度_边界利用率_重命名.md` + +## 各分量的含义 + +### 1. 突破幅度分 (50%) +- **作用**:衡量价格突破三角形边界的力度 +- **计算**:使用 tanh 非线性归一化 + - 1% 突破 → 0.15 + - 3% 突破 → 0.42 + - 5% 突破 → 0.64 + - 10% 突破 → 0.91 + +### 2. 收敛度分 (15%) +- **作用**:衡量三角形收敛的紧密程度 +- **计算**:1 - width_ratio(末端宽度/起始宽度) +- **示例**:收敛到 30% → 得分 0.7 + +### 3. 成交量分 (10%) +- **作用**:衡量突破时的成交量放大程度 +- **计算**:(当前成交量/均值 - 1),上限为 1.0 +- **示例**:成交量为均值的 2 倍 → 得分 1.0 + +### 4. 形态规则度 (10%) +- **作用**:衡量形态的几何标准性 +- **测量**:4-8 个关键枢轴点到拟合线的距离 +- **特点**:关注形态结构的完整性 + +### 5. 价格活跃度 (15%) +- **作用**:衡量价格振荡的充分性 +- **测量**:240 天价格对通道空间的利用程度 +- **特点**:识别真实博弈 vs 僵尸形态 + +### 6. 倾斜度分 (5%) +- **作用**:衡量三角形中轴倾斜方向与突破方向的一致性 +- **计算步骤**: + 1. 计算中轴斜率:`mid_slope = (上沿斜率 + 下沿斜率) / 2` + 2. 计算倾斜程度:`tilt = arctan(mid_slope) / (π/4)`,范围 [-1, +1] + - -1 = 强烈向下倾斜,0 = 水平,+1 = 强烈向上倾斜 + 3. 根据突破方向计算得分(范围 [0, 1]): + - 向上突破:`score = (1 + tilt) / 2` + - 向下突破:`score = (1 - tilt) / 2` + - 未突破:`score = 0.5` +- **示例**(实际计算结果): + - 上升三角形(斜率0.025)+ 向上突破 → tilt≈0.032 → 得分 0.516(略顺势) + - 对称三角形(斜率0)+ 向上突破 → tilt=0 → 得分 0.500(中性) + - 下降三角形(斜率-0.025)+ 向上突破 → tilt≈-0.032 → 得分 0.484(略逆势) + - 强向上倾斜(斜率0.10)+ 向上突破 → tilt≈0.127 → 得分 0.563(明显顺势) +- **特点**:评估突破方向与形态趋势的协调性,得分始终在 [0, 1] 范围内 diff --git a/outputs/converging_triangles/stock_viewer.html b/outputs/converging_triangles/stock_viewer.html index 0d1d316..bce79f2 100644 --- a/outputs/converging_triangles/stock_viewer.html +++ b/outputs/converging_triangles/stock_viewer.html @@ -1068,17 +1068,18 @@ "idx": 28, "code": "SH603379", "name": "三美股份", - "strengthUp": 0.2718794483272821, - "strengthDown": 0.09070852657198746, + "strengthUp": 0.26552211680191823, + "strengthDown": 0.10246828722215302, "direction": "up", "widthRatio": 0.08922158280365546, "touchesUpper": 4, "touchesLower": 4, "volumeConfirmed": "False", - "boundaryUtilization": 0.0918991906342708, + "activityScore": 0.0918991906342708, + "tiltScore": 0.5118548082524743, "date": 20260120, "hasTriangle": true, - "strength": 0.2718794483272821, + "strength": 0.26552211680191823, "chartPath": "charts/20260120_SH603379_三美股份.png", "chartPathDetail": "charts/20260120_SH603379_三美股份_detail.png" }, @@ -1086,71 +1087,75 @@ "idx": 13, "code": "SH600744", "name": "华银电力", - "strengthUp": 0.15706248130235445, - "strengthDown": 0.05487856283191771, + "strengthUp": 0.1522090509643363, + "strengthDown": 0.06024352434094318, "direction": "up", "widthRatio": 0.2867596230842454, "touchesUpper": 5, "touchesLower": 2, "volumeConfirmed": "True", - "boundaryUtilization": 0.043431555801019366, + "activityScore": 0.043431555801019366, + "tiltScore": 0.4941072370149417, "date": 20260120, "hasTriangle": true, - "strength": 0.15706248130235445, + "strength": 0.1522090509643363, "chartPath": "charts/20260120_SH600744_华银电力.png", "chartPathDetail": "charts/20260120_SH600744_华银电力_detail.png" }, - { - "idx": 20, - "code": "SH601609", - "name": "金田股份", - "strengthUp": 0.12491668196385437, - "strengthDown": 0.08566223307080872, - "direction": "up", - "widthRatio": 0.03896315672868362, - "touchesUpper": 4, - "touchesLower": 6, - "volumeConfirmed": "True", - "boundaryUtilization": 0.06788056841717838, - "date": 20260120, - "hasTriangle": true, - "strength": 0.12491668196385437, - "chartPath": "charts/20260120_SH601609_金田股份.png", - "chartPathDetail": "charts/20260120_SH601609_金田股份_detail.png" - }, { "idx": 95, "code": "SZ300737", "name": "科顺股份", - "strengthUp": 0.12060013192131139, - "strengthDown": 0.12060013192131139, + "strengthUp": 0.13400783708484898, + "strengthDown": 0.13400783708484898, "direction": "none", "widthRatio": 0.21325532904558048, "touchesUpper": 6, "touchesLower": 7, "volumeConfirmed": "", - "boundaryUtilization": 0.10726164130830072, + "activityScore": 0.10726164130830072, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.12060013192131139, + "strength": 0.13400783708484898, "chartPath": "charts/20260120_SZ300737_科顺股份.png", "chartPathDetail": "charts/20260120_SZ300737_科顺股份_detail.png" }, + { + "idx": 20, + "code": "SH601609", + "name": "金田股份", + "strengthUp": 0.12944397068032543, + "strengthDown": 0.09411496667658434, + "direction": "up", + "widthRatio": 0.03896315672868362, + "touchesUpper": 4, + "touchesLower": 6, + "volumeConfirmed": "True", + "activityScore": 0.06788056841717838, + "tiltScore": 0.4980944504664168, + "date": 20260120, + "hasTriangle": true, + "strength": 0.12944397068032543, + "chartPath": "charts/20260120_SH601609_金田股份.png", + "chartPathDetail": "charts/20260120_SH601609_金田股份_detail.png" + }, { "idx": 91, "code": "SZ300530", "name": "领湃科技", - "strengthUp": 0.11111761818295247, - "strengthDown": 0.11111761818295247, + "strengthUp": 0.1208592686961565, + "strengthDown": 0.1208592686961565, "direction": "none", "widthRatio": 0.12780633375372022, "touchesUpper": 3, "touchesLower": 2, "volumeConfirmed": "", - "boundaryUtilization": 0.0779332041056322, + "activityScore": 0.0779332041056322, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.11111761818295247, + "strength": 0.1208592686961565, "chartPath": "charts/20260120_SZ300530_领湃科技.png", "chartPathDetail": "charts/20260120_SZ300530_领湃科技_detail.png" }, @@ -1158,17 +1163,18 @@ "idx": 26, "code": "SH603237", "name": "五芳斋", - "strengthUp": 0.1024610736254772, - "strengthDown": 0.1024610736254772, + "strengthUp": 0.11693159036032842, + "strengthDown": 0.11693159036032842, "direction": "none", "widthRatio": 0.1737453100820701, "touchesUpper": 5, "touchesLower": 5, "volumeConfirmed": "", - "boundaryUtilization": 0.11576413387880975, + "activityScore": 0.11576413387880975, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.1024610736254772, + "strength": 0.11693159036032842, "chartPath": "charts/20260120_SH603237_五芳斋.png", "chartPathDetail": "charts/20260120_SH603237_五芳斋_detail.png" }, @@ -1176,71 +1182,75 @@ "idx": 76, "code": "SZ002802", "name": "洪汇新材", - "strengthUp": 0.10100693556969877, - "strengthDown": 0.10100693556969877, + "strengthUp": 0.1157886059983914, + "strengthDown": 0.1157886059983914, "direction": "none", "widthRatio": 0.23884176697328596, "touchesUpper": 5, "touchesLower": 4, "volumeConfirmed": "", - "boundaryUtilization": 0.11825336342954114, + "activityScore": 0.11825336342954114, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.10100693556969877, + "strength": 0.1157886059983914, "chartPath": "charts/20260120_SZ002802_洪汇新材.png", "chartPathDetail": "charts/20260120_SZ002802_洪汇新材_detail.png" }, - { - "idx": 54, - "code": "SZ000722", - "name": "湖南发展", - "strengthUp": 0.10089807923588778, - "strengthDown": 0.10089807923588778, - "direction": "none", - "widthRatio": 0.16117444007433868, - "touchesUpper": 5, - "touchesLower": 2, - "volumeConfirmed": "", - "boundaryUtilization": 0.08798114509673645, - "date": 20260120, - "hasTriangle": true, - "strength": 0.10089807923588778, - "chartPath": "charts/20260120_SZ000722_湖南发展.png", - "chartPathDetail": "charts/20260120_SZ000722_湖南发展_detail.png" - }, { "idx": 22, "code": "SH603005", "name": "晶方科技", - "strengthUp": 0.1004173045532496, - "strengthDown": 0.1004173045532496, + "strengthUp": 0.11219704543568702, + "strengthDown": 0.11219704543568702, "direction": "none", "widthRatio": 0.34612788685827206, "touchesUpper": 4, "touchesLower": 6, "volumeConfirmed": "", - "boundaryUtilization": 0.09423792705949945, + "activityScore": 0.09423792705949945, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.1004173045532496, + "strength": 0.11219704543568702, "chartPath": "charts/20260120_SH603005_晶方科技.png", "chartPathDetail": "charts/20260120_SH603005_晶方科技_detail.png" }, + { + "idx": 54, + "code": "SZ000722", + "name": "湖南发展", + "strengthUp": 0.11189572237297984, + "strengthDown": 0.11189572237297984, + "direction": "none", + "widthRatio": 0.16117444007433868, + "touchesUpper": 5, + "touchesLower": 2, + "volumeConfirmed": "", + "activityScore": 0.08798114509673645, + "tiltScore": 0.5, + "date": 20260120, + "hasTriangle": true, + "strength": 0.11189572237297984, + "chartPath": "charts/20260120_SZ000722_湖南发展.png", + "chartPathDetail": "charts/20260120_SZ000722_湖南发展_detail.png" + }, { "idx": 79, "code": "SZ002966", "name": "苏州银行", - "strengthUp": 0.09178123721898465, - "strengthDown": 0.09178123721898465, + "strengthUp": 0.10487848984668484, + "strengthDown": 0.10487848984668484, "direction": "none", "widthRatio": 0.15024073729732276, "touchesUpper": 3, "touchesLower": 5, "volumeConfirmed": "", - "boundaryUtilization": 0.1047780210216016, + "activityScore": 0.1047780210216016, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.09178123721898465, + "strength": 0.10487848984668484, "chartPath": "charts/20260120_SZ002966_苏州银行.png", "chartPathDetail": "charts/20260120_SZ002966_苏州银行_detail.png" }, @@ -1248,17 +1258,18 @@ "idx": 63, "code": "SZ002142", "name": "宁波银行", - "strengthUp": 0.09042608326894579, - "strengthDown": 0.09042608326894579, + "strengthUp": 0.10477713216177321, + "strengthDown": 0.10477713216177321, "direction": "none", "widthRatio": 0.13991351758720233, "touchesUpper": 4, "touchesLower": 6, "volumeConfirmed": "", - "boundaryUtilization": 0.11480839114261941, + "activityScore": 0.11480839114261941, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.09042608326894579, + "strength": 0.10477713216177321, "chartPath": "charts/20260120_SZ002142_宁波银行.png", "chartPathDetail": "charts/20260120_SZ002142_宁波银行_detail.png" }, @@ -1266,17 +1277,18 @@ "idx": 98, "code": "SZ300892", "name": "品渥食品", - "strengthUp": 0.08334022107272326, - "strengthDown": 0.08334022107272326, + "strengthUp": 0.09790798372541941, + "strengthDown": 0.09790798372541941, "direction": "none", "widthRatio": 0.2865112467693385, "touchesUpper": 4, "touchesLower": 3, "volumeConfirmed": "", - "boundaryUtilization": 0.11654210122156917, + "activityScore": 0.11654210122156917, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.08334022107272326, + "strength": 0.09790798372541941, "chartPath": "charts/20260120_SZ300892_品渥食品.png", "chartPathDetail": "charts/20260120_SZ300892_品渥食品_detail.png" }, @@ -1284,17 +1296,18 @@ "idx": 72, "code": "SZ002594", "name": "比亚迪", - "strengthUp": 0.0808193394980936, - "strengthDown": 0.0808193394980936, + "strengthUp": 0.09233096068217786, + "strengthDown": 0.09233096068217786, "direction": "none", "widthRatio": 0.08603808634243997, "touchesUpper": 4, "touchesLower": 3, "volumeConfirmed": "", - "boundaryUtilization": 0.0920929694726742, + "activityScore": 0.0920929694726742, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.0808193394980936, + "strength": 0.09233096068217786, "chartPath": "charts/20260120_SZ002594_比亚迪.png", "chartPathDetail": "charts/20260120_SZ002594_比亚迪_detail.png" }, @@ -1302,143 +1315,151 @@ "idx": 97, "code": "SZ300841", "name": "康华生物", - "strengthUp": 0.07511559116446827, - "strengthDown": 0.07511559116446827, + "strengthUp": 0.08635645424076827, + "strengthDown": 0.08635645424076827, "direction": "none", "widthRatio": 0.13074436892117244, "touchesUpper": 4, "touchesLower": 4, "volumeConfirmed": "", - "boundaryUtilization": 0.08992690461040005, + "activityScore": 0.08992690461040005, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.07511559116446827, + "strength": 0.08635645424076827, "chartPath": "charts/20260120_SZ300841_康华生物.png", "chartPathDetail": "charts/20260120_SZ300841_康华生物_detail.png" }, - { - "idx": 21, - "code": "SH601868", - "name": "中国能建", - "strengthUp": 0.07285097771913748, - "strengthDown": 0.07285097771913748, - "direction": "none", - "widthRatio": 0.18980028469994004, - "touchesUpper": 2, - "touchesLower": 10, - "volumeConfirmed": "", - "boundaryUtilization": 0.060127412133448764, - "date": 20260120, - "hasTriangle": true, - "strength": 0.07285097771913748, - "chartPath": "charts/20260120_SH601868_中国能建.png", - "chartPathDetail": "charts/20260120_SH601868_中国能建_detail.png" - }, { "idx": 34, "code": "SH603990", "name": "麦迪科技", - "strengthUp": 0.07122406340255104, - "strengthDown": 0.07122406340255104, + "strengthUp": 0.08462117122189203, + "strengthDown": 0.08462117122189203, "direction": "none", "widthRatio": 0.22196961351919475, "touchesUpper": 6, "touchesLower": 5, "volumeConfirmed": "", - "boundaryUtilization": 0.10717686255472789, + "activityScore": 0.10717686255472789, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.07122406340255104, + "strength": 0.08462117122189203, "chartPath": "charts/20260120_SH603990_麦迪科技.png", "chartPathDetail": "charts/20260120_SH603990_麦迪科技_detail.png" }, { - "idx": 60, - "code": "SZ001391", - "name": "国货航", - "strengthUp": 0.0693249791454885, - "strengthDown": 0.0693249791454885, + "idx": 21, + "code": "SH601868", + "name": "中国能建", + "strengthUp": 0.08036690423581859, + "strengthDown": 0.08036690423581859, "direction": "none", - "widthRatio": 0.23528860034807667, - "touchesUpper": 6, - "touchesLower": 2, + "widthRatio": 0.18980028469994004, + "touchesUpper": 2, + "touchesLower": 10, "volumeConfirmed": "", - "boundaryUtilization": 0.06875238312611007, + "activityScore": 0.060127412133448764, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.0693249791454885, - "chartPath": "charts/20260120_SZ001391_国货航.png", - "chartPathDetail": "charts/20260120_SZ001391_国货航_detail.png" - }, - { - "idx": 25, - "code": "SH603183", - "name": "建研院", - "strengthUp": 0.06877168132898767, - "strengthDown": 0.06877168132898767, - "direction": "none", - "widthRatio": 0.08924582407848107, - "touchesUpper": 3, - "touchesLower": 4, - "volumeConfirmed": "", - "boundaryUtilization": 0.08633813680920435, - "date": 20260120, - "hasTriangle": true, - "strength": 0.06877168132898767, - "chartPath": "charts/20260120_SH603183_建研院.png", - "chartPathDetail": "charts/20260120_SH603183_建研院_detail.png" + "strength": 0.08036690423581859, + "chartPath": "charts/20260120_SH601868_中国能建.png", + "chartPathDetail": "charts/20260120_SH601868_中国能建_detail.png" }, { "idx": 29, "code": "SH603527", "name": "众源新材", - "strengthUp": 0.06822445969741203, - "strengthDown": 0.06822445969741203, + "strengthUp": 0.07963635816120598, + "strengthDown": 0.07963635816120598, "direction": "none", "widthRatio": 0.0950555464327197, "touchesUpper": 5, "touchesLower": 2, "volumeConfirmed": "", - "boundaryUtilization": 0.09129518771035168, + "activityScore": 0.09129518771035168, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.06822445969741203, + "strength": 0.07963635816120598, "chartPath": "charts/20260120_SH603527_众源新材.png", "chartPathDetail": "charts/20260120_SH603527_众源新材_detail.png" }, + { + "idx": 25, + "code": "SH603183", + "name": "建研院", + "strengthUp": 0.07956394843013821, + "strengthDown": 0.07956394843013821, + "direction": "none", + "widthRatio": 0.08924582407848107, + "touchesUpper": 3, + "touchesLower": 4, + "volumeConfirmed": "", + "activityScore": 0.08633813680920435, + "tiltScore": 0.5, + "date": 20260120, + "hasTriangle": true, + "strength": 0.07956394843013821, + "chartPath": "charts/20260120_SH603183_建研院.png", + "chartPathDetail": "charts/20260120_SH603183_建研院_detail.png" + }, { "idx": 27, "code": "SH603315", "name": "福鞍股份", - "strengthUp": 0.06614875251036849, - "strengthDown": 0.06614875251036849, + "strengthUp": 0.07857406162319625, + "strengthDown": 0.07857406162319625, "direction": "none", "widthRatio": 0.22510872342227875, "touchesUpper": 4, "touchesLower": 5, "volumeConfirmed": "", - "boundaryUtilization": 0.09940247290262211, + "activityScore": 0.09940247290262211, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.06614875251036849, + "strength": 0.07857406162319625, "chartPath": "charts/20260120_SH603315_福鞍股份.png", "chartPathDetail": "charts/20260120_SH603315_福鞍股份_detail.png" }, + { + "idx": 60, + "code": "SZ001391", + "name": "国货航", + "strengthUp": 0.07791902703625227, + "strengthDown": 0.07791902703625227, + "direction": "none", + "widthRatio": 0.23528860034807667, + "touchesUpper": 6, + "touchesLower": 2, + "volumeConfirmed": "", + "activityScore": 0.06875238312611007, + "tiltScore": 0.5, + "date": 20260120, + "hasTriangle": true, + "strength": 0.07791902703625227, + "chartPath": "charts/20260120_SZ001391_国货航.png", + "chartPathDetail": "charts/20260120_SZ001391_国货航_detail.png" + }, { "idx": 5, "code": "SH600281", "name": "华阳新材", - "strengthUp": 0.06527286407926562, - "strengthDown": 0.06527286407926562, + "strengthUp": 0.0760262283650135, + "strengthDown": 0.0760262283650135, "direction": "none", "widthRatio": 0.07438652259509536, "touchesUpper": 5, "touchesLower": 3, "volumeConfirmed": "", - "boundaryUtilization": 0.08602691428598316, + "activityScore": 0.08602691428598316, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.06527286407926562, + "strength": 0.0760262283650135, "chartPath": "charts/20260120_SH600281_华阳新材.png", "chartPathDetail": "charts/20260120_SH600281_华阳新材_detail.png" }, @@ -1446,215 +1467,265 @@ "idx": 19, "code": "SH601236", "name": "红塔证券", - "strengthUp": 0.06457139044520376, - "strengthDown": 0.06457139044520376, + "strengthUp": 0.0749961896581831, + "strengthDown": 0.0749961896581831, "direction": "none", "widthRatio": 0.05887454623774115, "touchesUpper": 3, "touchesLower": 4, "volumeConfirmed": "", - "boundaryUtilization": 0.08339839370383481, + "activityScore": 0.08339839370383481, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.06457139044520376, + "strength": 0.0749961896581831, "chartPath": "charts/20260120_SH601236_红塔证券.png", "chartPathDetail": "charts/20260120_SH601236_红塔证券_detail.png" }, - { - "idx": 87, - "code": "SZ300328", - "name": "宜安科技", - "strengthUp": 0.06316736600444743, - "strengthDown": 0.06316736600444743, - "direction": "none", - "widthRatio": 0.13703331095825805, - "touchesUpper": 2, - "touchesLower": 6, - "volumeConfirmed": "", - "boundaryUtilization": 0.08584252992085407, - "date": 20260120, - "hasTriangle": true, - "strength": 0.06316736600444743, - "chartPath": "charts/20260120_SZ300328_宜安科技.png", - "chartPathDetail": "charts/20260120_SZ300328_宜安科技_detail.png" - }, { "idx": 24, "code": "SH603118", "name": "共进股份", - "strengthUp": 0.06283308319739513, - "strengthDown": 0.06283308319739513, + "strengthUp": 0.07410259723680666, + "strengthDown": 0.07410259723680666, "direction": "none", "widthRatio": 0.2105774382355951, "touchesUpper": 5, "touchesLower": 4, "volumeConfirmed": "", - "boundaryUtilization": 0.0901561123152923, + "activityScore": 0.0901561123152923, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.06283308319739513, + "strength": 0.07410259723680666, "chartPath": "charts/20260120_SH603118_共进股份.png", "chartPathDetail": "charts/20260120_SH603118_共进股份_detail.png" }, + { + "idx": 87, + "code": "SZ300328", + "name": "宜安科技", + "strengthUp": 0.07389768224455419, + "strengthDown": 0.07389768224455419, + "direction": "none", + "widthRatio": 0.13703331095825805, + "touchesUpper": 2, + "touchesLower": 6, + "volumeConfirmed": "", + "activityScore": 0.08584252992085407, + "tiltScore": 0.5, + "date": 20260120, + "hasTriangle": true, + "strength": 0.07389768224455419, + "chartPath": "charts/20260120_SZ300328_宜安科技.png", + "chartPathDetail": "charts/20260120_SZ300328_宜安科技_detail.png" + }, { "idx": 57, "code": "SZ000931", "name": "中关村", - "strengthUp": 0.06058140475842155, - "strengthDown": 0.06058140475842155, + "strengthUp": 0.0726854614298274, + "strengthDown": 0.0726854614298274, "direction": "none", "widthRatio": 0.2691795834744121, "touchesUpper": 4, "touchesLower": 4, "volumeConfirmed": "", - "boundaryUtilization": 0.09683245337124678, + "activityScore": 0.09683245337124678, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.06058140475842155, + "strength": 0.0726854614298274, "chartPath": "charts/20260120_SZ000931_中关村.png", "chartPathDetail": "charts/20260120_SZ000931_中关村_detail.png" }, - { - "idx": 38, - "code": "SH688089", - "name": "嘉必优", - "strengthUp": 0.05992176218369937, - "strengthDown": 0.05992176218369937, - "direction": "none", - "widthRatio": 0.15997473554088507, - "touchesUpper": 3, - "touchesLower": 2, - "volumeConfirmed": "", - "boundaryUtilization": 0.06899678345140317, - "date": 20260120, - "hasTriangle": true, - "strength": 0.05992176218369937, - "chartPath": "charts/20260120_SH688089_嘉必优.png", - "chartPathDetail": "charts/20260120_SH688089_嘉必优_detail.png" - }, { "idx": 100, "code": "SZ300998", "name": "宁波方正", - "strengthUp": 0.05892778600698566, - "strengthDown": 0.05892778600698566, + "strengthUp": 0.06949501124252137, + "strengthDown": 0.06949501124252137, "direction": "none", "widthRatio": 0.20127021221897767, "touchesUpper": 5, "touchesLower": 2, "volumeConfirmed": "", - "boundaryUtilization": 0.0845378018842857, + "activityScore": 0.0845378018842857, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.05892778600698566, + "strength": 0.06949501124252137, "chartPath": "charts/20260120_SZ300998_宁波方正.png", "chartPathDetail": "charts/20260120_SZ300998_宁波方正_detail.png" }, { - "idx": 59, - "code": "SZ001287", - "name": "中电港", - "strengthUp": 0.05492696430715849, - "strengthDown": 0.05492696430715849, + "idx": 38, + "code": "SH688089", + "name": "嘉必优", + "strengthUp": 0.06854636011512477, + "strengthDown": 0.06854636011512477, "direction": "none", - "widthRatio": 0.12706716054053835, - "touchesUpper": 2, - "touchesLower": 5, + "widthRatio": 0.15997473554088507, + "touchesUpper": 3, + "touchesLower": 2, "volumeConfirmed": "", - "boundaryUtilization": 0.06085899816450469, + "activityScore": 0.06899678345140317, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.05492696430715849, - "chartPath": "charts/20260120_SZ001287_中电港.png", - "chartPathDetail": "charts/20260120_SZ001287_中电港_detail.png" - }, - { - "idx": 94, - "code": "SZ300683", - "name": "海特生物", - "strengthUp": 0.04511755232687821, - "strengthDown": 0.053844470846544146, - "direction": "none", - "widthRatio": 0.0440222754787381, - "touchesUpper": 2, - "touchesLower": 3, - "volumeConfirmed": "", - "boundaryUtilization": 0.059218473592453844, - "date": 20260120, - "hasTriangle": true, - "strength": 0.053844470846544146, - "chartPath": "charts/20260120_SZ300683_海特生物.png", - "chartPathDetail": "charts/20260120_SZ300683_海特生物_detail.png" + "strength": 0.06854636011512477, + "chartPath": "charts/20260120_SH688089_嘉必优.png", + "chartPathDetail": "charts/20260120_SH688089_嘉必优_detail.png" }, { "idx": 67, "code": "SZ002343", "name": "慈文传媒", - "strengthUp": 0.053350355288705936, - "strengthDown": 0.053350355288705936, + "strengthUp": 0.06442862184910073, + "strengthDown": 0.06442862184910073, "direction": "none", "widthRatio": 0.2873372553832457, "touchesUpper": 4, "touchesLower": 3, "volumeConfirmed": "", - "boundaryUtilization": 0.08862613248315838, + "activityScore": 0.08862613248315838, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.053350355288705936, + "strength": 0.06442862184910073, "chartPath": "charts/20260120_SZ002343_慈文传媒.png", "chartPathDetail": "charts/20260120_SZ002343_慈文传媒_detail.png" }, + { + "idx": 59, + "code": "SZ001287", + "name": "中电港", + "strengthUp": 0.06253433907772157, + "strengthDown": 0.06253433907772157, + "direction": "none", + "widthRatio": 0.12706716054053835, + "touchesUpper": 2, + "touchesLower": 5, + "volumeConfirmed": "", + "activityScore": 0.06085899816450469, + "tiltScore": 0.5, + "date": 20260120, + "hasTriangle": true, + "strength": 0.06253433907772157, + "chartPath": "charts/20260120_SZ001287_中电港.png", + "chartPathDetail": "charts/20260120_SZ001287_中电港_detail.png" + }, { "idx": 77, "code": "SZ002857", "name": "三晖电气", - "strengthUp": 0.05233292182558794, - "strengthDown": 0.05233292182558794, + "strengthUp": 0.061613610621135996, + "strengthDown": 0.061613610621135996, "direction": "none", "widthRatio": 0.1347956582800327, "touchesUpper": 3, "touchesLower": 3, "volumeConfirmed": "", - "boundaryUtilization": 0.07424551036438445, + "activityScore": 0.07424551036438445, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.05233292182558794, + "strength": 0.061613610621135996, "chartPath": "charts/20260120_SZ002857_三晖电气.png", "chartPathDetail": "charts/20260120_SZ002857_三晖电气_detail.png" }, + { + "idx": 94, + "code": "SZ300683", + "name": "海特生物", + "strengthUp": 0.052519861525934936, + "strengthDown": 0.06037408819363428, + "direction": "none", + "widthRatio": 0.0440222754787381, + "touchesUpper": 2, + "touchesLower": 3, + "volumeConfirmed": "", + "activityScore": 0.059218473592453844, + "tiltScore": 0.5, + "date": 20260120, + "hasTriangle": true, + "strength": 0.06037408819363428, + "chartPath": "charts/20260120_SZ300683_海特生物.png", + "chartPathDetail": "charts/20260120_SZ300683_海特生物_detail.png" + }, + { + "idx": 107, + "code": "SZ301458", + "name": "钧崴电子", + "strengthUp": 0.05835969611375812, + "strengthDown": 0.05835969611375812, + "direction": "none", + "widthRatio": 0.4366678022030362, + "touchesUpper": 5, + "touchesLower": 3, + "volumeConfirmed": "", + "activityScore": 0.08774351971765405, + "tiltScore": 0.5, + "date": 20260120, + "hasTriangle": true, + "strength": 0.05835969611375812, + "chartPath": "charts/20260120_SZ301458_钧崴电子.png", + "chartPathDetail": "charts/20260120_SZ301458_钧崴电子_detail.png" + }, { "idx": 33, "code": "SH603900", "name": "莱绅通灵", - "strengthUp": 0.049120854458999996, - "strengthDown": 0.049120854458999996, + "strengthUp": 0.057882464087807915, + "strengthDown": 0.057882464087807915, "direction": "none", "widthRatio": 0.13682392471321897, "touchesUpper": 3, "touchesLower": 3, "volumeConfirmed": "", - "boundaryUtilization": 0.07009287703046332, + "activityScore": 0.07009287703046332, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.049120854458999996, + "strength": 0.057882464087807915, "chartPath": "charts/20260120_SH603900_莱绅通灵.png", "chartPathDetail": "charts/20260120_SH603900_莱绅通灵_detail.png" }, + { + "idx": 105, + "code": "SZ301290", + "name": "东星医疗", + "strengthUp": 0.05669665519074302, + "strengthDown": 0.05669665519074302, + "direction": "none", + "widthRatio": 0.23779614697305917, + "touchesUpper": 3, + "touchesLower": 3, + "volumeConfirmed": "", + "activityScore": 0.07509605911987326, + "tiltScore": 0.5, + "date": 20260120, + "hasTriangle": true, + "strength": 0.05669665519074302, + "chartPath": "charts/20260120_SZ301290_东星医疗.png", + "chartPathDetail": "charts/20260120_SZ301290_东星医疗_detail.png" + }, { "idx": 31, "code": "SH603707", "name": "健友股份", - "strengthUp": 0.04872350052593199, - "strengthDown": 0.04872350052593199, + "strengthUp": 0.05630072651301386, + "strengthDown": 0.05630072651301386, "direction": "none", "widthRatio": 0.00781033600291944, "touchesUpper": 5, "touchesLower": 2, "volumeConfirmed": "", - "boundaryUtilization": 0.06061780789665496, + "activityScore": 0.06061780789665496, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.04872350052593199, + "strength": 0.05630072651301386, "chartPath": "charts/20260120_SH603707_健友股份.png", "chartPathDetail": "charts/20260120_SH603707_健友股份_detail.png" }, @@ -1662,125 +1733,94 @@ "idx": 7, "code": "SH600395", "name": "盘江股份", - "strengthUp": 0.04829618142276936, - "strengthDown": 0.04829618142276936, + "strengthUp": 0.056187035542285074, + "strengthDown": 0.056187035542285074, "direction": "none", "widthRatio": 0.06674904774137999, "touchesUpper": 3, "touchesLower": 5, "volumeConfirmed": "", - "boundaryUtilization": 0.06312683295612573, + "activityScore": 0.06312683295612573, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.04829618142276936, + "strength": 0.056187035542285074, "chartPath": "charts/20260120_SH600395_盘江股份.png", "chartPathDetail": "charts/20260120_SH600395_盘江股份_detail.png" }, { - "idx": 93, - "code": "SZ300632", - "name": "光莆股份", - "strengthUp": 0.04818691391738742, - "strengthDown": 0.042191281646060855, + "idx": 86, + "code": "SZ300278", + "name": "华昌达", + "strengthUp": 0.05589886043710886, + "strengthDown": 0.05589886043710886, "direction": "none", - "widthRatio": 0.02846616403214607, - "touchesUpper": 3, + "widthRatio": 0.36793662378306974, + "touchesUpper": 4, "touchesLower": 5, "volumeConfirmed": "", - "boundaryUtilization": 0.054809356716155194, + "activityScore": 0.08411646140089421, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.04818691391738742, - "chartPath": "charts/20260120_SZ300632_光莆股份.png", - "chartPathDetail": "charts/20260120_SZ300632_光莆股份_detail.png" - }, - { - "idx": 40, - "code": "SH688202", - "name": "美迪西", - "strengthUp": 0.04758849421328544, - "strengthDown": 0.04758849421328544, - "direction": "none", - "widthRatio": 0.31351008126626717, - "touchesUpper": 2, - "touchesLower": 3, - "volumeConfirmed": "", - "boundaryUtilization": 0.06468849967464027, - "date": 20260120, - "hasTriangle": true, - "strength": 0.04758849421328544, - "chartPath": "charts/20260120_SH688202_美迪西.png", - "chartPathDetail": "charts/20260120_SH688202_美迪西_detail.png" - }, - { - "idx": 107, - "code": "SZ301458", - "name": "钧崴电子", - "strengthUp": 0.04739175614905136, - "strengthDown": 0.04739175614905136, - "direction": "none", - "widthRatio": 0.4366678022030362, - "touchesUpper": 5, - "touchesLower": 3, - "volumeConfirmed": "", - "boundaryUtilization": 0.08774351971765405, - "date": 20260120, - "hasTriangle": true, - "strength": 0.04739175614905136, - "chartPath": "charts/20260120_SZ301458_钧崴电子.png", - "chartPathDetail": "charts/20260120_SZ301458_钧崴电子_detail.png" - }, - { - "idx": 105, - "code": "SZ301290", - "name": "东星医疗", - "strengthUp": 0.047309647800758865, - "strengthDown": 0.047309647800758865, - "direction": "none", - "widthRatio": 0.23779614697305917, - "touchesUpper": 3, - "touchesLower": 3, - "volumeConfirmed": "", - "boundaryUtilization": 0.07509605911987326, - "date": 20260120, - "hasTriangle": true, - "strength": 0.047309647800758865, - "chartPath": "charts/20260120_SZ301290_东星医疗.png", - "chartPathDetail": "charts/20260120_SZ301290_东星医疗_detail.png" + "strength": 0.05589886043710886, + "chartPath": "charts/20260120_SZ300278_华昌达.png", + "chartPathDetail": "charts/20260120_SZ300278_华昌达_detail.png" }, { "idx": 35, "code": "SH605138", "name": "盛泰集团", - "strengthUp": 0.04723792082752581, - "strengthDown": 0.04723792082752581, + "strengthUp": 0.055865202210705366, + "strengthDown": 0.055865202210705366, "direction": "none", "widthRatio": 0.29759336000089764, "touchesUpper": 2, "touchesLower": 3, "volumeConfirmed": "", - "boundaryUtilization": 0.06901825106543649, + "activityScore": 0.06901825106543649, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.04723792082752581, + "strength": 0.055865202210705366, "chartPath": "charts/20260120_SH605138_盛泰集团.png", "chartPathDetail": "charts/20260120_SH605138_盛泰集团_detail.png" }, + { + "idx": 40, + "code": "SH688202", + "name": "美迪西", + "strengthUp": 0.05567455667261547, + "strengthDown": 0.05567455667261547, + "direction": "none", + "widthRatio": 0.31351008126626717, + "touchesUpper": 2, + "touchesLower": 3, + "volumeConfirmed": "", + "activityScore": 0.06468849967464027, + "tiltScore": 0.5, + "date": 20260120, + "hasTriangle": true, + "strength": 0.05567455667261547, + "chartPath": "charts/20260120_SH688202_美迪西.png", + "chartPathDetail": "charts/20260120_SH688202_美迪西_detail.png" + }, { "idx": 42, "code": "SH688318", "name": "财富趋势", - "strengthUp": 0.045923049325178864, - "strengthDown": 0.045923049325178864, + "strengthUp": 0.05547353256292839, + "strengthDown": 0.05547353256292839, "direction": "none", "widthRatio": 0.27505993688351926, "touchesUpper": 2, "touchesLower": 3, "volumeConfirmed": "", - "boundaryUtilization": 0.07640386590199624, + "activityScore": 0.07640386590199624, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.045923049325178864, + "strength": 0.05547353256292839, "chartPath": "charts/20260120_SH688318_财富趋势.png", "chartPathDetail": "charts/20260120_SH688318_财富趋势_detail.png" }, @@ -1788,89 +1828,75 @@ "idx": 99, "code": "SZ300946", "name": "恒而达", - "strengthUp": 0.04570070738192357, - "strengthDown": 0.04570070738192357, + "strengthUp": 0.05471545201814328, + "strengthDown": 0.05471545201814328, "direction": "none", "widthRatio": 0.22719307281507875, "touchesUpper": 3, "touchesLower": 3, "volumeConfirmed": "", - "boundaryUtilization": 0.07211795708975773, + "activityScore": 0.07211795708975773, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.04570070738192357, + "strength": 0.05471545201814328, "chartPath": "charts/20260120_SZ300946_恒而达.png", "chartPathDetail": "charts/20260120_SZ300946_恒而达_detail.png" }, + { + "idx": 93, + "code": "SZ300632", + "name": "光莆股份", + "strengthUp": 0.054438520279774166, + "strengthDown": 0.04904245123558025, + "direction": "none", + "widthRatio": 0.02846616403214607, + "touchesUpper": 3, + "touchesLower": 5, + "volumeConfirmed": "", + "activityScore": 0.054809356716155194, + "tiltScore": 0.5, + "date": 20260120, + "hasTriangle": true, + "strength": 0.054438520279774166, + "chartPath": "charts/20260120_SZ300632_光莆股份.png", + "chartPathDetail": "charts/20260120_SZ300632_光莆股份_detail.png" + }, { "idx": 61, "code": "SZ002042", "name": "华孚时尚", - "strengthUp": 0.045680217648273125, - "strengthDown": 0.045680217648273125, + "strengthUp": 0.053820385373766585, + "strengthDown": 0.053820385373766585, "direction": "none", "widthRatio": 0.1301004225125526, "touchesUpper": 4, "touchesLower": 2, "volumeConfirmed": "", - "boundaryUtilization": 0.0651213418039477, + "activityScore": 0.0651213418039477, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.045680217648273125, + "strength": 0.053820385373766585, "chartPath": "charts/20260120_SZ002042_华孚时尚.png", "chartPathDetail": "charts/20260120_SZ002042_华孚时尚_detail.png" }, - { - "idx": 86, - "code": "SZ300278", - "name": "华昌达", - "strengthUp": 0.04538430276199708, - "strengthDown": 0.04538430276199708, - "direction": "none", - "widthRatio": 0.36793662378306974, - "touchesUpper": 4, - "touchesLower": 5, - "volumeConfirmed": "", - "boundaryUtilization": 0.08411646140089421, - "date": 20260120, - "hasTriangle": true, - "strength": 0.04538430276199708, - "chartPath": "charts/20260120_SZ300278_华昌达.png", - "chartPathDetail": "charts/20260120_SZ300278_华昌达_detail.png" - }, - { - "idx": 30, - "code": "SH603618", - "name": "杭电股份", - "strengthUp": 0.04444160124729136, - "strengthDown": 0.04444160124729136, - "direction": "none", - "widthRatio": 0.15144818048774875, - "touchesUpper": 3, - "touchesLower": 2, - "volumeConfirmed": "", - "boundaryUtilization": 0.048952579398915515, - "date": 20260120, - "hasTriangle": true, - "strength": 0.04444160124729136, - "chartPath": "charts/20260120_SH603618_杭电股份.png", - "chartPathDetail": "charts/20260120_SH603618_杭电股份_detail.png" - }, { "idx": 96, "code": "SZ300790", "name": "宇瞳光学", - "strengthUp": 0.043513037557854975, - "strengthDown": 0.043513037557854975, + "strengthUp": 0.05257179061101287, + "strengthDown": 0.05257179061101287, "direction": "none", "widthRatio": 0.3018970777007482, "touchesUpper": 3, "touchesLower": 3, "volumeConfirmed": "", - "boundaryUtilization": 0.0724700244252632, + "activityScore": 0.0724700244252632, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.043513037557854975, + "strength": 0.05257179061101287, "chartPath": "charts/20260120_SZ300790_宇瞳光学.png", "chartPathDetail": "charts/20260120_SZ300790_宇瞳光学_detail.png" }, @@ -1878,71 +1904,56 @@ "idx": 83, "code": "SZ300128", "name": "锦富技术", - "strengthUp": 0.04167849536810688, - "strengthDown": 0.04167849536810688, + "strengthUp": 0.05137309586579778, + "strengthDown": 0.05137309586579778, "direction": "none", "widthRatio": 0.3612532098770752, "touchesUpper": 3, "touchesLower": 4, "volumeConfirmed": "", - "boundaryUtilization": 0.07755680398152726, + "activityScore": 0.07755680398152726, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.04167849536810688, + "strength": 0.05137309586579778, "chartPath": "charts/20260120_SZ300128_锦富技术.png", "chartPathDetail": "charts/20260120_SZ300128_锦富技术_detail.png" }, { - "idx": 17, - "code": "SH600984", - "name": "建设机械", - "strengthUp": 0.04124324183514141, - "strengthDown": 0.04124324183514141, + "idx": 30, + "code": "SH603618", + "name": "杭电股份", + "strengthUp": 0.0505606736721558, + "strengthDown": 0.0505606736721558, "direction": "none", - "widthRatio": 0.06214193787665361, - "touchesUpper": 2, - "touchesLower": 5, + "widthRatio": 0.15144818048774875, + "touchesUpper": 3, + "touchesLower": 2, "volumeConfirmed": "", - "boundaryUtilization": 0.051936635225559434, + "activityScore": 0.048952579398915515, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.04124324183514141, - "chartPath": "charts/20260120_SH600984_建设机械.png", - "chartPathDetail": "charts/20260120_SH600984_建设机械_detail.png" - }, - { - "idx": 9, - "code": "SH600531", - "name": "豫光金铅", - "strengthUp": 0.04121635294344127, - "strengthDown": 0.04121635294344127, - "direction": "none", - "widthRatio": 0.22872671560227054, - "touchesUpper": 2, - "touchesLower": 4, - "volumeConfirmed": "", - "boundaryUtilization": 0.053857924216099126, - "date": 20260120, - "hasTriangle": true, - "strength": 0.04121635294344127, - "chartPath": "charts/20260120_SH600531_豫光金铅.png", - "chartPathDetail": "charts/20260120_SH600531_豫光金铅_detail.png" + "strength": 0.0505606736721558, + "chartPath": "charts/20260120_SH603618_杭电股份.png", + "chartPathDetail": "charts/20260120_SH603618_杭电股份_detail.png" }, { "idx": 75, "code": "SZ002748", "name": "世龙实业", - "strengthUp": 0.040859083087833745, - "strengthDown": 0.040859083087833745, + "strengthUp": 0.048085901229749366, + "strengthDown": 0.048085901229749366, "direction": "none", "widthRatio": 0.1157279750374011, "touchesUpper": 3, "touchesLower": 4, "volumeConfirmed": "", - "boundaryUtilization": 0.057814545135324975, + "activityScore": 0.057814545135324975, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.040859083087833745, + "strength": 0.048085901229749366, "chartPath": "charts/20260120_SZ002748_世龙实业.png", "chartPathDetail": "charts/20260120_SZ002748_世龙实业_detail.png" }, @@ -1950,71 +1961,113 @@ "idx": 55, "code": "SZ000796", "name": "凯撒旅业", - "strengthUp": 0.04002292068141737, - "strengthDown": 0.04002292068141737, + "strengthUp": 0.047962173181559146, + "strengthDown": 0.047962173181559146, "direction": "none", "widthRatio": 0.2257372064001412, "touchesUpper": 3, "touchesLower": 2, "volumeConfirmed": "", - "boundaryUtilization": 0.06351402000113422, + "activityScore": 0.06351402000113422, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.04002292068141737, + "strength": 0.047962173181559146, "chartPath": "charts/20260120_SZ000796_凯撒旅业.png", "chartPathDetail": "charts/20260120_SZ000796_凯撒旅业_detail.png" }, { - "idx": 14, - "code": "SH600795", - "name": "国电电力", - "strengthUp": 0.0381352739657863, - "strengthDown": 0.018200466054414978, - "direction": "up", - "widthRatio": 0.032561936783290356, + "idx": 9, + "code": "SH600531", + "name": "豫光金铅", + "strengthUp": 0.04794859347045365, + "strengthDown": 0.04794859347045365, + "direction": "none", + "widthRatio": 0.22872671560227054, "touchesUpper": 2, - "touchesLower": 3, - "volumeConfirmed": "False", - "boundaryUtilization": 0.020274915613298243, + "touchesLower": 4, + "volumeConfirmed": "", + "activityScore": 0.053857924216099126, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.0381352739657863, - "chartPath": "charts/20260120_SH600795_国电电力.png", - "chartPathDetail": "charts/20260120_SH600795_国电电力_detail.png" + "strength": 0.04794859347045365, + "chartPath": "charts/20260120_SH600531_豫光金铅.png", + "chartPathDetail": "charts/20260120_SH600531_豫光金铅_detail.png" + }, + { + "idx": 17, + "code": "SH600984", + "name": "建设机械", + "strengthUp": 0.04773532123833634, + "strengthDown": 0.04773532123833634, + "direction": "none", + "widthRatio": 0.06214193787665361, + "touchesUpper": 2, + "touchesLower": 5, + "volumeConfirmed": "", + "activityScore": 0.051936635225559434, + "tiltScore": 0.5, + "date": 20260120, + "hasTriangle": true, + "strength": 0.04773532123833634, + "chartPath": "charts/20260120_SH600984_建设机械.png", + "chartPathDetail": "charts/20260120_SH600984_建设机械_detail.png" }, { "idx": 73, "code": "SZ002644", "name": "佛慈制药", - "strengthUp": 0.03617763751854338, - "strengthDown": 0.03617763751854338, + "strengthUp": 0.043384034691262105, + "strengthDown": 0.043384034691262105, "direction": "none", "widthRatio": 0.22414110145582697, "touchesUpper": 2, "touchesLower": 4, "volumeConfirmed": "", - "boundaryUtilization": 0.05765117738174981, + "activityScore": 0.05765117738174981, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.03617763751854338, + "strength": 0.043384034691262105, "chartPath": "charts/20260120_SZ002644_佛慈制药.png", "chartPathDetail": "charts/20260120_SZ002644_佛慈制药_detail.png" }, + { + "idx": 14, + "code": "SH600795", + "name": "国电电力", + "strengthUp": 0.038558112155860205, + "strengthDown": 0.020616785035626018, + "direction": "up", + "widthRatio": 0.032561936783290356, + "touchesUpper": 2, + "touchesLower": 3, + "volumeConfirmed": "False", + "activityScore": 0.020274915613298243, + "tiltScore": 0.47671103096995127, + "date": 20260120, + "hasTriangle": true, + "strength": 0.038558112155860205, + "chartPath": "charts/20260120_SH600795_国电电力.png", + "chartPathDetail": "charts/20260120_SH600795_国电电力_detail.png" + }, { "idx": 65, "code": "SZ002242", "name": "九阳股份", - "strengthUp": 0.03241479917766246, - "strengthDown": 0.03241479917766246, + "strengthUp": 0.03807088178982384, + "strengthDown": 0.03807088178982384, "direction": "none", "widthRatio": 0.10849554328152096, "touchesUpper": 2, "touchesLower": 3, "volumeConfirmed": "", - "boundaryUtilization": 0.045248660897291, + "activityScore": 0.045248660897291, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.03241479917766246, + "strength": 0.03807088178982384, "chartPath": "charts/20260120_SZ002242_九阳股份.png", "chartPathDetail": "charts/20260120_SZ002242_九阳股份_detail.png" }, @@ -2022,17 +2075,18 @@ "idx": 15, "code": "SH600846", "name": "同济科技", - "strengthUp": 0.03030281745352293, - "strengthDown": 0.03030281745352293, + "strengthUp": 0.035044683673365586, + "strengthDown": 0.035044683673365586, "direction": "none", "widthRatio": 0.04230672506104188, "touchesUpper": 3, "touchesLower": 3, "volumeConfirmed": "", - "boundaryUtilization": 0.037934929758741257, + "activityScore": 0.037934929758741257, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.03030281745352293, + "strength": 0.035044683673365586, "chartPath": "charts/20260120_SH600846_同济科技.png", "chartPathDetail": "charts/20260120_SH600846_同济科技_detail.png" }, @@ -2040,17 +2094,18 @@ "idx": 49, "code": "SZ000039", "name": "中集集团", - "strengthUp": 0.027762834661772765, - "strengthDown": 0.027762834661772765, + "strengthUp": 0.03282153828304035, + "strengthDown": 0.03282153828304035, "direction": "none", "widthRatio": 0.14102846289352128, "touchesUpper": 2, "touchesLower": 4, "volumeConfirmed": "", - "boundaryUtilization": 0.040469628970140684, + "activityScore": 0.040469628970140684, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.027762834661772765, + "strength": 0.03282153828304035, "chartPath": "charts/20260120_SZ000039_中集集团.png", "chartPathDetail": "charts/20260120_SZ000039_中集集团_detail.png" }, @@ -2058,17 +2113,18 @@ "idx": 78, "code": "SZ002910", "name": "庄园牧场", - "strengthUp": 0.02595109833198887, - "strengthDown": 0.02595109833198887, + "strengthUp": 0.029462837189994914, + "strengthDown": 0.029462837189994914, "direction": "none", "widthRatio": 0.057656261422220724, "touchesUpper": 2, "touchesLower": 3, "volumeConfirmed": "", - "boundaryUtilization": 0.028093910864048357, + "activityScore": 0.028093910864048357, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.02595109833198887, + "strength": 0.029462837189994914, "chartPath": "charts/20260120_SZ002910_庄园牧场.png", "chartPathDetail": "charts/20260120_SZ002910_庄园牧场_detail.png" }, @@ -2076,17 +2132,18 @@ "idx": 64, "code": "SZ002192", "name": "融捷股份", - "strengthUp": 0.02338013665457102, - "strengthDown": 0.02338013665457102, + "strengthUp": 0.028213852163709897, + "strengthDown": 0.028213852163709897, "direction": "none", "widthRatio": 0.23256546452034127, "touchesUpper": 2, "touchesLower": 4, "volumeConfirmed": "", - "boundaryUtilization": 0.03866972407311103, + "activityScore": 0.03866972407311103, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.02338013665457102, + "strength": 0.028213852163709897, "chartPath": "charts/20260120_SZ002192_融捷股份.png", "chartPathDetail": "charts/20260120_SZ002192_融捷股份_detail.png" }, @@ -2094,17 +2151,18 @@ "idx": 44, "code": "SH688472", "name": "阿特斯", - "strengthUp": 0.022000344046398605, - "strengthDown": 0.022000344046398605, + "strengthUp": 0.025963265889003457, + "strengthDown": 0.025963265889003457, "direction": "none", "widthRatio": 0.22726004705445743, "touchesUpper": 3, "touchesLower": 3, "volumeConfirmed": "", - "boundaryUtilization": 0.03170337474083884, + "activityScore": 0.03170337474083884, + "tiltScore": 0.5, "date": 20260120, "hasTriangle": true, - "strength": 0.022000344046398605, + "strength": 0.025963265889003457, "chartPath": "charts/20260120_SH688472_阿特斯.png", "chartPathDetail": "charts/20260120_SH688472_阿特斯_detail.png" }, @@ -3261,8 +3319,12 @@ ${volumeText}