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

参看文章:

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数据整理成回测需要的格式,因为我希望回测的数据是干净的

Tushare + Backtrader实现双均线策略 以工商银行为例_第1张图片

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

#!/usr/bin/python3.5
# -*- coding: gbk -*- 
import pandas as pd
import numpy as np
import backtrader as bt 
import datetime

class 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]}")
        # 得到当前的size
        size = self.getposition(self.datas[0]).size   #getposition(或者使用position属性)返回当前的持仓状态
        # 做多
        if size==0 and self.short_ma[-1]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]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实现双均线策略 以工商银行为例_第2张图片

 

你可能感兴趣的:(python,python,backtrader)