4.9 KiB
4.9 KiB
未来数据使用问题修复说明
问题背景
在原始的买卖点计算系统中,存在使用未来数据的问题,这会导致:
- 回测结果偏乐观:历史分析看起来比实际情况更好
- 实盘交易失效:实际交易中无法获得未来信息
- 策略不可实施:违反了时间序列分析的基本原则
发现的问题
1. 分型强度评分中的未来数据
位置:core/trading_signal.py - _calculate_fractal_strength_score
原始问题代码:
# 使用了当前分型之后的2个分型进行比较
for i in range(max(0, index-2), min(len(all_fractals), index+3)): # ❌ index+3
if i != index and all_fractals[i].fractal_type == fractal.fractal_type:
nearby_fractals.append(all_fractals[i])
修复后代码:
# 只使用过去的分型进行比较
for i in range(max(0, index-5), index): # ✅ 只看过去5个分型
if i < len(all_fractals) and all_fractals[i].fractal_type == fractal.fractal_type:
past_fractals.append(all_fractals[i])
2. 分型位置评分中的未来数据
位置:core/trading_signal.py - _calculate_fractal_position_score
原始问题代码:
# 使用了分型时间点之后的10个K线
start_idx = max(0, fractal_index - 10)
end_idx = min(len(processed_klines), fractal_index + 10) # ❌ +10个未来K线
修复后代码:
# 只使用过去的数据
start_idx = max(0, fractal_index - 20) # 只看过去20个K线
end_idx = fractal_index + 1 # ✅ 包含当前K线,但不包含未来K线
3. 分型基础检测的固有特性
位置:core/fractal.py - 分型检测算法
固有问题:
# 分型定义就需要左右确认
for i in range(1, strength + 1):
if self.data.iloc[idx + i]['high'] >= center_high: # 需要未来K线确认
right_valid = False
break
说明:这是缠论分型的固有特性,无法避免,但我们增加了确认机制。
解决方案
1. 修正评分算法
- 分型强度比较:只使用历史分型数据
- 位置评分:只基于过去的价格数据
- 相对强度:避免使用未来分型进行比较
2. 增加确认机制
新增方法:
def update_fractal_confirmation(self, current_idx: int):
"""更新分型确认状态"""
for fractal in self.all_fractals:
if not fractal.confirmed:
required_confirmation = fractal.strength
time_passed = current_idx - fractal.index
if time_passed >= required_confirmation:
fractal.confirmed = True
def detect_real_time_fractals(self, current_idx: int, lookback_periods: int = 50):
"""实时分型检测(避免使用未来数据)"""
# 只检测到当前位置之前的分型
# 且已经经过足够确认期的分型
3. 实时交易适配
确认延迟:
- 强度为1的分型:需要1个周期确认
- 强度为2的分型:需要2个周期确认
- 以此类推...
信号生成时机:
- 历史分析:可以看到所有分型(用于分析和学习)
- 实时交易:只能使用已确认的分型(确保策略可实施)
修复效果
1. 时间序列正确性
- ✅ 所有计算只使用当前时间点之前的数据
- ✅ 评分算法基于历史信息
- ✅ 确认机制确保信号可靠性
2. 实盘交易可行性
- ✅ 信号产生有合理延迟
- ✅ 避免了"神奇"的前瞻性
- ✅ 更加贴近真实交易环境
3. 回测准确性
- ✅ 回测结果更加保守和真实
- ✅ 消除了未来数据偏差
- ✅ 提高了策略评估的可信度
使用建议
历史分析模式
# 用于学习和研究
analyzer = ChanAnalyzer(df)
result = analyzer.run_full_analysis() # 包含所有分型
实时交易模式
# 用于实盘交易
current_idx = len(df) - 1
confirmed_fractals = fractal_detector.get_confirmed_fractals(current_idx)
real_time_signals = trading_signal.detect_real_time_signals(confirmed_fractals)
参数调整建议
不同交易风格的设置:
- 日内短线:基础强度1-2,确认周期短
- 中线波段:基础强度2-3,平衡确认和敏感性
- 长线趋势:基础强度3-5,重视确认可靠性
注意事项
- 信号延迟:修复后的系统会有合理的信号延迟,这是正确的
- 确认机制:在实盘交易中必须等待分型确认
- 参数调整:可能需要重新优化策略参数
- 回测重运行:建议使用修复后的系统重新进行历史回测
总结
这次修复消除了系统中的"未来数据泄露"问题,使得:
- 买卖点计算更加严格和可靠
- 回测结果更加真实
- 实盘交易策略更具可操作性
- 符合量化交易的最佳实践
虽然可能会降低一些历史回测的表现,但这是为了获得更可靠和可实施的交易策略所必须的改进。