Tushare + Backtrader实现双均线策略 以工商银行为例
生活随笔
收集整理的這篇文章主要介紹了
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數據整理成回測需要的格式,因為我希望回測的數據是干凈的
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实现双均线策略 以工商银行为例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言之整数类型
- 下一篇: skywii 新浪微博桌面wpf客户端已