使用tushare数据进行backtrader回测
????????tushare是很方便的數(shù)據(jù)獲取平臺,提供多種金融數(shù)據(jù),近乎包含了普通金融數(shù)據(jù)庫中的所有數(shù)據(jù),供一般學(xué)習(xí)研究使用足以。通過python接口,可以直接訪問數(shù)據(jù),無需下載,十分便捷。本人也在學(xué)校課程中初次了解到了tushare,并注冊了tushare賬號ID:455337。
數(shù)據(jù)獲取
???????? 使用策略進(jìn)行時,需要加數(shù)據(jù)到backtrader中,backer支持csv數(shù)據(jù),默認(rèn)為來自yahoofinance的數(shù)據(jù),但最常用的還是使用自己的csv數(shù)據(jù)。這時使用tushare進(jìn)行數(shù)據(jù)獲取就很方便了。
1.連接tushare接口:這里使用的是新版的tushare pro接口,注冊賬戶后可在個人主頁獲取token
import tushare as ts TOKEN = '****' pro = ts.pro_api(token=TOKEN)2.這里我已經(jīng)進(jìn)行了股票alpha的計算,令alpha最小的十只股票作為資產(chǎn)組合,將他們的股票代碼記錄到code中。
#讀取選股的結(jié)果 df=pd.read_csv('stock_alpha.csv') df.columns=['ts_code','name','alpha'] min_a=df.sort_values(by='alpha') min_a=min_a.iloc[:10,:] code=[] code=min_a['ts_code']#記錄alpha最小的10支股票代碼3.定義用tushare讀取數(shù)據(jù)的函數(shù):使用pro.daily()獲取股票日數(shù)據(jù)
def ts_get_daily_stock(code,start_dt,end_dt):data = pro.daily(ts_code = code,start_date = start_dt,end_date=end_dt)data['trade_date'] = pd.to_datetime(data['trade_date'])data=data.sort_values(by = 'trade_date')data.index = data['trade_date']data = data[['ts_code', 'open', 'high', 'low', 'close', 'pre_close', 'change', 'pct_chg', 'vol', 'amount']]return data?4.簡單的循環(huán)獲取并保存數(shù)據(jù)
for i in range(len(code)):data=ts_get_daily_stock(code.iloc[i],'20190101','')#字段分別為股票代碼、開始日期、結(jié)束日期data.to_csv(code.iloc[i]+'.csv') cerebro = bt.Cerebro() for i in range(len(code)):#循環(huán)獲取10支股票歷史數(shù)據(jù)data = bt.feeds.GenericCSVData(dataname=code.iloc[i]+'.csv',fromdate=datetime.datetime(2019, 1, 1),todate=datetime.datetime(2021, 7, 15),dtformat='%Y-%m-%d',datetime=0,#定義trade_date在第0列open=2,high=3,low=4,close=5,volume=9,nullvalue=0.0,#設(shè)置空值)cerebro.adddata(data)使用策略對數(shù)據(jù)進(jìn)行回測
????????使用的策略基本思路為:對股票30日的收益率并進(jìn)行排序,選擇前5只股票,如果某只個股滿足股價位于10均線以上且沒有持倉時買入;如果某只個股已持倉但判斷不在選股池中或股價位于10均線以下則賣出。
策略非原創(chuàng),只做了微小調(diào)整,代碼詳情來源于https://blog.csdn.net/ndhtou222/article/details/106416802
加載數(shù)據(jù),進(jìn)行回測
cerebro = bt.Cerebro() for i in range(len(code)):#循環(huán)獲取10支股票歷史數(shù)據(jù)data = bt.feeds.GenericCSVData(dataname=code.iloc[i]+'.csv',fromdate=datetime.datetime(2019, 1, 1),todate=datetime.datetime(2021, 7, 15),dtformat='%Y-%m-%d',datetime=0,#定義trade_date在第0列open=2,high=3,low=4,close=5,volume=9,nullvalue=0.0,#設(shè)置空值)cerebro.adddata(data)#回測設(shè)置 startcash=100000.0 cerebro.broker.setcash(startcash) # 設(shè)置傭金為千分之一 cerebro.broker.setcommission(commission=0.001)# 添加策略 cerebro.addstrategy(MyStrategy,printlog=True) cerebro.run() #獲取回測結(jié)束后的總資金 portvalue = cerebro.broker.getvalue() pnl = portvalue - startcash #打印結(jié)果 print(f'總資金: {round(portvalue,2)}') print(f'凈收益: {round(pnl,2)}')?
總結(jié)
以上是生活随笔為你收集整理的使用tushare数据进行backtrader回测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows Phone 7 开发积累
- 下一篇: github客户端从gitLab下拉取代