量化交易策略回测,揭秘高效回测方法与优化技巧

量化交易策略回测,揭秘高效回测方法与优化技巧"/

量化交易回测是量化交易过程中至关重要的一环,它指的是在历史数据的基础上,对量化交易策略进行模拟测试,以评估策略的有效性和风险。以下是量化交易回测的基本步骤:
### 1. 数据准备 - "收集数据":获取历史交易数据,包括价格、成交量、时间戳等。 - "数据清洗":处理缺失值、异常值,确保数据质量。
### 2. 策略实现 - "编写策略代码":根据交易逻辑编写策略代码,通常使用Python、C++等编程语言。 - "参数优化":对策略参数进行优化,以寻找最佳参数组合。
### 3. 回测设置 - "回测框架":选择合适的回测框架,如Backtrader、Zipline等。 - "回测参数":设置回测时间范围、交易频率、滑点、手续费等。
### 4. 回测执行 - "模拟交易":在历史数据上执行模拟交易,计算收益、最大回撤、夏普比率等指标。 - "可视化":将回测结果以图表形式展示,便于分析。
### 5. 结果分析 - "策略评估":根据回测结果评估策略的有效性和风险。 - "优化调整":根据分析结果对策略进行调整和优化。
### 6. 风险控制 - "压力测试":对策略进行

相关内容:

ktrader 框架实现了一个简单的量化交易策略回测。首先,导入了必要的模块和 Backtrader 库,创建了一个自定义的交易策略TestStrategy,该策略会按天输出收盘价,并在连续2天收盘价下跌时发出买入信号。然后,创建了 Cerebro 对象作为回测的核心管理单元,添加了股票数据和自定义策略,设置了初始资金为 10 万。接着,打印出回测开始时投资组合的价值,运行回测流程,最后打印出回测结束后投资组合的价值。通过这种方式,可以评估该交易策略在指定时间段内的表现。

(1)Backtrader程序代码

# -*- coding: utf-8 -*-
from __future__ import (absolute_import, pision, print_function,
                        unicode_literals)
import datetime  # 用于datetime对象操作
import os.path  # 用于管理路径
import sys  # 用于在argvTo中找到脚本名称
import backtrader as bt # 引入backtrader框架

# 创建策略
class TestStrategy(bt.Strategy):
    def log(self, txt, dt=None):
        ''' 策略的日志函数'''
        dt = dt or self.datas.datetime.date(0)
        print('%s, %s' % (dt.isoformat(), txt))
    def __init__(self):
        # 引用data数据的收盘价数据
        self.dataclose = self.datas.close
    def next(self):
        # 日志输出收盘价数据
        self.log('Close, %.2f' % self.dataclose)
          # 当日收盘价小于前一日收盘价
        if self.dataclose < self.dataclose:
            # 前一日收盘价小于前前日收盘价
            if self.dataclose < self.dataclose:
                # 买买买
                self.log('BUY CREATE, %.2f' % self.dataclose)
                self.buy()



# 创建cerebro实体
cerebro = bt.Cerebro()

# 添加策略
cerebro.addstrategy(TestStrategy)

# 先找到脚本的位置,然后根据脚本与数据的相对路径关系找到数据位置
# 这样脚本从任意地方被调用,都可以正确地访问到数据
modpath = os.path.dirname(os.path.abspath(sys.argv))
datapath = os.path.join(modpath, '../../TQDat/day/stk/000001.csv')
# 创建价格数据
data = bt.feeds.GenericCSVData(
        dataname = datapath,
        fromdate = datetime.datetime(2024, 1, 1),
        todate = datetime.datetime(2025, 1, 10),
        nullvalue = 0.0,
        dtformat = ('%Y-%m-%d'),
        datetime = 0,
        open = 1,
        high = 2,
        low = 3,
        close = 4,
        volume = 5,
        openinterest = -1
        )
# 在Cerebro中添加价格数据
cerebro.adddata(data)
# 设置启动资金
cerebro.broker.setcash(100000.0)
# 打印开始信息
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
# 遍历所有数据
cerebro.run()
# 打印最后结果
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

(2)Backtrader程序代码输出结果

runfile('D:/zwPython/zwrk/2_Backtrader/未命名0.py', wdir='D:/zwPython/zwrk/2_Backtrader')
Starting Portfolio Value: 100000.00
2024-01-02, Close, 8.24
2024-01-02, BUY CREATE, 8.24
2024-01-03, Close, 8.23
2024-01-03, BUY CREATE, 8.23
2024-01-04, Close, 8.14
2024-01-04, BUY CREATE, 8.14
2024-01-05, Close, 8.30
2024-01-08, Close, 8.19
2024-01-09, Close, 8.21
2024-01-10, Close, 8.12
2024-01-11, Close, 8.21
2024-01-12, Close, 8.22
2024-01-15, Close, 8.24
2024-01-16, Close, 8.38
2024-01-17, Close, 8.27
2024-01-18, Close, 8.23
2024-01-18, BUY CREATE, 8.23
2024-01-19, Close, 8.21
2024-01-19, BUY CREATE, 8.21
2024-01-22, Close, 8.13
2024-01-22, BUY CREATE, 8.13
2024-01-23, Close, 8.20
2024-01-24, Close, 8.37
2024-01-25, Close, 8.54
2024-01-26, Close, 8.65
2024-01-29, Close, 8.73
2024-01-30, Close, 8.54
2024-01-31, Close, 8.49
2024-01-31, BUY CREATE, 8.49
2024-02-01, Close, 8.45
2024-02-01, BUY CREATE, 8.45
2024-02-02, Close, 8.30
2024-02-02, BUY CREATE, 8.30
2024-02-05, Close, 8.41
2024-02-06, Close, 8.71
2024-02-07, Close, 8.64
2024-02-08, Close, 8.71
2024-02-19, Close, 8.85
2024-02-20, Close, 8.86
2024-02-21, Close, 9.84
2024-02-22, Close, 9.94
2024-02-23, Close, 9.88
2024-02-26, Close, 9.56
2024-02-26, BUY CREATE, 9.56
2024-02-27, Close, 9.54
2024-02-27, BUY CREATE, 9.54
2024-02-28, Close, 9.53
2024-02-28, BUY CREATE, 9.53
2024-02-29, Close, 9.62
2024-03-01, Close, 9.53
2024-03-04, Close, 9.37
2024-03-04, BUY CREATE, 9.37
2024-03-05, Close, 9.46
2024-03-06, Close, 9.37
2024-03-07, Close, 9.41
2024-03-08, Close, 9.41
2024-03-11, Close, 9.51
2024-03-12, Close, 9.60
2024-03-13, Close, 9.37
2024-03-14, Close, 9.27
2024-03-14, BUY CREATE, 9.27
2024-03-15, Close, 9.63
2024-03-18, Close, 9.57
2024-03-19, Close, 9.44
2024-03-19, BUY CREATE, 9.44
2024-03-20, Close, 9.48
2024-03-21, Close, 9.51
2024-03-22, Close, 9.39
2024-03-25, Close, 9.44
2024-03-26, Close, 9.63
2024-03-27, Close, 9.56
2024-03-28, Close, 9.53
2024-03-28, BUY CREATE, 9.53
2024-03-29, Close, 9.55
2024-04-01, Close, 9.68
2024-04-02, Close, 9.59
2024-04-03, Close, 9.49
2024-04-03, BUY CREATE, 9.49
2024-04-08, Close, 9.46
2024-04-08, BUY CREATE, 9.46
2024-04-09, Close, 9.44
2024-04-09, BUY CREATE, 9.44
2024-04-10, Close, 9.31
2024-04-10, BUY CREATE, 9.31
2024-04-11, Close, 9.29
2024-04-11, BUY CREATE, 9.29
2024-04-12, Close, 9.10
2024-04-12, BUY CREATE, 9.10
2024-04-15, Close, 9.32
2024-04-16, Close, 9.31
2024-04-17, Close, 9.65
2024-04-18, Close, 9.84
2024-04-19, Close, 9.72
2024-04-22, Close, 9.54
2024-04-22, BUY CREATE, 9.54
2024-04-23, Close, 9.57
2024-04-24, Close, 9.56
2024-04-25, Close, 9.64
2024-04-26, Close, 9.63
2024-04-29, Close, 9.85
2024-04-30, Close, 9.82
2024-05-06, Close, 9.93
2024-05-07, Close, 9.91
2024-05-08, Close, 9.77
2024-05-08, BUY CREATE, 9.77
2024-05-09, Close, 9.79
2024-05-10, Close, 9.97
2024-05-13, Close, 10.01
2024-05-14, Close, 9.95
2024-05-15, Close, 9.87
2024-05-15, BUY CREATE, 9.87
2024-05-16, Close, 10.21
2024-05-17, Close, 10.46
2024-05-20, Close, 10.41
2024-05-21, Close, 10.59
2024-05-22, Close, 10.60
2024-05-23, Close, 10.44
2024-05-24, Close, 10.35
2024-05-24, BUY CREATE, 10.35
2024-05-27, Close, 10.54
2024-05-28, Close, 10.44
2024-05-29, Close, 10.29
2024-05-29, BUY CREATE, 10.29
2024-05-30, Close, 10.15
2024-05-30, BUY CREATE, 10.15
2024-05-31, Close, 10.14
2024-05-31, BUY CREATE, 10.14
2024-06-03, Close, 10.02
2024-06-03, BUY CREATE, 10.02
2024-06-04, Close, 10.05
2024-06-05, Close, 9.90
2024-06-06, Close, 9.94
2024-06-07, Close, 10.03
2024-06-11, Close, 9.90
2024-06-12, Close, 9.91
2024-06-13, Close, 9.84
2024-06-14, Close, 9.93
2024-06-17, Close, 9.85
2024-06-18, Close, 9.83
2024-06-18, BUY CREATE, 9.83
2024-06-19, Close, 9.90
2024-06-20, Close, 9.80
2024-06-21, Close, 9.75
2024-06-21, BUY CREATE, 9.75
2024-06-24, Close, 9.73
2024-06-24, BUY CREATE, 9.73
2024-06-25, Close, 9.83
2024-06-26, Close, 9.83
2024-06-27, Close, 9.88
2024-06-28, Close, 9.90
2024-07-01, Close, 10.10
2024-07-02, Close, 10.15
2024-07-03, Close, 10.06
2024-07-04, Close, 10.01
2024-07-04, BUY CREATE, 10.01
2024-07-05, Close, 9.72
2024-07-05, BUY CREATE, 9.72
2024-07-08, Close, 9.68
2024-07-08, BUY CREATE, 9.68
2024-07-09, Close, 9.82
2024-07-10, Close, 9.89
2024-07-11, Close, 9.88
2024-07-12, Close, 10.06
2024-07-15, Close, 10.08
2024-07-16, Close, 10.05
2024-07-17, Close, 10.15
2024-07-18, Close, 10.16
2024-07-19, Close, 10.12
2024-07-22, Close, 9.98
2024-07-22, BUY CREATE, 9.98
2024-07-23, Close, 9.93
2024-07-23, BUY CREATE, 9.93
2024-07-24, Close, 9.88
2024-07-24, BUY CREATE, 9.88
2024-07-25, Close, 9.84
2024-07-25, BUY CREATE, 9.84
2024-07-26, Close, 9.78
2024-07-26, BUY CREATE, 9.78
2024-07-29, Close, 9.86
2024-07-30, Close, 9.83
2024-07-31, Close, 10.02
2024-08-01, Close, 10.02
2024-08-02, Close, 9.89
2024-08-05, Close, 9.80
2024-08-05, BUY CREATE, 9.80
2024-08-06, Close, 9.68
2024-08-06, BUY CREATE, 9.68
2024-08-07, Close, 9.68
2024-08-08, Close, 9.69
2024-08-09, Close, 9.79
2024-08-12, Close, 9.76
2024-08-13, Close, 9.70
2024-08-13, BUY CREATE, 9.70
2024-08-14, Close, 9.67
2024-08-14, BUY CREATE, 9.67
2024-08-15, Close, 9.78
2024-08-16, Close, 9.88
2024-08-19, Close, 10.04
2024-08-20, Close, 10.09
2024-08-21, Close, 10.10
2024-08-22, Close, 10.13
2024-08-23, Close, 10.22
2024-08-26, Close, 10.24
2024-08-27, Close, 10.18
2024-08-28, Close, 10.08
2024-08-28, BUY CREATE, 10.08
2024-08-29, Close, 9.88
2024-08-29, BUY CREATE, 9.88
2024-08-30, Close, 9.91
2024-09-02, Close, 9.86
2024-09-03, Close, 9.83
2024-09-03, BUY CREATE, 9.83
2024-09-04, Close, 9.77
2024-09-04, BUY CREATE, 9.77
2024-09-05, Close, 9.82
2024-09-06, Close, 9.83
2024-09-09, Close, 9.60
2024-09-10, Close, 9.65
2024-09-11, Close, 9.40
2024-09-12, Close, 9.49
2024-09-13, Close, 9.45
2024-09-18, Close, 9.52
2024-09-19, Close, 9.56
2024-09-20, Close, 9.65
2024-09-23, Close, 9.79
2024-09-24, Close, 10.12
2024-09-25, Close, 10.25
2024-09-26, Close, 10.90
2024-09-27, Close, 11.17
2024-09-30, Close, 11.96
2024-10-08, Close, 12.63
2024-10-09, Close, 11.43
2024-10-10, Close, 11.98
2024-10-11, Close, 11.72
2024-10-14, Close, 12.02
2024-10-15, Close, 11.90
2024-10-16, Close, 12.06
2024-10-17, Close, 11.95
2024-10-18, Close, 12.04
2024-10-21, Close, 11.81
2024-10-22, Close, 11.79
2024-10-22, BUY CREATE, 11.79
2024-10-23, Close, 11.86
2024-10-24, Close, 11.75
2024-10-25, Close, 11.71
2024-10-25, BUY CREATE, 11.71
2024-10-28, Close, 11.64
2024-10-28, BUY CREATE, 11.64
2024-10-29, Close, 11.54
2024-10-29, BUY CREATE, 11.54
2024-10-30, Close, 11.32
2024-10-30, BUY CREATE, 11.32
2024-10-31, Close, 11.38
2024-11-01, Close, 11.43
2024-11-04, Close, 11.46
2024-11-05, Close, 11.65
2024-11-06, Close, 11.55
2024-11-07, Close, 11.91
2024-11-08, Close, 11.72
2024-11-11, Close, 11.60
2024-11-11, BUY CREATE, 11.60
2024-11-12, Close, 11.54
2024-11-12, BUY CREATE, 11.54
2024-11-13, Close, 11.61
2024-11-14, Close, 11.54
2024-11-15, Close, 11.44
2024-11-15, BUY CREATE, 11.44
2024-11-18, Close, 11.75
2024-11-19, Close, 11.68
2024-11-20, Close, 11.64
2024-11-20, BUY CREATE, 11.64
2024-11-21, Close, 11.59
2024-11-21, BUY CREATE, 11.59
2024-11-22, Close, 11.28
2024-11-22, BUY CREATE, 11.28
2024-11-25, Close, 11.18
2024-11-25, BUY CREATE, 11.18
2024-11-26, Close, 11.27
2024-11-27, Close, 11.39
2024-11-28, Close, 11.34
2024-11-29, Close, 11.38
2024-12-02, Close, 11.39
2024-12-03, Close, 11.49
2024-12-04, Close, 11.46
2024-12-05, Close, 11.44
2024-12-05, BUY CREATE, 11.44
2024-12-06, Close, 11.66
2024-12-09, Close, 11.67
2024-12-10, Close, 11.79
2024-12-11, Close, 11.73
2024-12-12, Close, 11.85
2024-12-13, Close, 11.56
2024-12-16, Close, 11.57
2024-12-17, Close, 11.53
2024-12-18, Close, 11.65
2024-12-19, Close, 11.59
2024-12-20, Close, 11.62
2024-12-23, Close, 11.73
2024-12-24, Close, 11.86
2024-12-25, Close, 11.92
2024-12-26, Close, 11.86
2024-12-27, Close, 11.83
2024-12-27, BUY CREATE, 11.83
2024-12-30, Close, 11.95
2024-12-31, Close, 11.70
2025-01-02, Close, 11.43
2025-01-02, BUY CREATE, 11.43
2025-01-03, Close, 11.38
2025-01-03, BUY CREATE, 11.38
2025-01-06, Close, 11.44
2025-01-07, Close, 11.51
2025-01-08, Close, 11.50
2025-01-09, Close, 11.40
2025-01-09, BUY CREATE, 11.40
Final Portfolio Value: 100093.44

(3)程序代码注释

# -*- coding: utf-8 -*-
# 再次指定编码格式,确保兼容性

from __future__ import (absolute_import, pision, print_function,
                        unicode_literals)
# 导入未来版本的特性,确保在不同Python版本中代码行为的一致性
import datetime  # 用于datetime对象操作,方便处理日期和时间
import os.path  # 用于管理路径,能在不同操作系统下正确处理文件路径
import sys  # 用于在argvTo中找到脚本名称,获取脚本运行的相关信息
import backtrader as bt # 引入backtrader框架,用于进行量化交易策略的回测

# 创建策略
class TestStrategy(bt.Strategy):
    # 定义一个自定义的策略类,继承自backtrader.Strategy
    def log(self, txt, dt=None):
        ''' 策略的日志函数'''
        dt = dt or self.datas.datetime.date(0)
        # 如果没有传入日期,就使用当前数据的日期
        print('%s, %s' % (dt.isoformat(), txt))
        # 以ISO格式输出日期和日志信息

    def __init__(self):
        # 策略初始化方法,在策略实例化时调用
        # 引用data数据的收盘价数据
        self.dataclose = self.datas.close
        # 将第一个数据源的收盘价数据赋值给self.dataclose,方便后续使用

    def next(self):
        # 每个K线数据到来时都会调用该方法
        # 日志输出收盘价数据
        self.log('Close, %.2f' % self.dataclose)
        # 当日收盘价小于前一日收盘价
        if self.dataclose < self.dataclose:
            # 前一日收盘价小于前前日收盘价
            if self.dataclose < self.dataclose:
                # 买买买
                self.log('BUY CREATE, %.2f' % self.dataclose)
                # 输出买入信号的日志信息
                self.buy()
                # 执行买入操作


# 创建cerebro实体
cerebro = bt.Cerebro()
# Cerebro是Backtrader的核心管理单元,负责管理数据、策略和运行回测

# 添加策略
cerebro.addstrategy(TestStrategy)
# 将自定义的TestStrategy策略添加到Cerebro中

# 先找到脚本的位置,然后根据脚本与数据的相对路径关系找到数据位置
# 这样脚本从任意地方被调用,都可以正确地访问到数据
modpath = os.path.dirname(os.path.abspath(sys.argv))
# 获取当前脚本的绝对路径
datapath = os.path.join(modpath, '../../TQDat/day/stk/000001.csv')
# 根据脚本路径和相对路径构建数据文件的完整路径

# 创建价格数据
data = bt.feeds.GenericCSVData(
        dataname = datapath,
        # 指定数据文件的路径
        fromdate = datetime.datetime(2024, 1, 1),
        # 数据的起始日期
        todate = datetime.datetime(2025, 1, 10),
        # 数据的结束日期
        nullvalue = 0.0,
        # 当数据缺失时用0.0填充
        dtformat = ('%Y-%m-%d'),
        # 日期的格式
        datetime = 0,
        # 日期所在的列索引
        open = 1,
        # 开盘价所在的列索引
        high = 2,
        # 最高价所在的列索引
        low = 3,
        # 最低价所在的列索引
        close = 4,
        # 收盘价所在的列索引
        volume = 5,
        # 成交量所在的列索引
        openinterest = -1
        # 持仓量所在的列索引,-1表示不使用该数据
        )
# 在Cerebro中添加价格数据
cerebro.adddata(data)
# 将创建好的数据源添加到Cerebro中

# 设置启动资金
cerebro.broker.setcash(100000.0)
# 将经纪人的初始资金设置为10万

# 打印开始信息
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
# 输出回测开始时投资组合的价值

# 遍历所有数据
cerebro.run()
# 运行回测流程,Cerebro会根据添加的数据和策略进行回测

# 打印最后结果
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
# 输出回测结束后投资组合的价值
发布于 2025-06-02 21:08
收藏
1
上一篇:ETF哪家强?军工板块实力大比拼 下一篇:北交所交易门槛揭秘,为何必须50万以上资金才能开通交易权限?