DEV Community

Henry Lin
Henry Lin

Posted on

第 3 课:freqtrade核心概念理解

第 3 课:核心概念理解

⏱ 课时:1.5 小时
🎯 学习目标:理解策略、指标、信号等核心概念
📚 难度:⭐ 基础入门


📖 课程概览

本课将深入讲解 Freqtrade 量化交易系统的核心概念,包括交易策略的组成要素、常用技术指标的原理、买卖信号的生成逻辑以及止损止盈的设置方法。这些知识是理解和开发交易策略的基础。


3.1 交易策略是什么?

策略的定义

交易策略是一套明确的规则体系,用于决定:

  • 何时买入(入场时机)
  • 何时卖出(出场时机)
  • 如何控制风险(止损止盈)

在 Freqtrade 中,策略是一个 Python 类,继承自 IStrategy 基类。

策略的三要素

1. 入场规则(Entry Logic)

定义什么条件下应该开仓买入。例如:

  • 短期均线上穿长期均线(金叉)
  • RSI 指标从超卖区域反弹
  • 价格突破前期高点

2. 出场规则(Exit Logic)

定义什么条件下应该平仓卖出。例如:

  • 短期均线下穿长期均线(死叉)
  • RSI 指标进入超买区域
  • 达到预设的止盈/止损目标

3. 风险管理(Risk Management)

控制每笔交易的风险暴露:

  • 仓位大小:每笔交易投入多少资金
  • 止损设置:最大可接受的亏损
  • 止盈设置:分阶段获利退出
  • 最大持仓数:同时持有多少个交易对

策略的类型

策略类型 特点 适用市场 代表策略
趋势跟踪 追随市场方向 趋势明显的牛市/熊市 MovingAverageCrossStrategy
均值回归 价格回归均值 震荡市、箱体整理 MeanReversionStrategy
突破策略 价格突破关键位 区间突破后的趋势 BreakoutTrendStrategy
动量策略 强者恒强 单边快速行情 MomentumTrendStrategy

策略生命周期

设计 → 编码 → 回测 → 优化 → 模拟 → 实盘 → 监控 → 调整
  ↑                                               ↓
  └───────────────── 循环迭代 ─────────────────────┘
Enter fullscreen mode Exit fullscreen mode

3.2 技术指标入门

技术指标是通过数学计算从价格、成交量等数据中提取的辅助信息,用于判断市场趋势和时机。

1. 移动平均线(Moving Average)

EMA - 指数移动平均线

给予近期价格更高权重的平均值。

计算方式

EMA_today = (Price_today × K) + (EMA_yesterday × (1 - K))
其中 K = 2 / (N + 1),N 为周期
Enter fullscreen mode Exit fullscreen mode

应用场景

  • EMA20 上穿 EMA50:金叉(Golden Cross),看涨信号
  • EMA20 下穿 EMA50:死叉(Death Cross),看跌信号
  • 价格在 EMA 上方:趋势向上
  • 价格在 EMA 下方:趋势向下

代码示例

# 计算 EMA20 和 EMA50
dataframe['ema20'] = ta.EMA(dataframe, timeperiod=20)
dataframe['ema50'] = ta.EMA(dataframe, timeperiod=50)

# 判断金叉
golden_cross = qtpylib.crossed_above(dataframe['ema20'], dataframe['ema50'])
Enter fullscreen mode Exit fullscreen mode

SMA - 简单移动平均线

所有价格权重相同的平均值。

特点

  • 对价格变化反应较慢
  • 更平滑,噪音更少
  • 适合长周期趋势判断

2. 相对强弱指标(RSI)

定义:衡量价格上涨动能与下跌动能的比率,范围 0-100。

计算方式

RSI = 100 - [100 / (1 + RS)]
其中 RS = 平均上涨幅度 / 平均下跌幅度
Enter fullscreen mode Exit fullscreen mode

标准解读

  • RSI > 70:超买区域,可能回调
  • RSI < 30:超卖区域,可能反弹
  • RSI 50:中性位置

高级用法

  • RSI 背离:价格创新高但 RSI 未创新高,趋势可能反转
  • RSI 突破 50:从下向上突破 50,确认上涨趋势

代码示例

# 计算 RSI
dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)

# 超卖反弹信号
oversold_bounce = (dataframe['rsi'] < 30) & (dataframe['rsi'].shift(1) < dataframe['rsi'])
Enter fullscreen mode Exit fullscreen mode

3. 布林带(Bollinger Bands)

定义:由中轨(均线)和上下轨(±2倍标准差)组成的通道指标。

组成部分

  • 中轨:20 日 SMA
  • 上轨:中轨 + 2 × 标准差
  • 下轨:中轨 - 2 × 标准差

交易信号

  • 价格触及下轨:可能反弹(均值回归)
  • 价格触及上轨:可能回调
  • 布林带收窄:波动率降低,酝酿突破
  • 布林带扩张:波动率增加,趋势确立

代码示例

# 计算布林带
bollinger = qtpylib.bollinger_bands(qtpylib.typical_price(dataframe), window=20, stds=2)
dataframe['bb_lowerband'] = bollinger['lower']
dataframe['bb_middleband'] = bollinger['mid']
dataframe['bb_upperband'] = bollinger['upper']

# 价格触及下轨
touch_lower = dataframe['close'] <= dataframe['bb_lowerband']
Enter fullscreen mode Exit fullscreen mode

4. MACD(Moving Average Convergence Divergence)

定义:通过快速和慢速 EMA 的差值判断趋势动能。

组成部分

  • MACD 线:EMA12 - EMA26
  • 信号线:MACD 的 9 日 EMA
  • 柱状图:MACD - 信号线

交易信号

  • MACD 上穿信号线:买入信号
  • MACD 下穿信号线:卖出信号
  • MACD 为正:短期趋势强于长期
  • MACD 柱状图放大:趋势加速

代码示例

# 计算 MACD
macd = ta.MACD(dataframe)
dataframe['macd'] = macd['macd']
dataframe['macdsignal'] = macd['macdsignal']
dataframe['macdhist'] = macd['macdhist']

# MACD 金叉
macd_cross = qtpylib.crossed_above(dataframe['macd'], dataframe['macdsignal'])
Enter fullscreen mode Exit fullscreen mode

3.3 买入/卖出信号原理

信号生成逻辑

在 Freqtrade 中,信号通过在 DataFrame 中设置标志位生成:

def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    dataframe.loc[
        (
            # 条件1
            (dataframe['ema20'] > dataframe['ema50']) &
            # 条件2
            (dataframe['rsi'] > 30) &
            # 条件3
            (dataframe['volume'] > 0)
        ),
        'enter_long'] = 1  # 标记买入信号

    return dataframe
Enter fullscreen mode Exit fullscreen mode

多条件组合

与逻辑(AND)

所有条件都必须满足:

# 金叉 AND RSI 超卖 AND 成交量放大
(golden_cross) & (dataframe['rsi'] < 30) & (dataframe['volume'] > volume_mean)
Enter fullscreen mode Exit fullscreen mode

或逻辑(OR)

任意条件满足即可:

# RSI 超卖 OR 布林带下轨
(dataframe['rsi'] < 30) | (dataframe['close'] <= dataframe['bb_lowerband'])
Enter fullscreen mode Exit fullscreen mode

信号确认

为避免假信号,通常需要多重确认:

示例:趋势确认 + 动能确认

dataframe.loc[
    (
        # 趋势确认:价格在 EMA20 上方
        (dataframe['close'] > dataframe['ema20']) &
        # 动能确认:MACD 为正
        (dataframe['macd'] > 0) &
        # 超卖反弹:RSI 从 30 以下回升
        (dataframe['rsi'] > 30) &
        (dataframe['rsi'].shift(1) <= 30)
    ),
    'enter_long'] = 1
Enter fullscreen mode Exit fullscreen mode

Strategy001 信号解析

让我们详细解读 Strategy001 的买入逻辑:

dataframe.loc[
    (
        # 条件1: EMA20 上穿 EMA50(金叉)
        qtpylib.crossed_above(dataframe['ema20'], dataframe['ema50']) &
        # 条件2: 价格在 EMA20 上方(趋势确认)
        (dataframe['ha_close'] > dataframe['ema20']) &
        # 条件3: Heikin Ashi 绿色蜡烛(上涨动能)
        (dataframe['ha_open'] < dataframe['ha_close'])
    ),
    'enter_long'] = 1
Enter fullscreen mode Exit fullscreen mode

逻辑说明

  1. 金叉:短期趋势转强
  2. 价格在均��上方:确认上涨趋势
  3. Heikin Ashi 绿色蜡烛:平滑后的价格显示上涨

3.4 止损和止盈设置

固定止损 vs 动态止损

固定止损(Stop Loss)

在策略类中设置固定百分比:

stoploss = -0.05  # 5% 止损
Enter fullscreen mode Exit fullscreen mode

优点

  • 简单明确
  • 风险可控

缺点

  • 不考虑市场波动
  • 可能被正常波动止损

动态止损(Trailing Stop)

随价格上涨而上移的止损:

trailing_stop = True
trailing_stop_positive = 0.01  # 盈利 1% 后启用
trailing_stop_positive_offset = 0.02  # 启用时,止损距当前价格 2%
trailing_only_offset_is_reached = True
Enter fullscreen mode Exit fullscreen mode

工作原理

买入价格:$100
盈利 1% 后($101)启用跟踪止损
当前价格 $105,止损设在 $105 - 2% = $102.90
价格上涨到 $110,止损上移到 $110 - 2% = $107.80
价格回落到 $107.79,触发止损,锁定 7.79% 利润
Enter fullscreen mode Exit fullscreen mode

ROI 梯度止盈

通过时间梯度设置不同的止盈目标:

minimal_roi = {
    "0": 0.10,   # 立即达到 10% 利润就退出
    "30": 0.05,  # 30 分钟后,5% 利润退出
    "60": 0.02,  # 60 分钟后,2% 利润退出
    "120": 0.01  # 120 分钟后,1% 利润退出
}
Enter fullscreen mode Exit fullscreen mode

逻辑示例

  • 买入后 5 分钟内涨到 10%:立即卖出
  • 持有 40 分钟,涨到 6%:卖出(触发 30 分钟的 5% 目标)
  • 持有 90 分钟,涨到 3%:卖出(触发 60 分钟的 2% 目标)

自定义退出信号

除了 ROI 和止损,还可以通过信号主动退出:

def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    dataframe.loc[
        (
            # 死叉:EMA20 下穿 EMA50
            qtpylib.crossed_below(dataframe['ema20'], dataframe['ema50']) |
            # RSI 超买
            (dataframe['rsi'] > 70)
        ),
        'exit_long'] = 1

    return dataframe
Enter fullscreen mode Exit fullscreen mode

止损止盈组合策略

激进型

stoploss = -0.03          # 3% 止损
trailing_stop = True
trailing_stop_positive = 0.005  # 0.5% 后启用
minimal_roi = {
    "0": 0.08,
    "20": 0.04,
    "40": 0.02
}
Enter fullscreen mode Exit fullscreen mode

保守型

stoploss = -0.10          # 10% 止损
trailing_stop = False
minimal_roi = {
    "0": 0.15,
    "60": 0.08,
    "120": 0.05,
    "240": 0.02
}
Enter fullscreen mode Exit fullscreen mode

💡 实践任务

任务 1:阅读策略源码

  • [ ] 打开 user_data/strategies/Strategy001.py
  • [ ] 理解 populate_indicators() 函数(计算指标)
  • [ ] 理解 populate_entry_trend() 函数(买入信号)
  • [ ] 理解 populate_exit_trend() 函数(卖出信号)

任务 2:绘制策略流程图

使用纸笔或流程图工具,画出 Strategy001 的逻辑流程:

数据输入 → 计算 EMA20/EMA50 → 判断金叉 → 确认价格位置 → 生成买入信号
Enter fullscreen mode Exit fullscreen mode

任务 3:指标可视化

  • [ ] 访问 TradingView
  • [ ] 查看 BTC/USDT 日线图
  • [ ] 添加 EMA20 和 EMA50 指标
  • [ ] 观察最近一次金叉/死叉的位置
  • [ ] 添加 RSI 指标,观察超买超卖区域

任务 4:修改参数测试

尝试修改 Strategy001 的参数(仅用于学习,不要实际交易):

# 修改前
dataframe['ema20'] = ta.EMA(dataframe, timeperiod=20)

# 修改后
dataframe['ema20'] = ta.EMA(dataframe, timeperiod=10)  # 改为 EMA10
Enter fullscreen mode Exit fullscreen mode

思考:周期变短会有什么影响?


📚 知识检查

基础问题

  1. 交易策略的三要素是什么?
  2. EMA 和 SMA 的主要区别是什么?
  3. RSI 值为 75 表示什么?
  4. 什么是"金叉"和"死叉"?

进阶问题

  1. 为什么需要多条件组合而不是单一指标信号?
  2. 固定止损和跟踪止损分别适合什么场景?
  3. ROI 梯度止盈的核心思想是什么?
  4. 如果一个策略只有入场规则没有出场规则会怎样?

思考题

  1. 一个策略在历史回测中表现很好,是否意味着未来也会好?
  2. 为什么大多数策略需要结合趋势指标和动能指标?
  3. 如何判断一个指标组合是否存在过拟合?

🔗 参考资料

技术指标学习

Freqtrade 策略开发

视频教程


📌 核心要点总结

  1. 策略 = 入场 + 出场 + 风险管理
  2. 技术指标是辅助工具,不是圣杯
  3. 多条件组合提高信号质量
  4. 止损保护本金,止盈锁定利润
  5. 理解指标原理比记住公式重要

➡️ 下一课预告

第 4 课:数据下载与管理

在下一课中,我们将学习:

  • 如何下载历史市场数据
  • 不同时间框架的选择
  • 数据存储和维护
  • 为回测准备数据

准备工作

  • 确保 Freqtrade 环境正常运行
  • 确认网络连接稳定(需要下载数据)
  • 查看 config.json 中的交易所配置

🎯 学习检验标准

  • ✅ 能说出至少 3 种技术指标的作用
  • ✅ 能读懂策略代码中的买卖信号逻辑
  • ✅ 理解止损止盈的设置原理
  • ✅ 能在 TradingView 上添加和解读指标

完成这些内容后,你已经掌握了量化交易的核心概念基础!

Top comments (0)