参看文章:
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 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()
输出结果,运行良好