DEV Community

Henry Lin
Henry Lin

Posted on

第 9 课:Freqtrade时间范围测试

第 9 课:Freqtrade时间范围测试

⏱ 课时:1.5 小时
🎯 学习目标:验证策略在不同市场环境的表现
📚 难度:⭐⭐ 回测实战


📖 课程概览

一个策略在某个时间段表现好,不代表它在其他时间段也能好。本课将教你如何通过时间范围测试验证策略的稳定性和适应性,避免过拟合陷阱。


9.1 为什么要测试不同时间段?

三大核心原因

1. 避免过拟合(Overfitting)

什么是过拟合?
策略过度拟合历史数据的特定特征,导致在新数据上表现不佳。

过拟合的表现

训练期(2025-01-01 ~ 2025-06-30):
  收益:+35%,胜率:92%,Sharpe:4.5 ✅

测试期(2025-07-01 ~ 2025-09-30):
  收益:-8%,胜率:45%,Sharpe:0.3 ❌

结论:严重过拟合!
Enter fullscreen mode Exit fullscreen mode

如何识别过拟合

  • ✅ 训练期表现优秀,测试期表现糟糕
  • ✅ 策略参数过于复杂(条件 > 10 个)
  • ✅ 策略只在特定时间段有效
  • ✅ 微调参数后效果大幅波动

2. 验证策略稳定性(Consistency)

稳定性的定义
策略在不同时间段都能保持相对一致的表现。

稳定性指标

Q1(1-3月):收益 +8%,回撤 -3%
Q2(4-6月):收益 +12%,回撤 -4%
Q3(7-9月):收益 +9%,回撤 -3.5%
Q4(10-12月):收益 +11%,回撤 -3.2%

结论:策略稳定,各季度表现一致 ✅
Enter fullscreen mode Exit fullscreen mode

vs

Q1:收益 +45%,回撤 -2%
Q2:收益 -15%,回撤 -18%
Q3:收益 +30%,回撤 -5%
Q4:收益 -20%,回撤 -22%

结论:策略不稳定,波动剧烈 ❌
Enter fullscreen mode Exit fullscreen mode

3. 识别适用市场(Market Adaptation)

不同策略适合不同市况:

趋势策略 vs 震荡策略

趋势策略(MovingAverageCross):
  牛市(2025-01~03):+35% ✅
  震荡(2025-04~06):-8% ❌
  熊市(2025-07~09):+28% ✅

均值回归策略(MeanReversion):
  牛市:+5% ⚠️
  震荡:+22% ✅
  熊市:+3% ⚠️
Enter fullscreen mode Exit fullscreen mode

结论

  • 趋势策略适合牛市和熊市(单边行情)
  • 均值回归策略适合震荡市(区间波动)

9.2 牛市 vs 熊市 vs 震荡市

市场类型特征

1. 牛市(Bull Market)

特征

  • 📈 持续上涨(涨幅 > 20%)
  • 🔺 回调幅度小(< 10%)
  • 📊 成交量放大
  • 💪 市场情绪乐观
  • ⏱ 持续时间:数周到数月

识别方法

# 简单判断:MA50 上涨且价格在 MA50 上方
price > MA50 and MA50 > MA50.shift(30)
Enter fullscreen mode Exit fullscreen mode

适合策略

  • ✅ 趋势跟踪(Trend Following)
  • ✅ 动量策略(Momentum)
  • ✅ 突破策略(Breakout)
  • ❌ 不适合:均值回归

回测要点

# 测试牛市行情(假设 2025-01~03 是牛市)
freqtrade backtesting \
  -c config.json \
  --strategy MomentumTrendStrategy \
  --timerange 20250101-20250331
Enter fullscreen mode Exit fullscreen mode

2. 熊市(Bear Market)

特征

  • 📉 持续下跌(跌幅 > 20%)
  • 🔻 反弹无力(< 10%)
  • 📊 成交量萎缩
  • 😰 市场情绪悲观
  • ⏱ 持续时间:数周到数月

识别方法

# 简单判断:MA50 下跌且价格在 MA50 下方
price < MA50 and MA50 < MA50.shift(30)
Enter fullscreen mode Exit fullscreen mode

应对策略

  • ⚠️ 降低仓位(50% 或更低)
  • ⚠️ 提高止损标准
  • ⚠️ 减少交易频率
  • 🛑 考虑暂停交易

适合策略

  • ✅ 保守型策略
  • ✅ 做空策略(如果支持)
  • ❌ 不适合:激进追涨策略

回测要点

# 测试熊市行情(假设 2025-07~09 是熊市)
freqtrade backtesting \
  -c config.json \
  --strategy Strategy001 \
  --timerange 20250701-20250930

# 关注回撤和止损表现
Enter fullscreen mode Exit fullscreen mode

3. 震荡市(Range-Bound Market)

特征

  • ↔️ 横盘整理(波动 < 10%)
  • 🔄 区间往复
  • 📊 成交量适中
  • 😐 市场情绪中性
  • ⏱ 持续时间:数天到数周

识别方法

# 简单判断:价格在区间内震荡
price_range = (high_30d - low_30d) / low_30d
if price_range < 0.15:  # 波动 < 15%
    print("震荡市")
Enter fullscreen mode Exit fullscreen mode

适合策略

  • ✅ 均值回归(Mean Reversion)
  • ✅ 网格交易(Grid Trading)
  • ✅ RSI 超买超卖策略
  • ❌ 不适合:趋势跟踪

回测要点

# 测试震荡行情
freqtrade backtesting \
  -c config.json \
  --strategy MeanReversionStrategy \
  --timerange 20250401-20250630
Enter fullscreen mode Exit fullscreen mode

市况识别实战

使用 TradingView 识别

  1. 打开 TradingView
  2. 查看 BTC/USDT 日线图
  3. 添加 MA50 和 MA200 指标
  4. 观察最近 6-12 个月的走势

判断标准

价格 > MA50 > MA200,且 MA50 上涨 → 牛市
价格 < MA50 < MA200,且 MA50 下跌 → 熊市
价格在 MA50 上下波动,MA50 平坦 → 震荡市
Enter fullscreen mode Exit fullscreen mode

9.3 样本外测试(Out-of-Sample Testing)

什么是样本外测试?

定义
将数据分为两部分:

  • 训练集(In-Sample):用于开发和优化策略
  • 测试集(Out-of-Sample):用于验证策略有效性

重要性

  • ✅ 验证策略泛化能力
  • ✅ 避免过拟合
  • ✅ 模拟真实交易场景

时间切分方法

方法 1:70/30 切分

标准划分

总数据:2024-07-01 ~ 2025-09-30(15 个月)

训练集:2024-07-01 ~ 2025-03-31(9 个月,60%)
测试集:2025-04-01 ~ 2025-09-30(6 个月,40%)
Enter fullscreen mode Exit fullscreen mode

回测命令

# 训练期回测
freqtrade backtesting \
  -c config.json \
  --strategy Strategy001 \
  --timerange 20240701-20250331

# 测试期回测
freqtrade backtesting \
  -c config.json \
  --strategy Strategy001 \
  --timerange 20250401-20250930
Enter fullscreen mode Exit fullscreen mode

方法 2:多周期滚动测试(Walk-Forward)

原理

数据:12 个月

周期1: 训练(1-6月) → 测试(7-8月)
周期2: 训练(3-8月) → 测试(9-10月)
周期3: 训练(5-10月) → 测试(11-12月)
Enter fullscreen mode Exit fullscreen mode

优点

  • 更全面的验证
  • 更接近实盘场景
  • 减少单一时间段偏差

实施脚本

#!/bin/bash

STRATEGY="Strategy001"
CONFIG="config.json"

echo "=== Walk-Forward 测试 ==="

# 周期1
echo "周期1: 训练 2024-07~12,测试 2025-01~02"
freqtrade backtesting -c $CONFIG --strategy $STRATEGY --timerange 20240701-20241231
freqtrade backtesting -c $CONFIG --strategy $STRATEGY --timerange 20250101-20250228

# 周期2
echo "周期2: 训练 2024-09~2025-02,测试 2025-03~04"
freqtrade backtesting -c $CONFIG --strategy $STRATEGY --timerange 20240901-20250228
freqtrade backtesting -c $CONFIG --strategy $STRATEGY --timerange 20250301-20250430

# 周期3
echo "周期3: 训练 2024-11~2025-04,测试 2025-05~06"
freqtrade backtesting -c $CONFIG --strategy $STRATEGY --timerange 20241101-20250430
freqtrade backtesting -c $CONFIG --strategy $STRATEGY --timerange 20250501-20250630
Enter fullscreen mode Exit fullscreen mode

方法 3:季度分割测试

原理

Q1(1-3月):测试
Q2(4-6月):测试
Q3(7-9月):测试
Q4(10-12月):测试

对比各季度表现的一致性
Enter fullscreen mode Exit fullscreen mode

回测命令

# Q1
freqtrade backtesting -c config.json --strategy Strategy001 --timerange 20250101-20250331

# Q2
freqtrade backtesting -c config.json --strategy Strategy001 --timerange 20250401-20250630

# Q3
freqtrade backtesting -c config.json --strategy Strategy001 --timerange 20250701-20250930

# Q4
freqtrade backtesting -c config.json --strategy Strategy001 --timerange 20251001-20251231
Enter fullscreen mode Exit fullscreen mode

样本外测试评估标准

合格标准

训练期收益:+20%
测试期收益:+15%(训练期的 75% 以上)

训练期回撤:-5%
测试期回撤:-7%(不超过训练期的 150%)

训练期 Sharpe:3.0
测试期 Sharpe:2.3(训练期的 75% 以上)

结论:✅ 策略稳定,可以使用
Enter fullscreen mode Exit fullscreen mode

警告信号

训练期收益:+30%
测试期收益:+2%(仅为训练期的 6.7%)❌

训练期回撤:-3%
测试期回撤:-15%(是训练期的 5 倍)❌

训练期 Sharpe:4.5
测试期 Sharpe:0.5(仅为训练期的 11%)❌

结论:❌ 严重过拟合,不能使用
Enter fullscreen mode Exit fullscreen mode

9.4 避免过拟合

过拟合的识别信号

信号 1:训练期完美,测试期糟糕

案例

训练期(6 个月):
  交易次数:150
  胜率:95%
  总收益:+45%
  Sharpe:5.2

测试期(3 个月):
  交易次数:72
  胜率:48%
  总收益:-12%
  Sharpe:-0.3

诊断:典型的过拟合!
Enter fullscreen mode Exit fullscreen mode

信号 2:策略参数极其复杂

过拟合策略示例

def populate_entry_trend(self, dataframe, metadata):
    dataframe.loc[
        (
            # 10 个条件组合
            (dataframe['ema5'] > dataframe['ema10']) &
            (dataframe['ema10'] > dataframe['ema20']) &
            (dataframe['rsi'] > 52.3) &  # 过于精确
            (dataframe['rsi'] < 57.8) &  # 过于精确
            (dataframe['macd'] > 0.0023) &  # 过于精确
            (dataframe['volume'] > dataframe['volume'].shift(1) * 1.234) &  # 过于精确
            (dataframe['close'] > dataframe['bb_lowerband'] * 1.012) &
            (dataframe['adx'] > 23.7) &
            (dataframe['cci'] < 87.3) &
            (dataframe['mfi'] > 42.1)
        ),
        'enter_long'] = 1
Enter fullscreen mode Exit fullscreen mode

问题

  • ❌ 参数过于精确(如 52.3、57.8)
  • ❌ 条件过多(10 个条件)
  • ❌ 可能只适合特定历史数据

信号 3:微调参数效果剧变

测试

RSI 阈值 = 30 → 收益 +25%
RSI 阈值 = 31 → 收益 +2%
RSI 阈值 = 29 → 收益 -5%

结论:策略对参数极度敏感,过拟合!
Enter fullscreen mode Exit fullscreen mode

预防过拟合的方法

1. 简化策略

原则

  • ✅ 条件数量 ≤ 5 个
  • ✅ 参数使用整数(如 30,不是 30.3)
  • ✅ 逻辑清晰易懂

改进示例

# 简化后的策略
def populate_entry_trend(self, dataframe, metadata):
    dataframe.loc[
        (
            # 只保留 3 个核心条件
            (dataframe['ema20'] > dataframe['ema50']) &  # 趋势确认
            (dataframe['rsi'] > 30) &  # 不在超卖
            (dataframe['volume'] > 0)  # 有成交量
        ),
        'enter_long'] = 1
Enter fullscreen mode Exit fullscreen mode

2. 增加测试周期

建议

短期策略(5m-15m):至少 3 个月数据
中期策略(1h-4h):至少 6 个月数据
长期策略(1d):至少 12 个月数据
Enter fullscreen mode Exit fullscreen mode

3. 多市况测试

验证清单

✅ 牛市测试
✅ 熊市测试
✅ 震荡市测试
✅ 高波动期测试
✅ 低波动期测试
Enter fullscreen mode Exit fullscreen mode

4. 参数稳定性测试

方法
微调参数,观察结果变化

# 测试 RSI 阈值的稳定性
# 修改策略中的 RSI 阈值:25, 30, 35
freqtrade backtesting -c config.json --strategy StrategyRSI25 --timerange 20250701-20250930
freqtrade backtesting -c config.json --strategy StrategyRSI30 --timerange 20250701-20250930
freqtrade backtesting -c config.json --strategy StrategyRSI35 --timerange 20250701-20250930

# 如果三个版本结果相近,说明策略稳定
Enter fullscreen mode Exit fullscreen mode

5. 使用正则化技术

方法

  • 限制最大持仓数
  • 设置合理的 ROI 梯度
  • 使用保守的止损

示例

# 防过拟合的保守设置
stoploss = -0.10  # 10% 止损(不要过紧)
max_open_trades = 3  # 限制持仓数
minimal_roi = {
    "0": 0.10,     # 目标合理(不要过高)
    "120": 0.05,
    "240": 0.02
}
Enter fullscreen mode Exit fullscreen mode

💡 实践任务

任务 1:不同时间段对比测试

选择一个策略(推荐 Strategy001),测试 3 个不同时间段:

# 时间段 1:2024-10-01 ~ 2024-12-31(Q4 2024)
freqtrade backtesting -c config.json --strategy Strategy001 --timerange 20241001-20241231 --timeframe 15m

# 时间段 2:2025-01-01 ~ 2025-03-31(Q1 2025)
freqtrade backtesting -c config.json --strategy Strategy001 --timerange 20250101-20250331 --timeframe 15m

# 时间段 3:2025-04-01 ~ 2025-06-30(Q2 2025)
freqtrade backtesting -c config.json --strategy Strategy001 --timerange 20250401-20250630 --timeframe 15m

# 时间段 4:2025-07-01 ~ 2025-09-30(Q3 2025)
freqtrade backtesting -c config.json --strategy Strategy001 --timerange 20250701-20250930 --timeframe 15m
Enter fullscreen mode Exit fullscreen mode

任务 2:制作时间段对比表

时间段 交易次数 胜率% 总收益% 最大回撤% Sharpe 市场类型
2024 Q4 ? ? ? ? ? ?
2025 Q1 ? ? ? ? ? ?
2025 Q2 ? ? ? ? ? ?
2025 Q3 ? ? ? ? ? ?
平均 ? ? ? ? ? -
标准差 ? ? ? ? ? -

任务 3:样本外测试

# 训练期:2024-07-01 ~ 2025-03-31(9 个月)
freqtrade backtesting -c config.json --strategy Strategy001 --timerange 20240701-20250331 --timeframe 15m

# 测试期:2025-04-01 ~ 2025-09-30(6 个月)
freqtrade backtesting -c config.json --strategy Strategy001 --timerange 20250401-20250930 --timeframe 15m
Enter fullscreen mode Exit fullscreen mode

对比分析

训练期表现:
  总收益:___________%
  胜率:___________%
  最大回撤:___________%
  Sharpe:___________

测试期表现:
  总收益:___________%(训练期的 ____%)
  胜率:___________%(差异 ____%)
  最大回撤:___________%(训练期的 ____%)
  Sharpe:___________(训练期的 ____%)

结论:
  ☐ 策略稳定,测试期表现接近训练期(≥ 75%)
  ☐ 策略不稳定,测试期表现显著下降(< 50%)
  ☐ 可能存在过拟合
Enter fullscreen mode Exit fullscreen mode

任务 4:判断策略是否稳定

根据你的测试结果,回答以下问题:

  1. 各季度表现的标准差大吗?

    • 收益标准差 < 5% → 稳定 ✅
    • 收益标准差 > 10% → 不稳定 ❌
  2. 样本外测试表现如何?

    • 测试期 ≥ 训练期的 75% → 稳定 ✅
    • 测试期 < 训练期的 50% → 过拟合 ❌
  3. 不同市况下都能盈利吗?

    • 3/4 季度盈利 → 适应性强 ✅
    • 只有 1/4 季度盈利 → 适应性差 ❌
  4. 最终判断

   ☐ 策略稳定可靠,可以进入模拟交易阶段
   ☐ 策略需要优化,回到策略调整阶段
   ☐ 策略过拟合严重,放弃此策略
Enter fullscreen mode Exit fullscreen mode

📚 知识检查

基础问题

  1. 什么是过拟合?
  2. 样本外测试的目的是什么?
  3. 如何判断一个策略是否稳定?

答案

  1. 策略过度拟合历史数据的特定特征,导致在新数据上表现不佳
  2. 验证策略的泛化能力,确保策略不只在特定时间段有效
  3. 在不同时间段表现一致,测试期表现接近训练期(≥ 75%)

进阶问题

  1. 为什么需要在牛市、熊市、震荡市都测试策略?
  2. 训练期表现好,测试期表现差,说明什么?
  3. 如何预防过拟合?

思考题

  1. 如果一个策略在所有历史时间段都表现优秀,是否意味着实盘也会好?
  2. 样本外测试应该占总数据的多少比例最合适?
  3. Walk-Forward 测试比简单的 70/30 切分有什么优势?

🔗 参考资料

配套文档

推荐阅读


📌 核心要点总结

  1. 不同时间段测试是验证策略稳定性的关键
  2. 样本外测试 > 样本内测试:测试期表现更重要
  3. 过拟合是量化交易的最大陷阱
  4. 策略应在牛市、熊市、震荡市都测试
  5. 稳定性 > 收益率:一致的表现比偶尔的高收益更重要
  6. 简化策略 > 复杂策略:条件越少越不容易过拟合

➡️ 下一课预告

第 10 课:交易对选择与测试

在下一课中,我们将:

  • 学习如何选择合适的交易对
  • 评估交易对的流动性和波动率
  • 测试策略在不同交易对的表现
  • 构建多交易对组合

准备工作

  • ✅ 下载 BTC/USDT、ETH/USDT、BNB/USDT 等多个交易对数据
  • ✅ 选定一个表现稳定的策略
  • ✅ 了解主流币和山寨币的区别

🎯 学习检验标准

  • ✅ 能独立进行样本外测试
  • ✅ 会判断策略是否过拟合
  • ✅ 理解不同市况对策略的影响
  • ✅ 能评估策略的稳定性

完成这些任务后,你已经掌握了策略验证的核心技能!准备进入交易对选择的学习吧!🚀

Top comments (0)