9.6 KiB
9.6 KiB
FreqAI 优化追踪止盈 (Trailing Stop) 功能文档
概述
本功能使用 FreqAI 机器学习模型预测最优的追踪止盈距离,实现动态的、自适应的追踪止盈策略。相比固定的 trailing_stop_positive 参数,FreqAI 可以根据每个交易对、每个时刻的市场特征预测最合适的追踪距离。
功能特点
1. 智能预测
- FreqAI 通过学习历史数据,预测"从最高点到后续最低点的最大回调"
- 自动适应不同币种的波动特性(高波动币种使用更宽的距离,低波动币种使用更紧的距离)
- 根据市场状态动态调整(强趋势行情使用小距离紧跟,震荡行情使用大距离避免被洗出)
2. 与原有逻辑兼容
- 不影响 stoploss 逻辑: 原有的分段止损策略(大盈利保护、小盈利保本、亏损快速断损)完全保留
- 仅在盈利时激活: 只在盈利超过
trailing_stop_positive_offset时启用追踪止盈 - 优雅降级: 如果 FreqAI 预测不可用,自动回退到默认的
trailing_stop_positive参数
3. 安全边界
- 预测值范围限制:0.2% - 3%
- 确保追踪止盈不低于
trailing_stop_positive_offset - 避免过于激进或过于保守的追踪距离
实现原理
标签计算逻辑
在 set_freqai_targets() 中添加了 &-optimal_trailing_stop 标签:
def calculate_trailing_stop_distance(close_series, high_series, low_series, horizon):
"""
对每个时间点,计算最优追踪止盈距离
= 从最高点到后续最低点的最大回调
"""
for i in range(len(close_series)):
# 1. 获取未来 horizon 周期的高低价
future_window_high = high_series[i:i+horizon]
future_window_low = low_series[i:i+horizon]
# 2. 找到最高价的位置
max_high_value = future_window_high.max()
# 3. 在最高价之后找最低价
after_high_lows = future_window_low.iloc[high_position+1:]
min_low_after_high = after_high_lows.min()
# 4. 计算最大回调
max_drawdown = (max_high_value - min_low_after_high) / max_high_value
# 5. 追踪止盈距离 = 最大回调 * 0.6 (留 40% 缓冲)
optimal_distance = max(0.002, min(max_drawdown * 0.6, 0.03))
核心思想: 如果历史数据显示某个币种在盈利后通常回调 2%,那么最优追踪距离应该是 1.2%(2% × 0.6),这样可以在回调开始前及时离场。
custom_stoploss 集成
def custom_stoploss(self, pair: str, trade: 'Trade', current_time, current_rate: float,
current_profit: float, **kwargs) -> float:
# === FreqAI 追踪止盈 (Trailing Stop) ===
# 只在盈利超过 trailing_stop_positive_offset 时启用
if self.trailing_stop and current_profit > self.trailing_stop_positive_offset:
# 尝试从 FreqAI 获取最优追踪距离
if '&-optimal_trailing_stop' in dataframe.columns:
freqai_trailing_distance = float(last_candle['&-optimal_trailing_stop'])
# 使用 FreqAI 预测的动态追踪距离
trailing_stop_value = -(current_profit - freqai_trailing_distance)
trailing_stop_value = max(trailing_stop_value, -self.trailing_stop_positive_offset)
return trailing_stop_value
# 没有 FreqAI 预测时,使用默认值
trailing_stop_value = -(current_profit - self.trailing_stop_positive)
return trailing_stop_value
# === 以下是原有的 Stoploss 逻辑(不受影响) ===
# 分段止损、市场状态调整等...
配置说明
1. 启用 Trailing Stop
在策略配置中需要启用追踪止盈:
# freqaiprimer.py 中的配置
trailing_stop = True
trailing_stop_positive_offset = 0.005 # 盈利超过 0.5% 时启用追踪
2. FreqAI 配置
确保 FreqAI 配置正确:
{
"freqai": {
"freqaimodel": "LightGBMMultiTargetRegressor", // 必须使用回归模型
"feature_parameters": {
"label_period_candles": 100, // 预测窗口,影响标签计算
"include_timeframes": ["3m", "15m", "1h"]
}
}
}
3. 重新训练模型
由于添加了新的标签 &-optimal_trailing_stop,需要重新训练模型:
# 删除旧模型
rm -rf user_data/models/test58*
# 重启容器,触发训练
docker restart freqtrade
工作流程
┌─────────────────────────────────────────┐
│ 1. 训练阶段 │
├─────────────────────────────────────────┤
│ • 计算每个时间点的最优追踪止盈距离 │
│ • FreqAI 学习:特征 → 最优距离的映射 │
│ • 模型保存 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 2. 实时交易阶段 │
├─────────────────────────────────────────┤
│ • 持仓中,盈利 > 0.5% │
│ • FreqAI 预测当前最优追踪距离 │
│ • custom_stoploss 返回动态止损值 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 3. 价格回调触发止损 │
├─────────────────────────────────────────┤
│ • 价格从最高点回调超过预测距离 │
│ • 触发追踪止盈,自动平仓 │
└─────────────────────────────────────────┘
实际效果示例
高波动币种 (如 MEME)
时刻 T1: 盈利 3%, FreqAI 预测追踪距离 2.5%
→ 止损设在 0.5% (3% - 2.5%)
时刻 T2: 盈利涨到 5%, 预测距离仍为 2.5%
→ 止损上移到 2.5% (5% - 2.5%)
时刻 T3: 价格回调到 2.4%
→ 触发追踪止盈,平仓,锁定 2.4% 利润
低波动币种 (如 BTC)
时刻 T1: 盈利 3%, FreqAI 预测追踪距离 0.8%
→ 止损设在 2.2% (3% - 0.8%)
时刻 T2: 盈利涨到 4%, 预测距离仍为 0.8%
→ 止损上移到 3.2% (4% - 0.8%)
时刻 T3: 价格回调到 3.1%
→ 触发追踪止盈,平仓,锁定 3.1% 利润
优势分析
相比固定参数
| 特性 | 固定 trailing_stop_positive | FreqAI 优化 |
|---|---|---|
| 适应性 | 所有币种统一参数 | 每个币种自动适应 |
| 市场感知 | 无 | 感知当前市场状态 |
| 学习能力 | 无 | 从历史数据学习 |
| 风险控制 | 可能过紧或过松 | 动态平衡收益和风险 |
典型场景
- 强趋势行情: 模型学习到回调小,使用 0.5-1% 的紧追踪,最大化利润
- 震荡行情: 模型学习到回调大,使用 2-3% 的宽追踪,避免被洗出
- 高波动币种: 自动使用更宽的追踪距离(1.5-3%)
- 稳定币种: 自动使用更紧的追踪距离(0.5-1%)
日志查看
实时交易时,可以通过日志查看 FreqAI 预测:
docker logs -f freqtrade | grep "optimal_trailing_stop"
预期输出:
[BTC/USDT] FreqAI 预测追踪止盈距离: 0.008 (0.8%)
[ETH/USDT] FreqAI 预测追踪止盈距离: 0.012 (1.2%)
[DOGE/USDT] FreqAI 预测追踪止盈距离: 0.025 (2.5%)
注意事项
- 必须重新训练: 添加新标签后,必须删除旧模型重新训练
- 回归模型: 必须使用
LightGBMMultiTargetRegressor或其他回归模型,分类模型不支持 - 数据充足: 建议至少有
train_period_days=12以上的训练数据 - 与 stoploss 独立: 此功能不影响亏损时的止损逻辑
故障排查
问题 1: 预测值一直是默认值
原因: 模型未训练或标签列不存在
解决:
# 检查模型目录
ls -la user_data/models/test58*/
# 查看最新训练日志
docker logs freqtrade | tail -100
# 删除旧模型重新训练
rm -rf user_data/models/test58* && docker restart freqtrade
问题 2: 追踪止盈不生效
原因: trailing_stop 未启用或利润未达到 trailing_stop_positive_offset
解决:
# 确认策略中配置
trailing_stop = True
trailing_stop_positive_offset = 0.005 # 0.5%
# 确认当前利润 > 0.5%
问题 3: 追踪距离异常
原因: 预测值超出范围或数据质量问题
解决:
# 检查预测值范围限制
if 0.002 <= predicted_distance <= 0.03: # 0.2% - 3%
freqai_trailing_distance = predicted_distance
参考资料
- Freqtrade Trailing Stop 文档
- FreqAI 标签定义文档
- 项目文件:
/freqtrade/templates/freqaiprimer.py(Line 546-676, 1514-1620)
更新历史
- 2026-01-16: 初始实现,添加
&-optimal_trailing_stop标签和custom_stoploss集成 - 分支:
freq-ai-01a4416db和master