欢迎大家来到IT世界,在知识的湖畔探索吧!
利用 backtrader 库实现了一个量化交易策略的回测系统。具体步骤为:
- 环境准备:导入所需的 Python 模块,包括 backtrader、matplotlib 等,并将自定义模块路径添加到系统搜索路径。
- 策略定义:创建自定义策略类 TQSta001,采用 “三连跌” 策略进行买入操作,买入后 5 个周期进行卖出操作。同时,记录订单状态、成交价格、佣金费用以及交易利润。
- 回测设置:创建 Cerebro 对象,设置初始资金、数据文件、回测时间范围、策略参数和经纪人佣金。
- 回测执行:调用 Cerebro 的 run 方法执行回测,并输出回测过程中的详细信息,包括订单执行情况、交易利润等。
- 结果展示:计算并打印起始资金、最终资产总值和投资回报率,最后绘制回测结果的图形,方便用户直观分析策略表现。
# -*- coding: utf-8 -*- ''' TopQuant-TQ极宽智能量化回溯分析系统 培训课件系列 2019版 Top极宽量化(原zw量化),Python量化第一品牌 by Top极宽·量化开源团队 2019.01.011 首发 网站: www.TopQuant.vip www.ziwang.com : Top极宽量化总群, ''' # 指定文件编码为 UTF-8,同时给出代码的相关说明,包括系统名称、版本、首发时间、网站和等信息。 import sys; sys.path.append("topqt/") # 导入sys模块,用于和Python解释器进行交互。 # 将"topqt/"目录添加到模块搜索路径,以便后续导入该目录下的模块。 import matplotlib as mpl import matplotlib.pyplot as plt # 导入matplotlib库,mpl用于设置绘图的全局参数,plt用于绘制图形。 import os,time,arrow,math,random,pytz import datetime as dt # 导入多个常用模块: # os用于操作系统相关操作,如文件和目录处理。 # time用于处理时间相关操作。 # arrow是处理日期和时间的库,提供更简洁的API。 # math提供数学运算函数。 # random用于生成随机数。 # pytz用于处理时区问题。 # 将datetime模块重命名为dt,方便后续使用。 import backtrader as bt import topquant2019 as tq # 导入backtrader库,用于量化交易策略的回测。 # 导入topquant2019模块,可能是自定义的量化分析工具库。 #---------------------- #---------------------- # 创建一个自定义策略类class class TQSta001(bt.Strategy): def log(self, txt, dt=None): # log记录函数,用于记录交易信息。 # txt是要记录的文本信息,dt是日期,默认为None。 dt = dt or self.datas[0].datetime.date(0) # 如果dt为None,则使用当前数据的日期。 print('%s, %s' % (dt.isoformat(), txt)) # 以ISO格式输出日期和文本信息。 def __init__(self): # 策略类的初始化方法,在策略实例创建时调用。 # 默认数据,一般使用股票池当中,下标为0的股票, # 通常使用close收盘价,作为主要分析数据字段 self.dataclose = self.datas[0].close # 保存第一个数据的收盘价,方便后续使用。 # 跟踪track交易中的订单(pending orders),成交价格,佣金费用 self.order = None # 初始化订单变量,用于跟踪当前未完成的订单。 self.buyprice = None # 初始化买入价格变量。 self.buycomm = None # 初始化买入佣金变量。 def notify_order(self, order): # 订单状态通知函数,当订单状态发生变化时调用。 if order.status in [order.Submitted, order.Accepted]: # 检查订单执行状态order.status: # Buy/Sell order submitted/accepted to/by broker # broker经纪人:submitted提交/accepted接受,Buy买单/Sell卖单 # 正常流程,无需额外操作 return # 如果订单处于提交或接受状态,不做额外处理。 # 检查订单order是否完成 # 注意: 如果现金不足,经纪人broker会拒绝订单reject order # 可以修改相关参数,调整进行空头交易 if order.status in [order.Completed]: if order.isbuy(): self.log('买单执行BUY EXECUTED,成交价: %.2f,小计 Cost: %.2f,佣金 Comm %.2f' % (order.executed.price, order.executed.value, order.executed.comm)) # 如果是买单完成,记录买单执行信息,包括成交价、小计和佣金。 self.buyprice = order.executed.price # 更新买入价格。 self.buycomm = order.executed.comm # 更新买入佣金。 elif order.issell(): self.log('卖单执行SELL EXECUTED,成交价: %.2f,小计 Cost: %.2f,佣金 Comm %.2f' % (order.executed.price, order.executed.value, order.executed.comm)) # 如果是卖单完成,记录卖单执行信息,包括成交价、小计和佣金。 self.bar_executed = len(self) # 记录订单执行时的bar数量。 elif order.status in [order.Canceled, order.Margin, order.Rejected]: self.log('订单Order: 取消Canceled/保证金Margin/拒绝Rejected') # 如果订单被取消、因保证金不足或被拒绝,记录相关信息。 # 检查完成,没有交易中订单(pending order) self.order = None # 订单处理完成后,将订单变量置为None。 def notify_trade(self, trade): # 交易状态通知函数,当交易状态发生变化时调用。 # 检查交易trade是否关闭 if not trade.isclosed: return # 如果交易未关闭,不做额外处理。 self.log('交易利润OPERATION PROFIT, 毛利GROSS %.2f, 净利NET %.2f' % (trade.pnl, trade.pnlcomm)) # 如果交易关闭,记录交易的毛利和净利。 def next(self): # next函数是最重要的trade交易(运算分析)函数, # 调用log函数,输出BT回溯过程当中,工作节点数据包BAR,对应的close收盘价 self.log('收盘价Close, %.2f' % self.dataclose[0]) # 记录当前的收盘价。 # 检查订单执行情况,默认每次只能执行一张order订单交易,可以修改相关参数,进行调整 if self.order: return # 如果有未完成的订单,不进行新的交易操作。 # 检查当前股票的仓位position if not self.position: # 如果该股票仓位为0 ,可以进行BUY买入操作, # 这个仓位设置模式,也可以修改相关参数,进行调整 # 使用经典的"三连跌"买入策略 if self.dataclose[0] < self.dataclose[-1]: # 当前close价格,低于昨天(前一天,[-1]) if self.dataclose[-1] < self.dataclose-2: close-1-2 : buy buy buy self.log buy create .2f self.dataclose0 trackorder2nd order self.order='self.buy()' else:>0 ,可以进行SELL卖出操作, # 这个仓位设置模式,也可以修改相关参数,进行调整 # 此处使用经验参数: # 前个订单,执行完成(bar_executed),5个周期后 # 才能进行SELL卖出操作 # 这个SELL卖出操作模式,也可以修改相关参数,进行调整 if len(self) >= (self.bar_executed + 5): # SELL, SELL, SELL!!! 卖!卖!卖! # 默认卖出该股票全部数额,使用默认参数交易:数量、佣金等 self.log('设置卖单SELL CREATE, %.2f' % self.dataclose[0]) # 记录设置卖单的信息和当前价格。 # 采用track模式,设置order订单,回避第二张订单2nd order,连续交易问题 self.order = self.sell() # 发出卖出订单,并更新订单变量。 #---- print('\n#1,设置BT量化回溯程序入口') cerebro = bt.Cerebro() # 打印提示信息,表明开始设置量化回溯程序的入口。 # 创建Cerebro对象,它是backtrader的核心对象,用于管理整个回测过程。 print('\n#2,设置BT回溯初始参数:起始资金等') dmoney0 = .0 cerebro.broker.setcash(dmoney0) dcash0 = cerebro.broker.startingcash # 打印提示信息,表明开始设置回溯的初始参数。 # 定义初始资金为.0。 # 设置经纪人的初始资金。 # 获取经纪人的起始资金并保存。 print('\n\t#2-2,设置数据文件,数据文件,需要按时间字段,正序排序') rs0 = 'data/stk/' xcod = '002046' fdat = rs0 + xcod + '.csv' print('\t@数据文件名:', fdat) # 打印提示信息,表明开始设置数据文件。 # 定义数据文件所在的目录。 # 定义股票代码。 # 拼接数据文件的完整路径。 # 打印数据文件名。 print('\t设置数据BT回溯运算:起始时间、结束时间') print('\t数据文件,可以是股票期货、外汇黄金、数字货币等交易数据') print('\t格式为:标准OHLC格式,可以是日线、分时数据。') t0str, t9str = '2018-01-01', '2018-12-31' data = tq.pools_get4fn(fdat, t0str, t9str) # 打印提示信息,表明设置数据回溯的起始时间和结束时间。 # 说明数据文件的类型和格式要求。 # 定义起始时间和结束时间。 # 调用tq.pools_get4fn函数,从数据文件中获取指定时间范围内的数据。 cerebro.adddata(data) # 将获取的数据添加到Cerebro对象中,用于回测。 print('\n\t#2-3,添加BT量化回溯程序,对应的策略参数') cerebro.addstrategy(TQSta001) # 打印提示信息,表明添加量化回溯程序的策略参数。 # 将自定义的策略类TQSta001添加到Cerebro对象中。 print('\n\t#2-4,添加broker经纪人佣金,默认为:千一') cerebro.broker.setcommission(commission=0.001) # 打印提示信息,表明设置经纪人佣金。 # 设置经纪人佣金为千分之一。 print('\n#3,调用BT回溯入口程序,开始执行run量化回溯运算') print('\t注意输出信息的变化,增加了佣金信息') cerebro.run() # 打印提示信息,表明开始执行量化回溯运算。 # 提醒注意输出信息中增加了佣金信息。 # 调用Cerebro对象的run方法,开始回测。 print('\n#4,完成BT量化回溯运算') dval9 = cerebro.broker.getvalue() kret = (dval9 - dcash0) / dcash0 * 100 # 最终投资组合价值 print('\t起始资金 Starting Portfolio Value: %.2f' % dcash0) print('\t资产总值 Final Portfolio Value: %.2f' % dval9) print('\tROI投资回报率 Return on investment: %.2f %%' % kret) # 打印提示信息,表明回测完成。 # 获取经纪人的最终资产总值。 # 计算投资回报率。 # 打印起始资金、最终资产总值和投资回报率。 print('\n#9,绘制BT量化分析图形') print('\t注意图形当中,最上面的的cash现金,value资产曲线') print('\t注意图形当中的买点图标') cerebro.plot() # 打印提示信息,表明开始绘制量化分析图形。 # 提醒注意图形中的现金、资产曲线和买点图标。 # 调用Cerebro对象的plot方法,绘制回测结果的图形。 print('\nzok') # 打印提示信息,表明程序执行完毕。
欢迎大家来到IT世界,在知识的湖畔探索吧!
欢迎大家来到IT世界,在知识的湖畔探索吧!#1,设置BT量化回溯程序入口 #2,设置BT回溯初始参数:起始资金等 #2-2,设置数据文件,数据文件,需要按时间字段,正序排序 @数据文件名: data/stk/002046.csv 设置数据BT回溯运算:起始时间、结束时间 数据文件,可以是股票期货、外汇黄金、数字货币等交易数据 格式为:标准OHLC格式,可以是日线、分时数据。 #2-3,添加BT量化回溯程序,对应的策略参数 #2-4,添加broker经纪人佣金,默认为:千一 #3,调用BT回溯入口程序,开始执行run量化回溯运算 注意输出信息的变化,增加了佣金信息 2018-10-08, 收盘价Close, 6.52 2018-10-09, 收盘价Close, 6.50 2018-10-10, 收盘价Close, 6.54 2018-10-11, 收盘价Close, 5.91 2018-10-12, 收盘价Close, 5.97 2018-10-15, 收盘价Close, 5.92 2018-10-16, 收盘价Close, 5.80 2018-10-16, 设置买单 BUY CREATE, 5.80 2018-10-17, 买单执行BUY EXECUTED,成交价: 5.90,小计 Cost: 5.90,佣金 Comm 0.01 2018-10-17, 收盘价Close, 5.88 2018-10-18, 收盘价Close, 5.67 2018-10-19, 收盘价Close, 5.77 2018-10-22, 收盘价Close, 6.02 2018-10-23, 收盘价Close, 5.88 2018-10-24, 收盘价Close, 6.10 2018-10-24, 设置卖单SELL CREATE, 6.10 2018-10-25, 卖单执行SELL EXECUTED,成交价: 5.88,小计 Cost: 5.90,佣金 Comm 0.01 2018-10-25, 交易利润OPERATION PROFIT, 毛利GROSS -0.02, 净利NET -0.03 2018-10-25, 收盘价Close, 6.07 2018-10-26, 收盘价Close, 6.05 2018-10-26, 设置买单 BUY CREATE, 6.05 2018-10-29, 买单执行BUY EXECUTED,成交价: 6.00,小计 Cost: 6.00,佣金 Comm 0.01 2018-10-29, 收盘价Close, 5.87 2018-10-30, 收盘价Close, 5.95 2018-10-31, 收盘价Close, 6.00 2018-11-01, 收盘价Close, 6.03 2018-11-02, 收盘价Close, 6.17 2018-11-05, 收盘价Close, 6.20 2018-11-05, 设置卖单SELL CREATE, 6.20 2018-11-06, 卖单执行SELL EXECUTED,成交价: 6.20,小计 Cost: 6.00,佣金 Comm 0.01 2018-11-06, 交易利润OPERATION PROFIT, 毛利GROSS 0.20, 净利NET 0.19 2018-11-06, 收盘价Close, 6.17 2018-11-07, 收盘价Close, 6.12 2018-11-07, 设置买单 BUY CREATE, 6.12 2018-11-08, 买单执行BUY EXECUTED,成交价: 6.17,小计 Cost: 6.17,佣金 Comm 0.01 2018-11-08, 收盘价Close, 6.15 2018-11-09, 收盘价Close, 6.15 2018-11-12, 收盘价Close, 6.29 2018-11-13, 收盘价Close, 6.43 2018-11-14, 收盘价Close, 6.36 2018-11-15, 收盘价Close, 6.49 2018-11-15, 设置卖单SELL CREATE, 6.49 2018-11-16, 卖单执行SELL EXECUTED,成交价: 6.49,小计 Cost: 6.17,佣金 Comm 0.01 2018-11-16, 交易利润OPERATION PROFIT, 毛利GROSS 0.32, 净利NET 0.31 2018-11-16, 收盘价Close, 6.54 2018-11-19, 收盘价Close, 6.68 2018-11-20, 收盘价Close, 6.38 2018-11-21, 收盘价Close, 6.48 2018-11-22, 收盘价Close, 6.53 2018-11-23, 收盘价Close, 6.30 2018-11-26, 收盘价Close, 6.40 2018-11-27, 收盘价Close, 6.38 2018-11-28, 收盘价Close, 6.47 2018-11-29, 收盘价Close, 6.26 2018-11-30, 收盘价Close, 6.27 2018-12-03, 收盘价Close, 6.90 2018-12-04, 收盘价Close, 7.02 2018-12-05, 收盘价Close, 6.84 2018-12-06, 收盘价Close, 6.90 2018-12-07, 收盘价Close, 7.59 2018-12-10, 收盘价Close, 7.06 2018-12-11, 收盘价Close, 7.15 2018-12-12, 收盘价Close, 7.06 2018-12-13, 收盘价Close, 7.36 2018-12-14, 收盘价Close, 6.95 2018-12-17, 收盘价Close, 6.98 2018-12-18, 收盘价Close, 6.78 2018-12-19, 收盘价Close, 6.56 2018-12-19, 设置买单 BUY CREATE, 6.56 2018-12-20, 买单执行BUY EXECUTED,成交价: 6.54,小计 Cost: 6.54,佣金 Comm 0.01 2018-12-20, 收盘价Close, 6.61 2018-12-21, 收盘价Close, 6.54 2018-12-24, 收盘价Close, 6.62 2018-12-25, 收盘价Close, 6.43 2018-12-26, 收盘价Close, 6.40 2018-12-27, 收盘价Close, 6.27 2018-12-27, 设置卖单SELL CREATE, 6.27 2018-12-28, 卖单执行SELL EXECUTED,成交价: 6.27,小计 Cost: 6.54,佣金 Comm 0.01 2018-12-28, 交易利润OPERATION PROFIT, 毛利GROSS -0.27, 净利NET -0.28 2018-12-28, 收盘价Close, 6.35 #4,完成BT量化回溯运算 起始资金 Starting Portfolio Value: .00 资产总值 Final Portfolio Value: .18 ROI投资回报率 Return on investment: 0.00 % #9,绘制BT量化分析图形 注意图形当中,最上面的的cash现金,value资产曲线 注意图形当中的买点图标
欢迎大家来到IT世界,在知识的湖畔探索吧!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/116039.html