1943 字
10 分钟

Freqtrade时间范围测试

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

1. 避免过拟合(Overfitting)#

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

过拟合的表现

训练期(2025-01-01 ~ 2025-06-30):
收益:+35%,胜率:92%,Sharpe:4.5 ✅
测试期(2025-07-01 ~ 2025-09-30):
收益:-8%,胜率:45%,Sharpe:0.3 ❌
结论:严重过拟合!

如何识别过拟合

  • ✅ 训练期表现优秀,测试期表现糟糕
  • ✅ 策略参数过于复杂(条件 > 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%
结论:策略稳定,各季度表现一致 ✅

vs

Q1:收益 +45%,回撤 -2%
Q2:收益 -15%,回撤 -18%
Q3:收益 +30%,回撤 -5%
Q4:收益 -20%,回撤 -22%
结论:策略不稳定,波动剧烈 ❌

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

不同策略适合不同市况:

趋势策略 vs 震荡策略

趋势策略(MovingAverageCross):
牛市(2025-01~03):+35% ✅
震荡(2025-04~06):-8% ❌
熊市(2025-07~09):+28% ✅
均值回归策略(MeanReversion):
牛市:+5% ⚠️
震荡:+22% ✅
熊市:+3% ⚠️

结论

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

牛市 vs 熊市 vs 震荡市#

市场类型特征#

1. 牛市(Bull Market)#

特征

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

识别方法

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

适合策略

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

回测要点

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

2. 熊市(Bear Market)#

特征

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

识别方法

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

应对策略

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

适合策略

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

回测要点

Terminal window
# 测试熊市行情(假设 2025-07~09 是熊市)
freqtrade backtesting \
-c config.json \
--strategy Strategy001 \
--timerange 20250701-20250930
# 关注回撤和止损表现

3. 震荡市(Range-Bound Market)#

特征

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

识别方法

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

适合策略

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

回测要点

Terminal window
# 测试震荡行情
freqtrade backtesting \
-c config.json \
--strategy MeanReversionStrategy \
--timerange 20250401-20250630

市况识别实战#

使用 TradingView 识别

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

判断标准

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

样本外测试(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%)

回测命令

Terminal window
# 训练期回测
freqtrade backtesting \
-c config.json \
--strategy Strategy001 \
--timerange 20240701-20250331
# 测试期回测
freqtrade backtesting \
-c config.json \
--strategy Strategy001 \
--timerange 20250401-20250930

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

原理

数据:12 个月
周期1: 训练(1-6月) → 测试(7-8月)
周期2: 训练(3-8月) → 测试(9-10月)
周期3: 训练(5-10月) → 测试(11-12月)

优点

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

方法 3:季度分割测试#

原理

Q1(1-3月):测试
Q2(4-6月):测试
Q3(7-9月):测试
Q4(10-12月):测试
对比各季度表现的一致性

回测命令

Terminal window
# 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

样本外测试评估标准#

合格标准

训练期收益:+20%
测试期收益:+15%(训练期的 75% 以上)
训练期回撤:-5%
测试期回撤:-7%(不超过训练期的 150%)
训练期 Sharpe:3.0
测试期 Sharpe:2.3(训练期的 75% 以上)
结论:✅ 策略稳定,可以使用

警告信号

训练期收益:+30%
测试期收益:+2%(仅为训练期的 6.7%)❌
训练期回撤:-3%
测试期回撤:-15%(是训练期的 5 倍)❌
训练期 Sharpe:4.5
测试期 Sharpe:0.5(仅为训练期的 11%)❌
结论:❌ 严重过拟合,不能使用

避免过拟合#

过拟合的识别信号#

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

案例

训练期(6 个月):
交易次数:150
胜率:95%
总收益:+45%
Sharpe:5.2
测试期(3 个月):
交易次数:72
胜率:48%
总收益:-12%
Sharpe:-0.3
诊断:典型的过拟合!

信号 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

问题

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

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

测试

RSI 阈值 = 30 → 收益 +25%
RSI 阈值 = 31 → 收益 +2%
RSI 阈值 = 29 → 收益 -5%
结论:策略对参数极度敏感,过拟合!

预防过拟合的方法#

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

2. 增加测试周期#

建议

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

3. 多市况测试#

验证清单

✅ 牛市测试
✅ 熊市测试
✅ 震荡市测试
✅ 高波动期测试
✅ 低波动期测试

4. 参数稳定性测试#

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

Terminal window
# 测试 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
# 如果三个版本结果相近,说明策略稳定

5. 使用正则化技术#

方法

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

示例

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

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
Freqtrade时间范围测试
https://blog.smyb.fun/posts/aitrade/09_freqtrade时间范围测试/
作者
三木羽冰
发布于
2026-01-09
许可协议
CC BY-NC-SA 4.0
最后更新于 2026-01-09,距今已过 40 天

部分内容可能已过时

Profile Image of the Author
三木羽冰
嵌言片语
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
21
分类
3
标签
6
总字数
24,212
运行时长
0
最后活动
0 天前

目录