参看文章:

Welcome - Backtrader

6、如何用backtrader实现双均线策略?以工商银行为例_云金杞-CSDN博客

Python量化交易学习笔记(53)——backtrader的一些基本概念1_码农甲的博客-CSDN博客

看了大佬的专栏文章,迫不及待试手一把,因为我一直使用tushare获取数据,现在使用tushare数据做双均线策略

1.tushare获取工商银行数据:

#!/usr/bin/python3.5
import tushare as ts
import datetime
import pandas as pd
end_date = (str)(datetime.date.today()).replace('-','')
start_date_365 = (str)(datetime.date.today()-datetime.timedelta(days=365)).replace('-','')
start_date_200 = (str)(datetime.date.today()-datetime.timedelta(days=200)).replace('-','')
start_date_150 = (str)(datetime.date.today()-datetime.timedelta(days=150)).replace('-','')
start_date_50 = (str)(datetime.date.today()-datetime.timedelta(days=50)).replace('-','')
print(end_date,start_date_50,start_date_150,start_date_200,start_date_365)ts.set_token('你自己的token') #设置token
#pro = ts.pro_api(token)
pro = ts.pro_api()
data = pro.daily(ts_code='601398.SH', start_date='20180701', end_date=end_date)
print(data)
del data['ts_code']  # 删除键是'Name'的条目
del data['pre_close']
del data['change']
del data['pct_chg']
data.rename(columns={'trade_date':'datetime', 'vol':'volume', 'amount':'openinterest'}, inplace = True)
#data["datetime"] = data.pop("trade_date")
print(data)
'''
tushare格式
ts_code     str     股票代码
trade_date  str     交易日期
open        float   开盘价
high        float   最高价
low         float   最低价
close       float   收盘价
pre_close   float   昨收价
change      float   涨跌额
pct_chg     float   涨跌幅 (未复权,如果是复权请用 通用行情接口 )
vol         float   成交量 (手)
amount      float   成交额 (千元)回测格式
日期        datetime
开盘价      open
最高价      high
最低价      low
收盘价      close
成交量      volume
成交金额    openinterest
'''
data.to_csv('{}_工商银行.csv'.format('601398'),sep='\t',index=False)

在这里先把tushare数据整理成回测需要的格式,因为我希望回测的数据是干净的

2.backtrader回测,在这里基本参考的专栏内容,加了一些自己的理解,因为数据格式已经匹配好,只专注策略就可以

#!/usr/bin/python3.5
# -*- coding: gbk -*-
import pandas as pd
import numpy as np
import backtrader as bt
import datetimeclass SmaStrategy(bt.Strategy):# params = (('short_window',10),('long_window',60))params = {"short_window":10,"long_window":60}#设置周期def log(self, txt, dt=None):''' log信息的功能'''dt = dt or self.datas[0].datetime.date(0)print('%s, %s' % (dt.isoformat(), txt))def __init__(self):# 一般用于计算指标或者预先加载数据,定义变量使用self.short_ma = bt.indicators.SMA(self.datas[0].close,period=self.p.short_window) #period =短线周期self.long_ma = bt.indicators.SMA(self.datas[0].close,period=self.p.long_window)#period =长线周期def next(self):#具体的策略逻辑在这里实现,每个周期都会被调用一次,用于处理当前时刻的K线# Simply log the closing price of the series from the reference# self.log(f"工商银行,{self.datas[0].datetime.date(0)},收盘价为:{self.datas[0].close[0]}")# self.log(f"short_ma:{self.short_ma[0]},long_ma:{self.long_ma[0]}")# 得到当前的sizesize = self.getposition(self.datas[0]).size   #getposition(或者使用position属性)返回当前的持仓状态# 做多if size==0 and self.short_ma[-1]<self.long_ma[-1] and self.short_ma[0]>self.long_ma[0] :#未持仓,而且短均线上行交于长均线(金叉):买入# 开仓self.order_target_value(self.datas[0], target=50000)# 平多if size>0 and self.short_ma[-1]>self.long_ma[-1] and self.short_ma[0]<self.long_ma[0]: #持仓,而且短均线行交于长均线(金叉):卖出(平仓)self.close(self.datas[0])def notify_order(self, order): #当有订单被提交、执行、取消、改变时被调用。当在Strategy中使用buy/sell提交订单后,会返回订单的引用;当订单状态有变化时就会通过notify_order告知Strategy,这样就可以通过判断订单的状态来实现避免重复下单等逻辑。if order.status in [order.Submitted, order.Accepted]:# order被提交和接受returnif order.status == order.Rejected:#被经纪人拒绝self.log("order is rejected : order_ref:{order.ref}  order_info:{order.info}")if order.status == order.Margin: # 没有足够的现金来执行订单。.self.log("order need more margin : order_ref:{order.ref}  order_info:{order.info}")if order.status == order.Cancelled:#被用户取消self.log("order is concelled : order_ref:{order.ref}  order_info:{order.info}")if order.status == order.Partial:# 部分执行self.log("order is partial : order_ref:{order.ref}  order_info:{order.info}")# Check if an order has been completed# Attention: broker could reject order if not enougth cashif order.status == order.Completed: #完全执行if order.isbuy():self.log("buy result : buy_price : {} , buy_cost : {} , commission : {}".format(order.executed.price,order.executed.value,order.executed.comm))else:  # Sellself.log("sell result : sell_price : {} , sell_cost : {} , commission : {}".format(order.executed.price,order.executed.value,order.executed.comm))def notify_trade(self, trade):#任何开仓/更新/平仓交易获得通知# 一个trade结束的时候输出信息if trade.isclosed:self.log('closed symbol is : {} , total_profit : {} , net_profit : {}' .format(trade.getdataname(),trade.pnl, trade.pnlcomm))if trade.isopen:self.log('open symbol is : {} , price : {} ' .format(trade.getdataname(),trade.price))# 添加cerebro
cerebro = bt.Cerebro()
# 添加策略
cerebro.addstrategy(SmaStrategy)
# 准备数据
params = dict(fromdate = datetime.datetime(2006,10,27),todate = datetime.datetime(2020,8,14),timeframe = bt.TimeFrame.Days,compression = 1,#dtformat=('%Y-%m-%d %H:%M:%S'),# tmformat=('%H:%M:%S'),datetime=0,high=2,low=3,open=1,close=4,volume=5,openinterest=6)
# 数据的地址,使用自己的数据地址
data_path = '601398_工商银行.csv'
df = pd.read_csv(data_path,sep='\t',dtype=object,engine='python')#dtype=object 解决0缺失  \s解决切片
#df =df[['日期','开盘价','最高价','最低价','收盘价','成交量','成交金额']]
#df.columns = ['datetime','open','high','low','close','volume','openinterest']
df = df.sort_values("datetime")
df["open"] = df["open"].astype('float')
df["close"] = df["close"].astype('float')
df["low"] = df["low"].astype('float')
df["high"] = df["high"].astype('float')
df["volume"] = df["volume"].astype('float')
df["openinterest"] = df["openinterest"].astype('float')
df = df[df['close']>0] # 新添加
df = df[df['open']>0]  # 新添加
print(df)
df.index=pd.to_datetime(df['datetime'])
df=df[['open','high','low','close','volume','openinterest']]
feed =  bt.feeds.PandasDirectData(dataname=df,**params)
# 添加合约数据
cerebro.adddata(feed, name = "gsyh")
cerebro.broker.setcommission(commission=0.0005)# 添加资金
cerebro.broker.setcash(100000.0)# 开始运行
cerebro.run()# 打印相关信息
cerebro.plot()

输出结果,运行良好

Tushare + Backtrader实现双均线策略 以工商银行为例相关推荐

  1. 6、如何用backtrader实现双均线策略?以工商银行为例

    在第五讲中,我们配置好了backtrader的运行,在这一讲中,我将会和一步步分享下,如何使用backtrader,验证下双均线交易策略(均线金叉做多,均线死叉做空)在工商银行上的表现. 一.交易策略 ...

  2. 量化策略初探——使用tushare进行沪深300ETF双均线策略

    使用tushare采集沪深300ETF数据,并对沪深300ETF采用简单移动平均.指数移动平均.进行双均线策略,最后使用backtrader进行回测. 一.基本概念 双均线策略:运用两条不同周期的移动 ...

  3. Python双均线策略回测(2021-10-12)

    Python双均线策略回测 1.择时策略简介 根据百度百科的解释,择时交易是指利用某种方法来判断大势的走势情况,是上涨还是下跌或者是盘整.如果判断是上涨,则买入持有:如果判断是下跌,则卖出清仓,如果是 ...

  4. Python数据分析之股票双均线策略制定

    Python数据分析之股票双均线策略制定 需求:双均线策略制定 库 tushare包 预处理数据 df = pd.read_csv('./maotai.csv').drop(labels='Unnam ...

  5. 利用双均线策略计算中国平安股票收益

    一.知识储备 Hello,各位小伙伴们,本篇博文给大家带来的是利用双均线策略,对中国平安601318股票进行炒股,所能获得的大概收益.为了你能正确理解本文的知识,需要你提前做以下准备... pytho ...

  6. Python量化交易02——双均线策略(移动平均线)

    参考书目:深入浅出Python量化交易实战 本次带来最经典的交易策略,双均线策略的构建和其回测方法. 双均线一般采用5天均值和10天均值,如果5日均线上穿突破了10日均线,说明股价在最近的涨势很猛,买 ...

  7. SMA、EMA与双均线策略

    什么是MA MA是移动平均线(Moving Average)的缩写,是一种简单的技术分析工具,通过创建一个不断更新的平均价格来分析股票价格趋势,或者用来确定其支撑和阻力水平.这是一种滞后指标,因为它基 ...

  8. 量化双均线策略:(二)判断买入卖出信号

    上篇已经介绍了data的获取,此篇介绍ma5与ma10的双均线策略具体实现.双均线策略是一个趋势策略,基本思路是金叉买入,死叉卖出,也就是当ma5向上穿过ma10时,则买入,向下穿过ma10时,则卖出 ...

  9. 双均线策略构建及回测

    # python构建双均线策略 # 均线策略中最常见的一种方法是根据长期均线和短期均线的交叉情况来确定交易信号,即:当短期均线从下往上穿越长期均线时,形成金叉,做多: # 反之,当长期均线从上往下穿越 ...

最新文章

  1. bzoj 2565: 最长双回文串 manacher算法
  2. 计算机主机的灯一直闪,电脑硬盘灯一直闪怎么办|电脑硬盘灯狂闪的解决方法...
  3. (笔试题)将数组分成两组,使两组的和的差的绝对值最小
  4. MRI炎症和结构损伤指标对TNF拮抗剂治疗AS患者获持续缓解的预测价值
  5. git 生成多个patch_如何用git命令生成Patch和打Patch
  6. 人生历练必备的十个心态(图)
  7. 我们和全球的朋友一起回家
  8. c 服务器二次验证码,V5验证官网 - 基础套餐免费 -滑块验证,行为验证,防刷验证 - 文档...
  9. mysql 视图 mybatis_Mybatis调用视图和存储过程的方法
  10. 目标检测——YOLOV3的学习笔记
  11. JS实现定时弹出广告
  12. nohup方式 真正的后台不挂断运行程序
  13. 2020年尾矿考试技巧及尾矿考试平台
  14. Python 正则表达式_re模块_使用compile加速
  15. 计算机怎么取消用户密码,怎么取消电脑开机密码界面
  16. (九)DFI接口时序
  17. 2022 iapp 小易工具箱源码
  18. 平凡的世界 田晓霞的日记 摘抄
  19. DBCS(Double-Byte Character Set, 双位元组字元集)
  20. Ubuntu18.04 没有有以太网连接的解决办法

热门文章

  1. Odoo产品分析 (三) -- 人力资源板块(6) -- 工资表(1)
  2. 软考高项 ——【项目风险管理】
  3. 根据邮箱地址怎么知道服务器,如何通过技术手段判断邮件地址来源
  4. 事件冒泡和事件捕获的区别
  5. 夏普电视能用鸿蒙吗,夏普电视怎么安装第三方软件,看电视直播教程
  6. 中科院用不起的知网,一年主营业务收入11.6亿元,毛利率高过工商银行
  7. loadrunner的TPS和点击率HPS
  8. Mac将运行iPhone和iPad应用程序:这是运行方式
  9. 第一章:1-03、试从多个方面比较电路交换、报文交换和分组交换的主要优缺点。...
  10. SSI通信C语言编程,SSI协议应用和编程.ppt