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

861 lines
24 KiB
Markdown
Raw Permalink 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个收敛三角形样本的分布分析结果
**视角**: 量化研究 + 基金经理实战
---
## 一、当前系统问题诊断
### 1.1 分布分析揭示的核心问题
基于18,004个样本的统计分析发现以下关键问题
| 维度 | 均值 | 中位数 | 超额峰度 | 核心问题 |
|-----|------|--------|---------|---------|
| 突破幅度分(up) | 0.056 | **0.000** | 13.38 | ❌ 中位数=050%数据无信息量 |
| 突破幅度分(down) | 0.019 | **0.000** | 45.72 | ❌ 更极端的零膨胀 |
| 成交量分 | 0.151 | **0.000** | 2.77 | ❌ 中位数=0区分度极低 |
| 形态规则度 | 0.052 | 0.005 | 4.56 | ⚠️ 普遍极低,区分度差 |
| 倾斜度分 | 0.497 | **0.500** | 46.33 | ⚠️ 75%数据=0.5,无区分度 |
| 收敛度分 | 0.798 | 0.803 | -1.05 | ✅ 相对稳定 |
| 价格活跃度 | 0.069 | 0.071 | -0.25 | ✅ 近正态,最稳定 |
### 1.2 问题本质:**维度间不可比性**
**当前等权相加会产生什么后果?**
假设等权(各16.67%)后的计算:
```
强度分 = 1/6 × (0.00 + 0.80 + 0.00 + 0.05 + 0.07 + 0.50)
= 1/6 × 1.42
= 0.237
其中:
突破幅度分(up) = 0.00 (中位数情况)
收敛度分 = 0.80 (中位数情况)
成交量分 = 0.00 (中位数情况)
形态规则度 = 0.05 (中位数情况)
价格活跃度 = 0.07 (中位数情况)
倾斜度分 = 0.50 (中位数情况)
```
**问题**:收敛度分和倾斜度分"吃掉"了大部分强度分,即使没有任何突破!
### 1.3 问题根源
1. **零膨胀分布 (Zero-Inflated)**:突破幅度分、成交量分的中位数=0
2. **点质量分布 (Point Mass)**倾斜度分75%恰好=0.5
3. **尺度不一致**:各维度的有效取值范围差异巨大
4. **语义不同步**:未突破时,突破幅度分=0是合理的但收敛度分=0.8也是合理的
---
## 二、SOTA方法论调研
### 2.1 多因子量化领域的标准化方法
#### (1) 截面分位数标准化 (Cross-Sectional Quantile Normalization)
**原理**: 将每个因子在截面上(同一时点的所有股票)转换为分位数排名
```python
def quantile_normalize(scores):
"""将原始分数转换为百分位排名"""
ranks = scores.rank(pct=True) # 百分位排名 [0, 1]
return ranks
```
**优点**:
- ✅ 消除尺度差异
- ✅ 消除偏度和厚尾的影响
- ✅ 各因子变为均匀分布,可直接等权相加
**缺点**:
- ❌ 丢失绝对信息强突破10%和1%可能排名相同)
- ❌ 对零膨胀分布效果差50%的0会被平分排名
#### (2) 截面Z-Score标准化
**原理**: 减去截面均值,除以截面标准差
```python
def zscore_normalize(scores):
"""截面Z-Score标准化"""
return (scores - scores.mean()) / scores.std()
```
**优点**:
- ✅ 保留相对强度信息
- ✅ 简单直观
**缺点**:
- ❌ 对非正态分布效果差
- ❌ 对极端值敏感
- ❌ 零膨胀分布会导致大量负值
#### (3) Power Sorting (2023年新方法)
**原理**: 利用因子-收益关系的非线性特征,通过幂变换捕获不对称性
```python
def power_transform(scores, power=2):
"""非线性幂变换,捕获尾部效应"""
return np.sign(scores) * np.abs(scores) ** power
```
**优点**:
- ✅ 专门处理厚尾分布
- ✅ 保留极端值信息
- ✅ 在多因子策略中表现优于传统方法
**参考**: Hübner et al. (2023) "Power Sorting", SSRN 4552208
#### (4) 自适应分组标准化 (Class-Specific Normalization)
**原理**: 根据数据特性选择不同的标准化策略
```python
def adaptive_normalize(scores, data_type):
if data_type == 'zero_inflated':
# 零膨胀: 对非零部分单独标准化
non_zero = scores[scores > 0]
return conditional_rank(scores, non_zero)
elif data_type == 'point_mass':
# 点质量: 转换为离散分类
return categorize(scores)
else:
# 正常: 标准分位数
return quantile_normalize(scores)
```
### 2.2 控制论视角PID自适应权重
**参考**: Mehra & Patel (2011) "PID Control for Portfolio Optimization"
将强度分系统视为**反馈控制系统**:
```
目标: 最大化风险调整收益
输入: 6个维度的原始得分
控制器: 自适应权重调整
输出: 综合强度分
反馈: 实际交易结果
```
**PID权重调整公式**:
```python
def pid_weight_update(w, error, error_integral, error_derivative):
"""
w: 当前权重
error: 当前收益偏差
error_integral: 累积偏差
error_derivative: 偏差变化率
"""
Kp, Ki, Kd = 0.1, 0.01, 0.05 # 需要调优
w_new = w + Kp * error + Ki * error_integral + Kd * error_derivative
return normalize(w_new) # 确保权重和为1
```
**优点**:
- ✅ 自动适应市场变化
- ✅ 基于实际反馈优化
- ✅ 可解释性强
**缺点**:
- ❌ 需要足够的历史交易数据
- ❌ 参数调优复杂
### 2.3 机器学习视角:端到端优化
**参考**: Chen et al. (2025) "ML Enhanced Multi-Factor Quantitative Trading", arXiv 2507.07107
将"因子得分 → 组合权重 → 交易决策"作为**端到端优化**问题:
```python
class FactorScoreOptimizer(nn.Module):
def __init__(self, n_factors=6):
self.factor_transform = nn.Sequential(
nn.Linear(n_factors, 32),
nn.ReLU(),
nn.Linear(32, n_factors),
nn.Sigmoid() # 输出[0,1]
)
self.weight_layer = nn.Linear(n_factors, n_factors)
self.softmax = nn.Softmax(dim=-1)
def forward(self, raw_scores):
transformed = self.factor_transform(raw_scores)
weights = self.softmax(self.weight_layer(transformed))
return (transformed * weights).sum(dim=-1)
```
**优点**:
- ✅ 自动学习最优变换和权重
- ✅ 可处理复杂非线性关系
**缺点**:
- ❌ 黑箱,可解释性差
- ❌ 需要大量标注数据
- ❌ 容易过拟合
---
## 三、平滑性优化方案
### 3.1 推荐方案:分层标准化
针对不同类型的分布,采用不同的标准化策略:
#### 第一层:零膨胀分布处理
**适用维度**: 突破幅度分、成交量分
```python
def normalize_zero_inflated(scores, name):
"""
零膨胀分布标准化:
1. 分离零值和非零值
2. 非零值进行分位数标准化
3. 零值赋予基准分0.5(中性)
"""
is_zero = scores == 0
is_nonzero = scores > 0
result = pd.Series(index=scores.index, dtype=float)
# 零值 -> 0.5 (中性基准)
result[is_zero] = 0.5
# 非零值 -> 在0.5~1.0之间排名
if is_nonzero.sum() > 0:
nonzero_rank = scores[is_nonzero].rank(pct=True) # [0, 1]
result[is_nonzero] = 0.5 + 0.5 * nonzero_rank # [0.5, 1.0]
return result
```
**效果**:
- 未突破(score=0) → 标准化后=0.5 (中性)
- 弱突破(score=0.05) → 标准化后≈0.6
- 强突破(score=0.30) → 标准化后≈0.95
#### 第二层:点质量分布处理
**适用维度**: 倾斜度分
```python
def normalize_point_mass(scores, center=0.5):
"""
点质量分布标准化:
1. 中心值(0.5)保持不变
2. 偏离中心的值进行拉伸
"""
deviation = scores - center
# 正偏离和负偏离分别处理
pos_dev = deviation[deviation > 0]
neg_dev = deviation[deviation < 0]
result = pd.Series(center, index=scores.index)
if len(pos_dev) > 0:
# 正偏离 -> 在0.5~1.0之间排名
result[deviation > 0] = center + 0.5 * pos_dev.rank(pct=True)
if len(neg_dev) > 0:
# 负偏离 -> 在0.0~0.5之间排名
result[deviation < 0] = center * neg_dev.rank(pct=True, ascending=False)
return result
```
#### 第三层:正常分布处理
**适用维度**: 收敛度分、价格活跃度
```python
def normalize_standard(scores):
"""
标准分位数标准化:
直接转换为百分位排名
"""
return scores.rank(pct=True)
```
#### 第四层:低区分度分布处理
**适用维度**: 形态规则度
```python
def normalize_low_variance(scores, expansion_factor=3):
"""
低区分度分布处理:
1. 对数变换扩大区分度
2. 分位数标准化
"""
# 对数变换扩大小值区间的区分度
log_scores = np.log1p(scores * expansion_factor)
return log_scores.rank(pct=True)
```
### 3.2 综合标准化流程
```python
def normalize_all_dimensions(df):
"""
综合标准化流程
"""
normalized = pd.DataFrame(index=df.index)
# 突破幅度分 - 零膨胀处理
normalized['price_score_up'] = normalize_zero_inflated(
df['price_score_up'], 'price_up'
)
normalized['price_score_down'] = normalize_zero_inflated(
df['price_score_down'], 'price_down'
)
# 成交量分 - 零膨胀处理
normalized['volume_score'] = normalize_zero_inflated(
df['volume_score'], 'volume'
)
# 倾斜度分 - 点质量处理
normalized['tilt_score'] = normalize_point_mass(
df['tilt_score'], center=0.5
)
# 收敛度分 - 标准处理
normalized['convergence_score'] = normalize_standard(
df['convergence_score']
)
# 价格活跃度 - 标准处理
normalized['activity_score'] = normalize_standard(
df['activity_score']
)
# 形态规则度 - 低区分度处理
normalized['geometry_score'] = normalize_low_variance(
df['geometry_score']
)
return normalized
```
### 3.3 标准化后的等权计算
```python
def calculate_strength_equal_weight(normalized_df, direction='up'):
"""
等权强度分计算 (标准化后)
参数:
direction: 'up' 或 'down',决定使用哪个突破幅度分
"""
if direction == 'up':
price_score = normalized_df['price_score_up']
else:
price_score = normalized_df['price_score_down']
# 等权: 各1/6
strength = (
price_score / 6 +
normalized_df['convergence_score'] / 6 +
normalized_df['volume_score'] / 6 +
normalized_df['geometry_score'] / 6 +
normalized_df['activity_score'] / 6 +
normalized_df['tilt_score'] / 6
)
return strength
```
---
## 四、参数可调性设计
### 4.1 应用层接口设计
为基金经理提供**可解释、可调节**的参数接口:
```python
class StrengthScoreConfig:
"""强度分配置 - 应用层接口"""
def __init__(self):
# 权重参数 (默认等权)
self.weight_price = 1/6
self.weight_convergence = 1/6
self.weight_volume = 1/6
self.weight_geometry = 1/6
self.weight_activity = 1/6
self.weight_tilt = 1/6
# 阈值参数
self.price_threshold = 0.6 # 突破幅度分阈值(标准化后)
self.convergence_threshold = 0.7 # 收敛度分阈值
self.volume_threshold = 0.5 # 成交量分阈值(设为中性)
# 筛选模式
self.filter_mode = 'and' # 'and' 或 'or'
# 方向偏好
self.direction_preference = 'both' # 'up', 'down', 'both'
def set_aggressive(self):
"""激进模式: 重视突破"""
self.weight_price = 0.35
self.weight_volume = 0.25
self.weight_convergence = 0.15
self.weight_geometry = 0.10
self.weight_activity = 0.10
self.weight_tilt = 0.05
def set_conservative(self):
"""保守模式: 重视形态质量"""
self.weight_price = 0.15
self.weight_convergence = 0.30
self.weight_volume = 0.10
self.weight_geometry = 0.20
self.weight_activity = 0.20
self.weight_tilt = 0.05
def set_volume_focus(self):
"""放量模式: 重视成交量确认"""
self.weight_price = 0.25
self.weight_volume = 0.35
self.weight_convergence = 0.15
self.weight_geometry = 0.10
self.weight_activity = 0.10
self.weight_tilt = 0.05
```
### 4.2 多维度筛选器
```python
class MultiDimensionFilter:
"""多维度筛选器"""
def __init__(self, config: StrengthScoreConfig):
self.config = config
def filter(self, df):
"""
根据配置筛选信号
返回:
满足条件的行索引
"""
conditions = []
# 突破幅度条件
if self.config.direction_preference in ['up', 'both']:
conditions.append(
df['price_score_up_normalized'] >= self.config.price_threshold
)
if self.config.direction_preference in ['down', 'both']:
conditions.append(
df['price_score_down_normalized'] >= self.config.price_threshold
)
# 收敛度条件
conditions.append(
df['convergence_score_normalized'] >= self.config.convergence_threshold
)
# 成交量条件 (可选)
if self.config.volume_threshold > 0.5: # 只有设置高于中性时才过滤
conditions.append(
df['volume_score_normalized'] >= self.config.volume_threshold
)
# 组合条件
if self.config.filter_mode == 'and':
final_condition = conditions[0]
for cond in conditions[1:]:
final_condition = final_condition & cond
else: # 'or'
final_condition = conditions[0]
for cond in conditions[1:]:
final_condition = final_condition | cond
return df[final_condition].index
```
### 4.3 敏感性分析工具
```python
def sensitivity_analysis(df, config, param_name, param_range):
"""
参数敏感性分析
示例: 分析 price_threshold 从 0.5 到 0.9 的影响
"""
results = []
for value in param_range:
# 设置参数
setattr(config, param_name, value)
# 筛选
filter = MultiDimensionFilter(config)
selected = filter.filter(df)
# 统计
results.append({
'param_value': value,
'n_signals': len(selected),
'pct_selected': len(selected) / len(df) * 100,
# 可添加更多指标: 平均收益、胜率等
})
return pd.DataFrame(results)
```
---
## 五、基金经理视角:各维度量化意义
### 5.1 突破幅度分 - 信号强度
**量化意义**:
- 衡量**价格动能**的核心指标
- 反映市场对突破的认可程度
- 是最直接的交易信号
**实战应用**:
- **>P90**: 强信号,可考虑立即入场
- **P75-P90**: 中等信号,需配合其他确认
- **<P75**: 弱信号观望为主
**当前问题**:
- 中位数=0导致大量信号被"埋没"
- 建议标准化后使用而非原始值
**基金经理关注点**:
> "突破幅度多大才值得交易?我需要一个可量化的入场标准。"
**建议阈值**:
- 激进策略: 标准化后 > 0.60
- 稳健策略: 标准化后 > 0.75
- 保守策略: 标准化后 > 0.85
### 5.2 收敛度分 - 蓄势程度
**量化意义**:
- 衡量**多空博弈**的激烈程度
- 收敛越紧,突破后动能越大
- 反映市场分歧逐渐收窄的过程
**实战应用**:
- **高收敛(>0.85)**: 能量积蓄充分,突破概率高
- **中收敛(0.70-0.85)**: 标准形态
- **低收敛(<0.70)**: 形态不成熟信号可靠性低
**当前评价**:
- 分布稳定是最可靠的维度
- 区分度好有实际筛选价值
- 建议可适当提高权重
**基金经理关注点**:
> "收敛程度是否与后续涨幅相关?越收敛越好吗?"
**实证建议**: 收敛度与突破成功率正相关但与突破幅度的关系需进一步回测验证
### 5.3 成交量分 - 资金确认
**量化意义**:
- 衡量**资金介入**的强度
- 放量突破更具可持续性
- 是区分真突破和假突破的关键
**实战应用**:
- **高放量(>P80)**: 资金确认,信号可信度高
- **中等放量(P50-P80)**: 一般确认
- **无放量(<P50)**: 存疑可能是假突破
**当前问题**:
- 中位数=050%三角形无放量信息
- 作为必要条件会过滤太多信号
- 建议降权或作为"加分项"而非"扣分项"
**基金经理关注点**:
> "没有放量的突破能信吗?放量标准应该是多少倍?"
**建议策略**:
- 不作为必要条件会丢失50%潜在机会
- 作为信号评级的加分项
- 放量突破 加仓或延长持有期
### 5.4 形态规则度 - 形态质量
**量化意义**:
- 衡量形态的**几何标准性**
- 高规则度意味着市场对关键价位有共识
- 反映形态是否"教科书级别"
**实战应用**:
- **高规则度(>P80)**: 教科书形态,交易员容易识别
- **中规则度(P50-P80)**: 标准形态
- **低规则度(<P50)**: 非典型不易被市场认可
**当前问题**:
- 普遍极低中位数0.005区分度差
- 可能是算法对"规则度"的定义过于严格
- 建议对数变换扩大区分度或重新定义计算方式
**基金经理关注点**:
> "形态越标准越好吗?非标准形态是否也有交易价值?"
**思考**: 过于"完美"的形态可能是市场共识过高反而需要警惕建议
- 规则度作为辅助参考权重不宜过高
- 非标准形态不应直接排除
### 5.5 价格活跃度 - 真实博弈
**量化意义**:
- 衡量价格**振荡充分性**
- 区分真实博弈 vs 僵尸形态
- 反映市场参与度
**实战应用**:
- **高活跃度(>P75)**: 市场参与充分,形态有效
- **中活跃度(P25-P75)**: 正常情况
- **低活跃度(<P25)**: 僵尸形态可能是流动性问题
**当前评价**:
- 近正态分布最稳定的维度
- 有实际区分价值
- 建议可适当提高权重
**基金经理关注点**:
> "如何区分'健康的收敛'和'无人问津的死股'"
**价格活跃度正是解决这个问题的关键指标**
### 5.6 倾斜度分 - 趋势一致性
**量化意义**:
- 衡量突破方向与形态趋势的**一致性**
- 顺势突破更可靠逆势突破需谨慎
- 区分上升/下降/对称三角形
**实战应用**:
- **高倾斜度(>0.6)**: 强趋势一致,高置信度
- **中性(≈0.5)**: 对称三角形,方向不明确
- **低倾斜度(<0.4)**: 逆势突破需额外确认
**当前问题**:
- 75%的值=0.5,几乎无区分度
- 算法强烈偏好对称三角形
- 建议重新标准化或调整算法参数
**基金经理关注点**:
> "上升三角形向上突破 vs 下降三角形向上突破,胜率有差异吗?"
**实证建议**: 需要回测验证但直觉上顺势突破应该更可靠
---
## 六、整体刻画准确性评估
### 6.1 当前系统的优点
1. **覆盖维度全面**:
- 价格维度: 突破幅度收敛度
- 量能维度: 成交量
- 形态维度: 几何规则度倾斜度
- 行为维度: 价格活跃度
2. **归一化方式合理**:
- 所有维度输出在[0, 1]区间
- 使用tanhexp等非线性变换
3. **权重可配置**:
- 代码支持权重参数调整
- 突破幅度作为主要权重是合理的
### 6.2 当前系统的不足
1. **维度间不可比**:
- 原始得分直接加权未考虑分布差异
- 中位数差异巨大(0 vs 0.8)
2. **零膨胀问题未处理**:
- 突破幅度分成交量分50%为0
- 这些0值参与加权计算会稀释信号
3. **点质量问题未处理**:
- 倾斜度分75%为0.5
- 无法区分真正的对称三角形和算法偏好
4. **缺乏截面标准化**:
- 未考虑同一时点不同股票的相对排名
- 强度分的绝对值缺乏参照系
### 6.3 刻画准确性评分
| 评估维度 | 当前评分 | 优化后预期 |
|---------|---------|----------|
| 维度完整性 | ⭐⭐⭐⭐⭐ (5/5) | 5/5 |
| 归一化合理性 | ⭐⭐⭐☆☆ (3/5) | 4/5 |
| 维度可比性 | ⭐⭐☆☆☆ (2/5) | 4/5 |
| 分布平滑性 | ⭐⭐☆☆☆ (2/5) | 4/5 |
| 参数可调性 | ⭐⭐⭐☆☆ (3/5) | 5/5 |
| 实战可用性 | ⭐⭐⭐☆☆ (3/5) | 4/5 |
| **综合评分** | **2.8/5** | **4.3/5** |
---
## 七、优化建议总结
### 7.1 短期优化(立即可做)
1. **实施分层标准化**
- 对突破幅度分成交量分使用零膨胀处理
- 对倾斜度分使用点质量处理
- 对其他维度使用分位数标准化
2. **调整权重分配**
```
当前 → 建议(等权基础):
突破幅度分: 45% → 16.67% (标准化后等权)
收敛度分: 15% → 16.67%
成交量分: 10% → 16.67%
形态规则度: 10% → 16.67%
价格活跃度: 15% → 16.67%
倾斜度分: 5% → 16.67%
```
3. **提供预设配置**
- 激进模式、保守模式、放量模式等
- 让用户可以快速切换
### 7.2 中期优化(需要开发)
1. **截面标准化**
- 在每个时间点对所有股票排名
- 提供"相对强度"而非"绝对强度"
2. **敏感性分析工具**
- 参数变化对信号数量的影响
- 参数变化对回测收益的影响
3. **动态权重调整**
- 基于市场状态自动调整权重
- 牛市/熊市/震荡市不同配置
### 7.3 长期优化(研究方向)
1. **机器学习优化**
- 端到端学习最优变换和权重
- 需要构建完整的回测框架
2. **控制论框架**
- PID自适应权重调整
- 基于实际交易反馈优化
3. **因子有效性验证**
- 各维度与未来收益的IC分析
- 剔除无效因子,保留有效因子
---
## 八、代码实现建议
### 8.1 目录结构
```
technical-patterns-lab/
├── src/
│ ├── scoring/
│ │ ├── normalizer.py # 标准化模块
│ │ ├── strength_score.py # 强度分计算
│ │ ├── config.py # 配置管理
│ │ └── filter.py # 多维度筛选
│ └── analysis/
│ ├── sensitivity.py # 敏感性分析
│ └── backtest.py # 回测框架
└── configs/
├── aggressive.yaml # 激进配置
├── conservative.yaml # 保守配置
└── volume_focus.yaml # 放量配置
```
### 8.2 核心类设计
```python
# scoring/normalizer.py
class FactorNormalizer:
"""因子标准化器"""
def normalize_zero_inflated(self, series): ...
def normalize_point_mass(self, series): ...
def normalize_standard(self, series): ...
def normalize_low_variance(self, series): ...
def normalize_all(self, df) -> pd.DataFrame: ...
# scoring/strength_score.py
class StrengthScoreCalculator:
"""强度分计算器"""
def __init__(self, config: Config):
self.config = config
self.normalizer = FactorNormalizer()
def calculate(self, raw_df) -> pd.Series: ...
def calculate_with_details(self, raw_df) -> pd.DataFrame: ...
# scoring/filter.py
class MultiDimensionFilter:
"""多维度筛选器"""
def filter(self, df, config) -> pd.Index: ...
def filter_top_n(self, df, n, config) -> pd.Index: ...
```
---
## 九、下一步行动计划
### 立即行动
1. 实现分层标准化函数
2. 创建等权强度分计算
3. 提供3种预设配置
### 短期计划
4. 📝 实现敏感性分析工具
5. 📝 对标准化后的数据重新进行分布分析
6. 📝 验证标准化效果
### 中期计划
7. 🔬 实现截面标准化
8. 🔬 构建简单回测框架
9. 🔬 验证各维度的预测能力
### 长期研究
10. 🔮 探索机器学习优化
11. 🔮 探索控制论框架
12. 🔮 发表研究报告
---
## 参考文献
1. Hübner et al. (2023). "Power Sorting". SSRN 4552208.
2. Chen et al. (2025). "Machine Learning Enhanced Multi-Factor Quantitative Trading". arXiv 2507.07107.
3. Mehra & Patel (2011). "PID Control for Portfolio Optimization". InTech.
4. Lo et al. (2000). "Foundations of Technical Analysis". SSRN 228099.
---
**报告创建时间**: 2026-01-29
**作者**: AI量化研究助手
**版本**: v1.0