失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Tushare + Backtrader实现双均线策略 以工商银行为例

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

时间:2020-11-28 01:54:02

相关推荐

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

参看文章:

Welcome - Backtrader

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

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

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

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

#!/usr/bin/python3.5import tushare as tsimport datetimeimport pandas as pdend_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='0701', 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_datestr 交易日期open float开盘价high float最高价low float最低价close float收盘价pre_closefloat昨收价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 pdimport numpy as npimport 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 == pleted: #完全执行if order.isbuy():self.log("buy result : buy_price : {} , buy_cost : {} , commission : {}".format(order.executed.price,order.executed.value,m))else: # Sellself.log("sell result : sell_price : {} , sell_cost : {} , commission : {}".format(order.executed.price,order.executed.value,m))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))# 添加cerebrocerebro = bt.Cerebro()# 添加策略cerebro.addstrategy(SmaStrategy)# 准备数据 params = dict(fromdate = datetime.datetime(,10,27),todate = datetime.datetime(,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实现双均线策略 以工商银行为例》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。