第 3 课:核心概念理解
⏱ 课时:1.5 小时
🎯 学习目标:理解策略、指标、信号等核心概念
📚 难度:⭐ 基础入门
📖 课程概览
本课将深入讲解 Freqtrade 量化交易系统的核心概念,包括交易策略的组成要素、常用技术指标的原理、买卖信号的生成逻辑以及止损止盈的设置方法。这些知识是理解和开发交易策略的基础。
3.1 交易策略是什么?
策略的定义
交易策略是一套明确的规则体系,用于决定:
- 何时买入(入场时机)
- 何时卖出(出场时机)
- 如何控制风险(止损止盈)
在 Freqtrade 中,策略是一个 Python 类,继承自 IStrategy
基类。
策略的三要素
1. 入场规则(Entry Logic)
定义什么条件下应该开仓买入。例如:
- 短期均线上穿长期均线(金叉)
- RSI 指标从超卖区域反弹
- 价格突破前期高点
2. 出场规则(Exit Logic)
定义什么条件下应该平仓卖出。例如:
- 短期均线下穿长期均线(死叉)
- RSI 指标进入超买区域
- 达到预设的止盈/止损目标
3. 风险管理(Risk Management)
控制每笔交易的风险暴露:
- 仓位大小:每笔交易投入多少资金
- 止损设置:最大可接受的亏损
- 止盈设置:分阶段获利退出
- 最大持仓数:同时持有多少个交易对
策略的类型
策略类型 | 特点 | 适用市场 | 代表策略 |
---|---|---|---|
趋势跟踪 | 追随市场方向 | 趋势明显的牛市/熊市 | MovingAverageCrossStrategy |
均值回归 | 价格回归均值 | 震荡市、箱体整理 | MeanReversionStrategy |
突破策略 | 价格突破关键位 | 区间突破后的趋势 | BreakoutTrendStrategy |
动量策略 | 强者恒强 | 单边快速行情 | MomentumTrendStrategy |
策略生命周期
设计 → 编码 → 回测 → 优化 → 模拟 → 实盘 → 监控 → 调整
↑ ↓
└───────────────── 循环迭代 ─────────────────────┘
3.2 技术指标入门
技术指标是通过数学计算从价格、成交量等数据中提取的辅助信息,用于判断市场趋势和时机。
1. 移动平均线(Moving Average)
EMA - 指数移动平均线
给予近期价格更高权重的平均值。
计算方式:
EMA_today = (Price_today × K) + (EMA_yesterday × (1 - K))
其中 K = 2 / (N + 1),N 为周期
应用场景:
- 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'])
SMA - 简单移动平均线
所有价格权重相同的平均值。
特点:
- 对价格变化反应较慢
- 更平滑,噪音更少
- 适合长周期趋势判断
2. 相对强弱指标(RSI)
定义:衡量价格上涨动能与下跌动能的比率,范围 0-100。
计算方式:
RSI = 100 - [100 / (1 + RS)]
其中 RS = 平均上涨幅度 / 平均下跌幅度
标准解读:
- 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'])
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']
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'])
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
多条件组合
与逻辑(AND)
所有条件都必须满足:
# 金叉 AND RSI 超卖 AND 成交量放大
(golden_cross) & (dataframe['rsi'] < 30) & (dataframe['volume'] > volume_mean)
或逻辑(OR)
任意条件满足即可:
# RSI 超卖 OR 布林带下轨
(dataframe['rsi'] < 30) | (dataframe['close'] <= dataframe['bb_lowerband'])
信号确认
为避免假信号,通常需要多重确认:
示例:趋势确认 + 动能确认
dataframe.loc[
(
# 趋势确认:价格在 EMA20 上方
(dataframe['close'] > dataframe['ema20']) &
# 动能确认:MACD 为正
(dataframe['macd'] > 0) &
# 超卖反弹:RSI 从 30 以下回升
(dataframe['rsi'] > 30) &
(dataframe['rsi'].shift(1) <= 30)
),
'enter_long'] = 1
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
逻辑说明:
- 金叉:短期趋势转强
- 价格在均��上方:确认上涨趋势
- Heikin Ashi 绿色蜡烛:平滑后的价格显示上涨
3.4 止损和止盈设置
固定止损 vs 动态止损
固定止损(Stop Loss)
在策略类中设置固定百分比:
stoploss = -0.05 # 5% 止损
优点:
- 简单明确
- 风险可控
缺点:
- 不考虑市场波动
- 可能被正常波动止损
动态止损(Trailing Stop)
随价格上涨而上移的止损:
trailing_stop = True
trailing_stop_positive = 0.01 # 盈利 1% 后启用
trailing_stop_positive_offset = 0.02 # 启用时,止损距当前价格 2%
trailing_only_offset_is_reached = True
工作原理:
买入价格:$100
盈利 1% 后($101)启用跟踪止损
当前价格 $105,止损设在 $105 - 2% = $102.90
价格上涨到 $110,止损上移到 $110 - 2% = $107.80
价格回落到 $107.79,触发止损,锁定 7.79% 利润
ROI 梯度止盈
通过时间梯度设置不同的止盈目标:
minimal_roi = {
"0": 0.10, # 立即达到 10% 利润就退出
"30": 0.05, # 30 分钟后,5% 利润退出
"60": 0.02, # 60 分钟后,2% 利润退出
"120": 0.01 # 120 分钟后,1% 利润退出
}
逻辑示例:
- 买入后 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
止损止盈组合策略
激进型:
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
}
保守型:
stoploss = -0.10 # 10% 止损
trailing_stop = False
minimal_roi = {
"0": 0.15,
"60": 0.08,
"120": 0.05,
"240": 0.02
}
💡 实践任务
任务 1:阅读策略源码
- [ ] 打开
user_data/strategies/Strategy001.py
- [ ] 理解
populate_indicators()
函数(计算指标) - [ ] 理解
populate_entry_trend()
函数(买入信号) - [ ] 理解
populate_exit_trend()
函数(卖出信号)
任务 2:绘制策略流程图
使用纸笔或流程图工具,画出 Strategy001 的逻辑流程:
数据输入 → 计算 EMA20/EMA50 → 判断金叉 → 确认价格位置 → 生成买入信号
任务 3:指标可视化
- [ ] 访问 TradingView
- [ ] 查看 BTC/USDT 日线图
- [ ] 添加 EMA20 和 EMA50 指标
- [ ] 观察最近一次金叉/死叉的位置
- [ ] 添加 RSI 指标,观察超买超卖区域
任务 4:修改参数测试
尝试修改 Strategy001 的参数(仅用于学习,不要实际交易):
# 修改前
dataframe['ema20'] = ta.EMA(dataframe, timeperiod=20)
# 修改后
dataframe['ema20'] = ta.EMA(dataframe, timeperiod=10) # 改为 EMA10
思考:周期变短会有什么影响?
📚 知识检查
基础问题
- 交易策略的三要素是什么?
- EMA 和 SMA 的主要区别是什么?
- RSI 值为 75 表示什么?
- 什么是"金叉"和"死叉"?
进阶问题
- 为什么需要多条件组合而不是单一指标信号?
- 固定止损和跟踪止损分别适合什么场景?
- ROI 梯度止盈的核心思想是什么?
- 如果一个策略只有入场规则没有出场规则会怎样?
思考题
- 一个策略在历史回测中表现很好,是否意味着未来也会好?
- 为什么大多数策略需要结合趋势指标和动能指标?
- 如何判断一个指标组合是否存在过拟合?
🔗 参考资料
技术指标学习
Freqtrade 策略开发
视频教程
📌 核心要点总结
- 策略 = 入场 + 出场 + 风险管理
- 技术指标是辅助工具,不是圣杯
- 多条件组合提高信号质量
- 止损保护本金,止盈锁定利润
- 理解指标原理比记住公式重要
➡️ 下一课预告
第 4 课:数据下载与管理
在下一课中,我们将学习:
- 如何下载历史市场数据
- 不同时间框架的选择
- 数据存储和维护
- 为回测准备数据
准备工作:
- 确保 Freqtrade 环境正常运行
- 确认网络连接稳定(需要下载数据)
- 查看
config.json
中的交易所配置
🎯 学习检验标准:
- ✅ 能说出至少 3 种技术指标的作用
- ✅ 能读懂策略代码中的买卖信号逻辑
- ✅ 理解止损止盈的设置原理
- ✅ 能在 TradingView 上添加和解读指标
完成这些内容后,你已经掌握了量化交易的核心概念基础!
Top comments (0)