量化交易入门第二天:双均线策略与Backtrader回测

量化交易入门第二天:双均线策略与Backtrader回测 📈

🎯 今日学习目标

在第一天掌握了数据获取与处理的基础上,第二天我们将深入学习量化交易的核心内容:

  • 📊 技术分析基础:理解移动平均线和交易信号原理
  • 🔄 策略开发:实现经典的双均线交叉策略
  • 🧪 回测框架:掌握Backtrader框架的使用方法
  • 📈 性能评估:学会分析策略的收益率、回撤等关键指标
  • ⚖️ 策略比较:对比不同参数和策略的表现

📖 理论基础

移动平均线基础

移动平均线(Moving Average, MA) 是技术分析中最基础也是最重要的指标之一。

简单移动平均线计算公式

1
SMA_n = (P1 + P2 + ... + Pn) / n

其中:

  • P1, P2, …, Pn 是过去n期的收盘价
  • n 是移动平均的周期

移动平均线的作用

  • 趋势识别 📊:平滑价格波动,显示主要趋势方向
  • 支撑阻力 🏗️:价格往往在均线附近找到支撑或遇到阻力
  • 信号生成 ⚡:价格与均线的交叉可以产生交易信号

双均线策略原理

双均线策略使用两条不同周期的移动平均线:

  • 快线(短期均线) 🏃‍♂️:如5日、10日移动平均线
  • 慢线(长期均线) 🚶‍♂️:如20日、30日移动平均线

交易信号规则

  • 买入信号(金叉) 🟢:快线从下方穿越慢线
  • 卖出信号(死叉) 🔴:快线从上方穿越慢线

策略逻辑

1
2
3
4
如果 MA_短期 > MA_长期 且 昨日MA_短期 <= 昨日MA_长期:
产生买入信号 📈
如果 MA_短期 < MA_长期 且 昨日MA_短期 >= 昨日MA_长期:
产生卖出信号 📉

双均线策略的优缺点

✅ 优点

  • 简单易懂:逻辑清晰,容易实现
  • 趋势跟踪:能够捕捉中长期趋势
  • 风险控制:有明确的进出场规则
  • 广泛适用:适用于多种市场和时间周期

❌ 缺点

  • 滞后性:移动平均线是滞后指标
  • 震荡市表现差:在横盘整理时容易产生虚假信号
  • 参数敏感:不同的均线周期组合效果差异很大

🛠️ 技术实现

核心策略类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class DualMAStrategy(bt.Strategy):
"""双均线交叉策略"""

# 策略参数
params = (
('ma_fast', 5), # 快速移动平均线周期
('ma_slow', 20), # 慢速移动平均线周期
('printlog', True), # 是否打印日志
)

def __init__(self):
"""初始化策略"""
# 获取数据
self.dataclose = self.datas[0].close

# 计算移动平均线
self.ma_fast = bt.indicators.SimpleMovingAverage(
self.datas[0], period=self.params.ma_fast
)
self.ma_slow = bt.indicators.SimpleMovingAverage(
self.datas[0], period=self.params.ma_slow
)

# 计算交叉信号
self.crossover = bt.indicators.CrossOver(self.ma_fast, self.ma_slow)

# 记录订单和统计变量
self.order = None
self.trade_count = 0
self.win_count = 0

def next(self):
"""策略主逻辑"""
# 检查是否有待处理订单
if self.order:
return

# 检查是否持仓
if not self.position:
# 没有持仓,检查买入信号
if self.crossover[0] > 0: # 快线上穿慢线
cash = self.broker.get_cash()
# 计算买入数量(使用95%的可用资金)
if self.dataclose[0] > 1000: # 高价资产允许小数数量
size = (cash * 0.95) / self.dataclose[0]
if size >= 0.001:
self.order = self.buy(size=size)
else:
size = int((cash * 0.95) / self.dataclose[0])
if size > 0:
self.order = self.buy(size=size)
else:
# 持仓中,检查卖出信号
if self.crossover[0] < 0: # 快线下穿慢线
self.order = self.sell(size=self.position.size)

回测引擎设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def run_backtest(df, strategy_class, **kwargs):
"""运行回测"""
# 创建回测引擎
cerebro = bt.Cerebro()

# 添加策略
cerebro.addstrategy(strategy_class, **kwargs)

# 添加数据
data = create_backtrader_data(df)
cerebro.adddata(data)

# 设置初始资金和手续费
cerebro.broker.setcash(10000.0)
cerebro.broker.setcommission(commission=0.001) # 0.1%手续费

# 添加分析器
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')
cerebro.addanalyzer(bt.analyzers.Returns, _name='returns')
cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name='trades')

# 运行回测
results = cerebro.run()
return cerebro, results

📊 性能指标分析

关键指标说明

🎯 收益指标

  • 总收益率:(最终资金 - 初始资金) / 初始资金
  • 年化收益率:考虑时间因素的收益率
  • 累计收益:绝对收益金额

⚠️ 风险指标

  • 最大回撤:策略运行期间的最大亏损幅度
  • 夏普比率:风险调整后的收益率
  • 波动率:收益率的标准差

📈 交易统计

  • 总交易次数:完成的买卖对数
  • 胜率:盈利交易占总交易的比例
  • 平均盈利/亏损:单次交易的平均盈亏
  • 盈亏比:平均盈利与平均亏损的比值

结果分析代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def analyze_results(results):
"""分析回测结果"""
result = results[0]

print("\n=== 回测结果分析 ===")

# 夏普比率
sharpe_ratio = result.analyzers.sharpe.get_analysis()
if sharpe_ratio and 'sharperatio' in sharpe_ratio:
print(f"夏普比率: {sharpe_ratio['sharperatio']:.4f}")

# 最大回撤
drawdown = result.analyzers.drawdown.get_analysis()
if drawdown and 'max' in drawdown:
print(f"最大回撤: {drawdown['max']['drawdown']:.2f}%")

# 交易分析
trades = result.analyzers.trades.get_analysis()
if trades and trades.get('total', {}).get('total', 0) > 0:
print(f"总交易次数: {trades['total']['total']}")
print(f"胜率: {trades['won']['total'] / trades['total']['total'] * 100:.2f}%")

🚀 实战运行

环境设置

首先安装必要的依赖包:

1
pip install backtrader pandas numpy matplotlib seaborn

运行方式

1
2
# 运行完整回测
python day2_dual_ma_strategy.py

策略比较

脚本会自动比较以下策略:

  • 双均线策略(5,20) 🔄
  • 双均线策略(10,30) 🔄
  • 买入并持有策略 📊

输出文件

  • 回测结果CSVbacktest_results_ETH_USD_processed_ccxt_1year.csv
  • 可视化图表:包含价格走势、移动平均线、买卖信号等

📈 实战结果分析

可视化特色

系统使用Seaborn创建美观的分析图表,包括:

  1. 价格走势图 📊:显示原始价格数据
  2. 移动平均线图 📈:展示MA5、MA10、MA20、MA30
  3. 收益率分布 📊:分析收益率的统计特性
  4. 交易量图 📊:显示成交量变化
  5. 累计收益曲线 📈:展示策略表现
  6. 策略性能热力图 🔥:多维度比较策略表现

中文字体支持

系统智能检测并配置中文字体,支持:

  • macOS:PingFang SC、Hiragino Sans GB
  • 通用:Arial Unicode MS、SimHei等
  • 自动回退机制确保兼容性

💡 策略优化建议

参数调优

1
2
3
4
5
# 推荐参数范围
快速均线:3-10
慢速均线:15-50
止损设置:固定百分比或ATR倍数
仓位管理:固定仓位或动态调整

信号过滤

  • ✅ 添加成交量确认
  • ✅ 结合RSI等振荡指标
  • ✅ 考虑市场趋势过滤
  • ✅ 避免震荡市场的假信号

风险控制

  • 🛡️ 设置最大回撤限制
  • 🛡️ 实施止损止盈机制
  • 🛡️ 控制单笔交易风险
  • 🛡️ 分散投资降低风险

⚠️ 重要注意事项

策略局限性

  • 震荡市场 📉:容易产生假信号
  • 滞后性 ⏰:错过最佳进出点
  • 趋势依赖 📈:需要明显的趋势才能获利
  • 手续费影响 💰:对高频交易影响较大

回测偏差

  • 未来函数 ⚠️:确保不使用未来数据
  • 幸存者偏差 ⚠️:考虑退市股票
  • 流动性假设 ⚠️:实际交易可能有滑点
  • 手续费设置 ⚠️:需要符合实际情况

🎓 学习心得

今日收获

通过第2天的学习,我深入理解了:

  1. 技术分析基础 📚:移动平均线是技术分析的重要工具
  2. 策略设计思路 💭:简单的交叉策略也能产生有效信号
  3. 回测框架使用 🔧:Backtrader提供了强大的策略开发平台
  4. 性能评估方法 📊:多维度分析策略的优劣势
  5. 风险意识培养 ⚠️:任何策略都有其适用范围和局限性

关键洞察

  • 趋势为王 👑:双均线策略在趋势市场中表现优异
  • 参数重要性 ⚙️:不同的参数组合会产生显著不同的结果
  • 风险控制 🛡️:回撤控制比追求高收益更重要
  • 市场适应性 🔄:策略需要根据市场环境调整

下一步计划

第3天将学习:

  • 策略扩展与参数优化 🔧
  • 添加更多技术指标 📊
  • 实现参数优化算法 🤖
  • 避免过拟合的技巧 ⚠️

🔗 相关链接


免责声明 ⚠️:本文内容仅供学习和研究使用,不构成投资建议。量化交易存在风险,实际投资前请谨慎评估。回测结果不代表未来表现,过往业绩不预示未来收益。

版权声明 ©️:本文为量化交易学习系列原创内容,欢迎学习交流,转载请注明出处。