褚宏光 bf6baa5483 Add scoring module and enhance HTML viewer with standardization
- Add scripts/scoring/ module with normalizer, sensitivity analysis, and config
- Enhance stock_viewer.html with standardized scoring display
- Add integration tests and normalization verification scripts
- Add documentation for standardization implementation and usage guides
- Add data distribution analysis reports for strength scoring dimensions
- Update discussion documents with algorithm optimization plans
2026-01-30 18:43:37 +08:00

333 lines
11 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 收敛三角形强度分六维度 - 数据分布分析
**分析日期**: 2026-01-29
**样本量**: 18,004个有效三角形
**分析对象**: 强度分系统的6个核心维度 + 突破方向分类
---
## 📊 强度分系统构成
收敛三角形的强度评分由以下6个维度组成每个维度范围均为 [0, 1]
| 编号 | 维度名称 | 英文字段 | 权重占比 | 测量内容 |
|-----|---------|---------|---------|---------|
| 1 | **突破幅度分** | price_score | 45% | 突破后价格变化幅度 |
| 2 | **收敛度分** | convergence_score | 20% | 三角形收敛程度 |
| 3 | **成交量分** | volume_score | 15% | 突破时成交量放大 |
| 4 | **形态规则度** | geometry_score | 10% | 枢轴点拟合贴合度 |
| 5 | **价格活跃度** | activity_score | 5% | 通道空间利用率 |
| 6 | **倾斜度分** | tilt_score | 5% | 三角形倾斜程度 |
**注**: 突破幅度分分为向上(price_score_up)和向下(price_score_down)两个字段
---
## 🎯 核心发现
### 1⃣ 正态性: 全部非正态 ❌
**7/7 维度全部拒绝正态分布假设** (p值≈0)
| 维度 | 正态检验 | P值 | 结论 |
|-----|---------|-----|------|
| 突破幅度分(向上) | KS检验 | 0.000 | 非正态 |
| 突破幅度分(向下) | KS检验 | 0.000 | 非正态 |
| 收敛度分 | KS检验 | 7.3e-74 | 非正态 |
| 成交量分 | KS检验 | 0.000 | 非正态 |
| 形态规则度 | KS检验 | 0.000 | 非正态 |
| 价格活跃度 | KS检验 | 1.4e-29 | 非正态 |
| 倾斜度分 | KS检验 | 0.000 | 非正态 |
### 2⃣ 偏度分布
| 类型 | 维度数 | 占比 | 典型维度 |
|-----|-------|------|---------|
| **右偏** (>0.5) | 4 | 57% | 突破幅度分、成交量分、形态规则度 |
| 对称 (-0.5~0.5) | 2 | 29% | 收敛度分、价格活跃度 |
| **左偏** (<-0.5) | 1 | 14% | 倾斜度分 |
**右偏含义**: "多数弱信号 + 少数强信号"的长尾结构
### 3⃣ 厚尾特征排行
| 排名 | 维度 | 超额峰度 | 尾部倍数* | 等级 |
|-----|------|---------|---------|------|
| 1 🔴 | **倾斜度分** | 46.33 | 7.8× | 极端厚尾 |
| 2 🔴 | **突破幅度分(向下)** | 45.72 | 8.2× | 极端厚尾 |
| 3 🟠 | **突破幅度分(向上)** | 13.38 | 15.7× | 显著厚尾 |
| 4 🟡 | **形态规则度** | 4.56 | 11.9× | 中度厚尾 |
| 5 🟡 | **成交量分** | 2.77 | 19.1× | 中度厚尾 |
| 6 🟢 | **收敛度分** | -1.05 | 0× | 薄尾 |
| 7 🟢 | **价格活跃度** | -0.25 | 0.6× | 近正态 |
\* 尾部倍数 = 实际3σ外数据占比 ÷ 正态分布3σ外占比(0.27%)
---
## 📈 各维度详细统计
### 1. 突破幅度分(向上) - price_score_up
```
均值: 0.0556 | 中位数: 0.0000 ⚠️ | 标准差: 0.1932
范围: [0.000, 1.000] | 四分位: [0.000, 0.000]
偏度: 3.77 (强右偏) | 超额峰度: 13.38 (显著厚尾)
尾部倍数: 15.7× (极端值频繁!)
```
**解读**:
- 🔴 **中位数=0**: 超过50%的三角形尚未向上突破
- 📊 **Q25=Q75=0**: 至少75%的数据=0未突破或弱突破
- **尾部15.7倍**: 强突破事件是正态分布预测的15.7倍
- 💡 **实战建议**:
- 不要用均值(0.056)作为阈值
- 建议筛选: price_score_up > 0.15 (约P85-P90)
- 极强突破: > 0.3
### 2. 突破幅度分(向下) - price_score_down
```
均值: 0.0194 | 中位数: 0.0000 | 标准差: 0.1163
范围: [0.000, 1.000] | 四分位: [0.000, 0.000]
偏度: 6.70 (极强右偏!) | 超额峰度: 45.72 (极端厚尾!)
尾部倍数: 8.2×
```
**解读**:
- 🔴 **向下突破更稀缺**: 中位数=0, Q75=0
- 📊 **最极端的右偏**: 偏度6.70,仅次于倾斜度分
- ⚠️ **超级厚尾**: 超额峰度45.72第2高
- 💡 **实战意义**:
- 向下突破比向上突破更不可预测
- 极端向下突破是真正的黑天鹅事件
### 3. 收敛度分 - convergence_score
```
均值: 0.7980 | 中位数: 0.8033 | 标准差: 0.1226
范围: [0.550, 1.000] | 四分位: [0.702, 0.906]
偏度: -0.23 (基本对称) | 超额峰度: -1.05 (薄尾!)
尾部倍数: 0× (无极端值)
```
**解读**:
-**高质量维度**: 大多数值在0.7-0.9之间
- 📊 **薄尾分布**: 唯一的薄尾维度,接近均匀分布
- 💡 **实战建议**:
- 高质量收敛: > 0.85 (约P60-P70)
- 极佳收敛: > 0.90 (约P75+)
### 4. 成交量分 - volume_score
```
均值: 0.1505 | 中位数: 0.0000 ⚠️ | 标准差: 0.2829
范围: [0.000, 1.000] | 四分位: [0.000, 0.166]
偏度: 1.99 (右偏) | 超额峰度: 2.77 (中度厚尾)
尾部倍数: 19.1× (最高!)
```
**解读**:
- 🔴 **50%无放量**: 中位数=0
- 📊 **尾部放大最严重**: 19.1倍,是所有维度中最高
- ⚠️ **放量突破是稀缺事件**: 仅25%有明显放量(Q75=0.166)
- 💡 **策略建议**:
- ❌ 不作为必要条件 (会过滤掉50%有效信号)
- ✅ 作为加分项 (volume_score > 0.5 = 顶级信号)
### 5. 形态规则度 - geometry_score
```
均值: 0.0519 | 中位数: 0.0051 | 标准差: 0.0959
范围: [0.000, 0.492] | 四分位: [0.000, 0.052]
偏度: 2.28 (右偏) | 超额峰度: 4.56 (中度厚尾)
尾部倍数: 11.9×
```
**解读**:
- 📊 **大多数形态不够规则**: 中位数仅0.005
- ⚠️ **高规则度稀缺**: Q75=0.052
- 💡 **建议**: 此维度不适合作为硬性筛选条件
### 6. 价格活跃度 - activity_score
```
均值: 0.0688 | 中位数: 0.0709 | 标准差: 0.0211
范围: [0.006, 0.150] | 四分位: [0.055, 0.083]
偏度: -0.20 (对称) | 超额峰度: -0.25 (近正态!)
尾部倍数: 0.6× (无厚尾)
```
**解读**:
-**最接近正态的维度**: 超额峰度仅-0.25
- 📊 **分布稳定**: 标准差小(0.021),变异性低
- 💡 **特点**: 相对"正常"的维度,可靠性较高
### 7. 倾斜度分 - tilt_score
```
均值: 0.4969 | 中位数: 0.5000 | 标准差: 0.0171
范围: [0.344, 0.630] | 四分位: [0.500, 0.500] ⚠️
偏度: -6.17 (极强左偏!) | 超额峰度: 46.33 (极端厚尾!)
尾部倍数: 7.8×
```
**解读**:
- 🔴 **最极端的分布**: Q25=Q75=0.575%数据完全相同
- 📊 **算法强偏好对称三角形**: 0.5代表完全对称
- ⚠️ **上升/下降三角形稀缺**: 仅在长尾中出现
- 💡 **启示**:
- 如需识别上升/下降三角形,需调整算法参数
- 当前算法设计就是为对称三角形优化的
---
## 💡 实战建议
### ✅ 阈值设置 (基于百分位数)
```python
# 突破幅度分(向上) - 三档筛选
宽松: price_score_up > 0.10 # 约P80
适中: price_score_up > 0.15 # 约P85-P90 ⭐推荐
严格: price_score_up > 0.30 # 约P95+
# 收敛度分 - 高质量收敛
高质量: convergence_score > 0.85 # 约P60
极佳: convergence_score > 0.90 # 约P75+
# 成交量分 - 作为加分项
有放量: volume_score > 0.2 # 约P70
强放量: volume_score > 0.5 # 约P85 (稀缺信号)
```
### ❌ 禁止的做法
```python
# 错误1: 使用均值作为阈值
threshold = df['price_score_up'].mean() # 0.056, 被极端值拉高
# 错误2: 假设正态分布
mu = df['price_score_up'].mean()
sigma = df['price_score_up'].std()
threshold = mu + 2*sigma # 基于正态假设,会失效
# 错误3: 要求必须放量
signals = df[df['volume_score'] > 0] # 会过滤掉50%有效信号
```
### ✅ 推荐的策略
```python
# 策略1: 多维度组合(AND条件)
high_quality = (
(df['price_score_up'] > 0.15) & # 强突破
(df['convergence_score'] > 0.85) & # 高收敛
(df['activity_score'] > 0.06) # 正常活跃度
)
# 策略2: 放量作为加分项
premium_signals = high_quality & (df['volume_score'] > 0.5)
regular_signals = high_quality & (df['volume_score'] <= 0.5)
# 策略3: 动态百分位数
def get_dynamic_threshold(df, percentile=90):
return df['price_score_up'].quantile(percentile/100)
```
---
## 📊 维度权重合理性分析
### 当前权重分配
| 维度 | 权重 | 数据特征 | 权重合理性 |
|-----|------|---------|-----------|
| 突破幅度分 | 45% | 极端右偏+厚尾 | ✅ 合理 - 最重要的信号 |
| 收敛度分 | 20% | 对称+薄尾 | ✅ 合理 - 稳定可靠 |
| 成交量分 | 15% | 中位数=0 | ⚠️ 偏高 - 建议降至10% |
| 形态规则度 | 10% | 中位数极低 | ⚠️ 偏高 - 建议降至5% |
| 价格活跃度 | 5% | 近正态 | ✅ 合理 - 稳定但区分度低 |
| 倾斜度分 | 5% | 极端偏斜 | ✅ 合理 - 低权重适合偏好型指标 |
### 建议调整
```
突破幅度分: 45% (保持)
收敛度分: 25% (↑5%) - 最稳定可靠的维度
成交量分: 10% (↓5%) - 中位数=0导致区分度低
形态规则度: 5% (↓5%) - 数值普遍过低
价格活跃度: 10% (↑5%) - 近正态且稳定
倾斜度分: 5% (保持) - 作为辅助指标
```
---
## 🔍 异常发现与解释
### 1. 为什么突破幅度分的中位数是0?
**原因**:
- 大多数三角形检测时尚未突破或刚突破
- price_score仅在明显突破时>0
- 检测窗口内包含大量"形成中"的三角形
**不是Bug**: 这是正常现象,反映了真实市场状态
### 2. 为什么倾斜度分如此极端?
**原因**:
- 算法设计就是为识别**对称三角形**优化的
- 对称三角形(tilt_score=0.5)是主流形态
- 上升/下降三角形被视为特例
**启示**: 如需平衡识别三种类型,需调整算法权重
### 3. 为什么成交量分尾部倍数最高(19.1×)?
**原因**:
- 成交量是最不可预测的变量
- 放量突破是典型的"黑天鹅"事件
- 大多数时候无放量,但一旦放量就暴增
**意义**: 放量确认的信号确实非常稀缺
---
## 📁 文件清单
本次分析生成以下文件:
| 文件名 | 说明 |
|-------|------|
| `distribution_analysis_强度分六维度.csv` | 统计数据表 |
| `distribution_plots_强度分六维度.png` | 7个维度分布图 |
| `qq_plots_强度分六维度.png` | Q-Q图(正态性检验) |
| `boxplots_强度分六维度.png` | 箱线图(异常值识别) |
| `analyze_distribution_强度分六维度.py` | 分析脚本 |
| `强度分六维度_分析报告.md` | 本文档 |
---
## 🎯 最重要的3个结论
### 1. 所有强度分维度均非正态 → 必须改变统计方法
- 传统的均值±kσ、t检验**全部失效**
- 立即切换到百分位数和非参数方法
### 2. 突破幅度分和成交量分的极端两极分化
- 中位数=0 (大多数无突破/无放量)
- 但尾部倍数15-19× (极端事件频繁)
- **策略**: 聚焦高百分位数(P85-P95)
### 3. 倾斜度分的极端偏好 → 算法特性
- 75%恰好=0.5 (对称三角形)
- 这不是Bug,是Feature
- 当前算法就是为对称三角形设计的
---
**生成时间**: 2026-01-29
**数据版本**: converging_triangles v1原版
**分析工具**: Python + Scipy + Matplotlib