日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

backtrader2

發布時間:2023/12/19 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 backtrader2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

backtrader的基本策略構成:

#構成 #Backtrader 回測代碼編寫流程如下: import backtrader as bt # 導入 Backtrader import backtrader.indicators as btind # 導入策略分析模塊 import backtrader.feeds as btfeeds # 導入數據模塊# 創建策略 class TestStrategy(bt.Strategy):# 可選,設置回測的可變參數:如移動均線的周期params = ((...,...), # 最后一個“,”最好別刪!)def log(self, txt, dt=None):'''可選,構建策略打印日志的函數:可用于打印訂單記錄或交易記錄等'''dt = dt or self.datas[0].datetime.date(0)print('%s, %s' % (dt.isoformat(), txt))def __init__(self):'''必選,初始化屬性、計算指標等'''passdef notify_order(self, order):'''可選,打印訂單信息'''passdef notify_trade(self, trade):'''可選,打印交易信息'''passdef next(self):'''必選,編寫交易策略邏輯'''sma = btind.SimpleMovingAverage(...) # 計算均線pass# 實例化 cerebro cerebro = bt.Cerebro() # 通過 feeds 讀取數據 data = btfeeds.BacktraderCSVData(...) # 將數據傳遞給 “大腦” cerebro.adddata(data) # 通過經紀商設置初始資金 cerebro.broker.setcash(...) # 設置單筆交易的數量 cerebro.addsizer(...) # 設置交易傭金 cerebro.broker.setcommission(...) # 添加策略 cerebro.addstrategy(TestStrategy) # 添加策略分析指標 cerebro.addanalyzer(...) # 添加觀測器 cerebro.addobserver(...) # 啟動回測 cerebro.run() # 可視化回測結果 cerebro.plot()

數據傳入必須包含的字段:

datetime sec_code open high low close volume openinterest 0 2019-01-02 600466.SH 33.064891 33.496709 31.954503 32.386321 10629352 0 1 2019-01-02 603228.SH 50.660230 51.458513 50.394136 51.120778 426147 0

3、導入 backtrader,構建“大腦”

import backtrader as bt # 導入 Backtrader # 實例化 cerebro cerebro = bt.Cerebro()

獲取當前資金

cerebro.broker.getvalue()

4、如何導入多只股票的歷史行情數據?

# 按股票代碼,依次循環傳入數據 for stock in daily_price['sec_code'].unique():# 日期對齊data = pd.DataFrame(index=daily_price.index.unique()) # 獲取回測區間內所有交易日df = daily_price.query(f"sec_code=='{stock}'")[['open','high','low','close','volume','openinterest']]data_ = pd.merge(data, df, left_index=True, right_index=True, how='left')# 缺失值處理:日期對齊時會使得有些交易日的數據為空,所以需要對缺失數據進行填充data_.loc[:,['volume','openinterest']] = data_.loc[:,['volume','openinterest']].fillna(0)data_.loc[:,['open','high','low','close']] = data_.loc[:,['open','high','low','close']].fillna(method='pad')data_.loc[:,['open','high','low','close']] = data_.loc[:,['open','high','low','close']].fillna(0)# 導入數據datafeed = bt.feeds.PandasData(dataname=data_, fromdate=datetime.datetime(2019,1,2), todate=datetime.datetime(2021,1,28))cerebro.adddata(datafeed, name=stock) # 通過 name 實現數據集與股票的一一對應print(f"{stock} Done !")

5、配置回測條件(手續費,滑點,初始資金)

# 初始資金 100,000,000 cerebro.broker.setcash(100000000.0) # 傭金,雙邊各 0.0003 cerebro.broker.setcommission(commission=0.0003) # 滑點:雙邊各 0.0001 cerebro.broker.set_slippage_perc(perc=0.0001)

6、查看指標

cerebro.addanalyzer(bt.analyzers.TimeReturn, _name='pnl') # 返回收益率時序數據 cerebro.addanalyzer(bt.analyzers.AnnualReturn, _name='_AnnualReturn') # 年化收益率 cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='_SharpeRatio') # 夏普比率 cerebro.addanalyzer(bt.analyzers.DrawDown, _name='_DrawDown') # 回撤

7、交易代碼

self.close() 平倉; self.buy() 買入、做多; self.sell() 賣出、做空; self.cancel() 取消訂單; self.order_target_percent() 按持倉百分比下單,“多退少補”原則, 對于股票當前無持倉或持有的是多單(size>=0)的情況,若目標占比 target > 當前持倉占比,買入不夠的部分;若目標占比 target < 當前持倉占比,賣出多余的部分。

8、打印回測日志

def notify_order(self, order):# 未被處理的訂單if order.status in [order.Submitted, order.Accepted]:return# 已經處理的訂單if order.status in [order.Completed, order.Canceled, order.Margin]:if order.isbuy():self.log('BUY EXECUTED, ref:%.0f,Price: %.2f, Cost: %.2f, Comm %.2f, Size: %.2f, Stock: %s' %(order.ref, # 訂單編號order.executed.price, # 成交價order.executed.value, # 成交額order.executed.comm, # 傭金order.executed.size, # 成交量order.data._name)) # 股票名稱else: # Sellself.log('SELL EXECUTED, ref:%.0f, Price: %.2f, Cost: %.2f, Comm %.2f, Size: %.2f, Stock: %s' %(order.ref,order.executed.price,order.executed.value,order.executed.comm,order.executed.size,order.data._name))

9、打印回測結果

# 啟動回測 result = cerebro.run() # 從返回的 result 中提取回測結果 strat = result[0] # 返回日度收益率序列 daily_return = pd.Series(strat.analyzers.pnl.get_analysis()) # 打印評價指標 print("--------------- AnnualReturn -----------------") print(strat.analyzers._AnnualReturn.get_analysis()) print("--------------- SharpeRatio -----------------") print(strat.analyzers._SharpeRatio.get_analysis()) print("--------------- DrawDown -----------------") print(strat.analyzers._DrawDown.get_analysis())

總結

以上是生活随笔為你收集整理的backtrader2的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。