褚宏光 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

353 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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.

# 强度分标准化系统
## 概述
针对收敛三角形形态检测的18,004个样本本系统解决了**维度间不可比性**问题,实现了:
1. **分层标准化**针对4种分布类型零膨胀、点质量、正常、低区分度采用不同标准化策略
2. **灵活配置**:可配置权重、阈值、方向、筛选模式
3. **预设模式**等权、激进、保守、放量4种预设配置
4. **敏感性分析**:分析参数变化对筛选结果的影响
## 核心问题
**标准化前**的分布问题:
| 维度 | 中位数 | 分布类型 | 问题 |
|------|--------|----------|------|
| price_score_up | 0.0000 | 零膨胀 | 无法区分"未突破"vs"小幅突破" |
| price_score_down | 0.0000 | 零膨胀 | 同上 |
| volume_score | 0.0000 | 零膨胀 | 同上 |
| tilt_score | 0.5000 | 点质量 | 75%的值=0.5,缺乏区分度 |
| convergence_score | 0.8033 | 正常 | 值域偏大,等权相加时"吃掉"其他维度 |
| geometry_score | 0.0051 | 低区分度 | 值域极小,等权相加时被"吃掉" |
| activity_score | 0.0709 | 正常 | - |
**标准化后**:所有维度中位数统一为 **0.5**,可直接等权相加。
## 文件结构
```
scripts/
├── scoring/ # 核心模块
│ ├── __init__.py # 模块导出
│ ├── normalizer.py # 标准化模块4种标准化方法
│ ├── config.py # 配置管理(预设模式+自定义配置)
│ └── sensitivity.py # 敏感性分析
├── verify_normalization.py # 验证标准化效果
├── example_scoring_usage.py # 使用示例5个示例
└── scoring/generate_sensitivity_report.py # 生成完整敏感性报告
outputs/converging_triangles/ # 输出目录
├── all_results.csv # 原始数据
├── all_results_normalized.csv # 标准化后数据
├── normalization_stats_comparison.csv # 统计对比
├── normalization_comparison.png # 对比图表
├── strength_comparison.png # 强度分对比
├── sensitivity_threshold_price.csv # 突破幅度阈值敏感性
├── sensitivity_threshold_convergence.csv # 收敛度阈值敏感性
├── sensitivity_threshold_volume.csv # 成交量阈值敏感性
├── sensitivity_weight_price.csv # 突破幅度权重敏感性
└── sensitivity_analysis_report.md # 敏感性分析报告
```
## 快速开始
### 1. 标准化原始数据
```python
from scoring import normalize_all
import pandas as pd
# 加载原始数据
df = pd.read_csv('outputs/converging_triangles/all_results.csv')
df = df[df['is_valid'] == True]
# 标准化
df_norm = normalize_all(df)
# 现在df_norm包含
# - 原始字段price_score_up, convergence_score, ...
# - 标准化字段price_score_up_norm, convergence_score_norm, ...
```
### 2. 使用预设配置筛选信号
```python
from scoring import CONFIG_EQUAL, CONFIG_AGGRESSIVE, filter_signals
# 等权模式
signals_equal = filter_signals(df_norm, CONFIG_EQUAL, return_strength=True)
print(f"等权模式: {len(signals_equal)} 个信号")
# 激进模式重视突破35% + 成交量25%
signals_aggr = filter_signals(df_norm, CONFIG_AGGRESSIVE, return_strength=True)
print(f"激进模式: {len(signals_aggr)} 个信号")
# 查看Top 10
top10 = signals_aggr.nlargest(10, 'strength')
```
### 3. 自定义配置
```python
from scoring import StrengthConfig, filter_signals
# 创建自定义配置
my_config = StrengthConfig(
name="我的配置",
w_price=0.40, # 突破权重40%
w_volume=0.30, # 成交量权重30%
w_convergence=0.15,
w_geometry=0.05,
w_activity=0.05,
w_tilt=0.05,
threshold_price=0.65, # 突破阈值
threshold_volume=0.70, # 成交量阈值(>0.5才启用)
direction='up', # 只看向上突破
)
# 筛选
signals = filter_signals(df_norm, my_config, return_strength=True)
```
### 4. 获取Top N信号
```python
from scoring import filter_top_n, CONFIG_EQUAL
# 获取强度分Top 50的信号
top50 = filter_top_n(df_norm, CONFIG_EQUAL, n=50)
# Top 50包含strength列已按强度降序排列
```
## 标准化方法详解
### 1. 零膨胀分布标准化 (normalize_zero_inflated)
**适用于**price_score_up, price_score_down, volume_score
**策略**
- 零值(未发生) → 0.5(中性基准)
- 非零值(已发生) → [0.5, 1.0] 区间按排名映射
**原理**:保留"零vs非零"的质的差异,同时在非零内部保持量的差异。
### 2. 点质量分布标准化 (normalize_point_mass)
**适用于**tilt_score
**策略**
- 中心值0.5)附近 → 保持0.5
- 正偏离(>0.5 → 拉伸到 [0.5, 1.0]
- 负偏离(<0.5 拉伸到 [0.0, 0.5]
**原理**75%的值恰好=0.5对称三角形对这些保持不变剩余25%按偏离程度拉伸。
### 3. 标准分位数标准化 (normalize_standard)
**适用于**convergence_score, activity_score
**策略**直接转换为百分位排名 [0, 1]
**原理**分布相对正常直接排名即可
### 4. 低区分度标准化 (normalize_low_variance)
**适用于**geometry_score
**策略**
1. 对数变换扩大小值区间的区分度
2. 分位数标准化
**原理**值普遍极低中位数0.005log1p变换可拉开小值间的差距
## 预设配置
### CONFIG_EQUAL - 等权模式
```python
各维度权重: 1/6 (约16.7%)
阈值: price0.60, convergence0.50, volume0.50
适用: 探索性分析不确定哪个维度更重要时
```
### CONFIG_AGGRESSIVE - 激进模式
```python
权重: 突破35%, 成交量25%, 收敛15%, 其他5-10%
阈值: price0.55, volume0.60
适用: 趋势行情追求突破力度和放量确认
```
### CONFIG_CONSERVATIVE - 保守模式
```python
权重: 收敛度30%, 活跃度25%, 突破15%, 其他5-15%
阈值: price0.70, convergence0.65, activity0.50
适用: 震荡市重视形态质量和活跃度
```
### CONFIG_VOLUME_FOCUS - 放量模式
```python
权重: 成交量35%, 突破25%, 收敛15%, 其他5-10%
阈值: volume0.70, price0.60
适用: 捕获主力异动必须明显放量
```
## 敏感性分析
### 快速分析
```bash
python scripts/scoring/sensitivity.py
```
输出示例
```
threshold_price | 信号数 | 占比 | 平均强度
------------------------------------------------
0.50 | 2304 | 12.8% | 0.6292
0.60 | 308 | 1.7% | 0.6897
0.70 | 244 | 1.4% | 0.7033
0.80 | 180 | 1.0% | 0.7158
```
### 完整分析报告
```bash
python scripts/scoring/generate_sensitivity_report.py
```
生成
- sensitivity_threshold_price.csv及PNG图表
- sensitivity_threshold_convergence.csv
- sensitivity_threshold_volume.csv
- sensitivity_weight_price.csv
- sensitivity_analysis_report.md汇总报告
## 阈值设置建议
根据敏感性分析推荐
| 筛选强度 | threshold_price | 预期信号数 | 占比 |
|----------|-----------------|-----------|------|
| 宽松 | 0.50-0.55 | 2000-350 | 11-2% |
| 适中 | 0.60-0.65 | 300-280 | 1.7-1.5% |
| 严格 | 0.70-0.75 | 240-210 | 1.4-1.2% |
| 极严格 | 0.80+ | <180 | <1.0% |
**成交量阈值**
- 0.5不筛选成交量适合震荡市
- 0.60-0.70适度放量要求
- 0.75高放量要求可能过于严格
## 使用示例
查看 `scripts/example_scoring_usage.py`包含5个示例
1. 基础标准化
2. 使用预设配置筛选信号
3. 自定义配置
4. 获取Top N信号
5. 对比不同配置的结果
运行
```bash
python scripts/example_scoring_usage.py
```
## 验证标准化效果
```bash
python scripts/verify_normalization.py
```
输出
- 标准化前后统计对比表
- 7个维度的分布对比图
- 强度分对比图
- all_results_normalized.csv标准化后数据
## API参考
### 标准化模块 (normalizer.py)
```python
normalize_all(df: pd.DataFrame) -> pd.DataFrame
对all_results.csv中的7个得分字段进行分层标准化
calculate_strength_equal_weight(df_normalized, direction='up') -> pd.Series
计算等权强度分
```
### 配置模块 (config.py)
```python
class StrengthConfig:
# 创建配置对象
config = StrengthConfig(w_price=0.4, threshold_price=0.65, ...)
# 验证配置
config.validate()
# 打印摘要
print(config.summary())
calculate_strength(df_normalized, config) -> pd.Series
根据配置计算综合强度分
filter_signals(df_normalized, config, return_strength=False) -> pd.DataFrame
根据配置筛选信号
filter_top_n(df_normalized, config, n=100) -> pd.DataFrame
筛选强度分Top N的信号
```
### 敏感性分析 (sensitivity.py)
```python
analyze_threshold_sensitivity(df, config, param_name, param_range) -> pd.DataFrame
分析阈值参数的敏感性
analyze_weight_sensitivity(df, config, weight_name, weight_range) -> pd.DataFrame
分析权重参数的敏感性
generate_full_sensitivity_report(df, config, output_dir)
生成完整的敏感性分析报告
```
## 后续优化方向
1. **动态权重**根据市场环境自动调整权重牛市 vs 震荡市
2. **多因子融合**结合其他技术指标RSIMACD等
3. **回测验证**基于历史数据回测各配置的收益表现
4. **实时监控**实时计算强度分并推送高分信号
5. **可视化界面**交互式调整参数并实时预览结果
## 注意事项
1. **阈值 > 0.5 才启用筛选**volume_score_norm, geometry_score_norm 的阈值 0.5 表示不筛选
2. **权重和必须为1**自定义配置时确保所有权重之和=1.0
3. **标准化后的值域**所有*_norm字段的范围都是[0, 1]
4. **原始字段保留**标准化不修改原始字段新增*_norm后缀字段
## 问题反馈
如有问题请查看
1. `outputs/converging_triangles/sensitivity_analysis_report.md`
2. `outputs/converging_triangles/normalization_comparison.png`
3. 运行 `python scripts/example_scoring_usage.py` 查看示例
---
**版本**: 1.0
**更新日期**: 2026-01-29
**作者**: AI Assistant