Python量化交易学习笔记(量化交易学习笔记(24))——策略多参数优化策略多参数优化
笔记(13)中介绍了在策略中对单个参数进行优化的实现方法,本文将介绍对策略中的多个参数进行优化的方案。
以笔记(14)中介绍的均线交叉策略为例,实现不同长期、短期均线参数组合的优化测试,回测股票为000001平安银行,回
测周期为2018年1月1日至2020年4月15日。
方案方案1——使用多个使用多个list
在向cerebro中添加策略时,使用list来定义长期、短期均线的取值:
strats = cerebro.optstrategy(
SmaCross,
pfast = [5, 10, 15],
pslow = [20, 30, 60])
在策略类中的init函数中,使用相应的参数:
params = dict(
pfast=5, # 短期均线周期
pslow=10 # 长期均线周期
)
def __init__(self):
sma1 = bt.ind.SMA(period=self.p.pfast) # 短期均线
sma2 = bt.ind.SMA(period=self.p.pslow) # 长期均线
self.crossover = bt.ind.CrossOver(sma1, sma2) # 交叉信号
在上面的代码中,短期均线会依次取5、10、15三个值,长期均线会依次取20、30、60三个值,这样就会形成3*3=9种组合,
执行程序后输出如下:
(Fast Period 5, Slow Period 20) Ending Value 101321.23
(Fast Period 5, Slow Period 30) Ending Value 109934.13
(Fast Period 5, Slow Period 60) Ending Value 116776.70
(Fast Period 10, Slow Period 20) Ending Value 107225.67
(Fast Period 10, Slow Period 30) Ending Value 107899.79
(Fast Period 10, Slow Period 60) Ending Value 110485.50
(Fast Period 15, Slow Period 20) Ending Value 95051.12
(Fast Period 15, Slow Period 30) Ending Value 104954.36
(Fast Period 15, Slow Period 60) Ending Value 106075.20
方案方案2——使用使用tuple(元组)的(元组)的list
在向cerebro中添加策略时,将长期、短期均线的取值组成一个tuple,将所有的待测取值构建成tuple的list:
strats = cerebro.optstrategy(
SmaCross,
period = [(5, 10), (20, 100), (2, 10)])
在策略类中的init函数中,使用相应的参数:
params = dict(
period = (5, 10), # 元组,(短期均线周期,长期均线周期)
)
def __init__(self):
sma1 = bt.ind.SMA(period=self.p.period[0]) # 短期均线
sma2 = bt.ind.SMA(period=self.p.period[1]) # 长期均线
self.crossover = bt.ind.CrossOver(sma1, sma2) # 交叉信号
在上面的代码中,短期均线和长期均线会形成了3个组合供测试优化,执行程序后输出如下:
(Fast Period 5, Slow Period 10) Ending Value 92377.83
(Fast Period 20, Slow Period 100) Ending Value 107292.25
(Fast Period 2, Slow Period 10) Ending Value 90157.66
方案1和方案2在使用时稍有区别:
方案1对所有参数的所有取值形成的所有组合所有组合都会进行回测
方案2仅针对给定的参数组合给定的参数组合进行回测
策略多参数优化代码(方案2):
from __future__ import (absolute_import, division, print_function,
unicode_literals)
import datetime # 用于datetime对象操作
import os.path # 用于管理路径
import sys # 用于在argvTo[0]中找到脚本名称
import backtrader as bt # 引入backtrader框架
评论0