backtrader指標

添加分析指標

# 添加分析指標
# 返回年初至年末的年度收益率
cerebro.addanalyzer(bt.analyzers.AnnualReturn, _name='_AnnualReturn')
# 計算最大回撤相關指標
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='_DrawDown')
# 計算年化收益:日度收益
cerebro.addanalyzer(bt.analyzers.Returns, _name='_Returns', tann=252)
# 計算年化夏普比率:日度收益
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='_SharpeRatio', timeframe=bt.TimeFrame.Days, annualize=True, riskfreerate=0) # 計算夏普比率
cerebro.addanalyzer(bt.analyzers.SharpeRatio_A, _name='_SharpeRatio_A')
# 返回收益率時序
cerebro.addanalyzer(bt.analyzers.TimeReturn, _name='_TimeReturn')
# 啟動回測
result = cerebro.run()# 提取結果
print("--------------- AnnualReturn -----------------")
print(result[0].analyzers._AnnualReturn.get_analysis())
print("--------------- DrawDown -----------------")
print(result[0].analyzers._DrawDown.get_analysis())
print("--------------- Returns -----------------")
print(result[0].analyzers._Returns.get_analysis())
print("--------------- SharpeRatio -----------------")
print(result[0].analyzers._SharpeRatio.get_analysis())
print("--------------- SharpeRatio_A -----------------")
print(result[0].analyzers._SharpeRatio_A.get_analysis())# 常用指標提取
analyzer = {}
# 提取年化收益
analyzer['年化收益率'] = result[0].analyzers._Returns.get_analysis()['rnorm']
analyzer['年化收益率(%)'] = result[0].analyzers._Returns.get_analysis()['rnorm100']
# 提取最大回撤
analyzer['最大回撤(%)'] = result[0].analyzers._DrawDown.get_analysis()['max']['drawdown'] * (-1)
# 提取夏普比率
analyzer['年化夏普比率'] = result[0].analyzers._SharpeRatio_A.get_analysis()['sharperatio']# 日度收益率序列
ret = pd.Series(result[0].analyzers._TimeReturn.get_analysis())

下面是在 Backtrader 社區中找到的自定義分析器,用于查看每筆交易盈虧情況:

地址:

https://community.backtrader.com/topic/1274/closed-trade-list-including-mfe-mae-analyzer;

該案例涉及到 trade 對象的相關屬性,具體可以參考官方文檔:https://www.backtrader.com/docu/trade/ 。

class trade_list(bt.Analyzer):def __init__(self):self.trades = []self.cumprofit = 0.0def notify_trade(self, trade):if trade.isclosed:brokervalue = self.strategy.broker.getvalue()dir = 'short'if trade.history[0].event.size > 0: dir = 'long'pricein = trade.history[len(trade.history)-1].status.pricepriceout = trade.history[len(trade.history)-1].event.pricedatein = bt.num2date(trade.history[0].status.dt)dateout = bt.num2date(trade.history[len(trade.history)-1].status.dt)if trade.data._timeframe >= bt.TimeFrame.Days:datein = datein.date()dateout = dateout.date()pcntchange = 100 * priceout / pricein - 100pnl = trade.history[len(trade.history)-1].status.pnlcommpnlpcnt = 100 * pnl / brokervaluebarlen = trade.history[len(trade.history)-1].status.barlenpbar = pnl / barlenself.cumprofit += pnlsize = value = 0.0for record in trade.history:if abs(size) < abs(record.status.size):size = record.status.sizevalue = record.status.valuehighest_in_trade = max(trade.data.high.get(ago=0, size=barlen+1))lowest_in_trade = min(trade.data.low.get(ago=0, size=barlen+1))hp = 100 * (highest_in_trade - pricein) / priceinlp = 100 * (lowest_in_trade - pricein) / priceinif dir == 'long':mfe = hpmae = lpif dir == 'short':mfe = -lpmae = -hpself.trades.append({'ref': trade.ref,'ticker': trade.data._name,'dir': dir,'datein': datein,'pricein': pricein,'dateout': dateout,'priceout': priceout,'chng%': round(pcntchange, 2),'pnl': pnl, 'pnl%': round(pnlpcnt, 2),'size': size,'value': value,'cumpnl': self.cumprofit,'nbars': barlen, 'pnl/bar': round(pbar, 2),'mfe%': round(mfe, 2), 'mae%': round(mae, 2)})def get_analysis(self):return self.trades# 添加自定義的分析指標
cerebro.addanalyzer(trade_list, _name='tradelist')# 啟動回測
result = cerebro.run(tradehistory=True)# 返回結果
ret = pd.DataFrame(result[0].analyzers.tradelist.get_analysis())

參數優化:

該功能只需通過 cerebro.optstrategy() 方法往大腦添加策略。

class TestStrategy(bt.Strategy):params=(('period1',5),('period2',10),) #全局設定均線周期......# 實例化大腦
cerebro1= bt.Cerebro(optdatas=True, optreturn=True)
# 設置初始資金
cerebro1.broker.set_cash(10000000)
# 加載數據
datafeed1 = bt.feeds.PandasData(dataname=data1, fromdate=datetime.datetime(2019,1,2), todate=datetime.datetime(2021,1,28))
cerebro1.adddata(datafeed1, name='600466.SH')# 添加優化器
cerebro1.optstrategy(TestStrategy, period1=range(5, 25, 5), period2=range(10, 41, 10))# 添加分析指標
# 返回年初至年末的年度收益率
cerebro1.addanalyzer(bt.analyzers.AnnualReturn, _name='_AnnualReturn')
# 計算最大回撤相關指標
cerebro1.addanalyzer(bt.analyzers.DrawDown, _name='_DrawDown')
# 計算年化收益
cerebro1.addanalyzer(bt.analyzers.Returns, _name='_Returns', tann=252)
# 計算年化夏普比率
cerebro1.addanalyzer(bt.analyzers.SharpeRatio_A, _name='_SharpeRatio_A')
# 返回收益率時序
cerebro1.addanalyzer(bt.analyzers.TimeReturn, _name='_TimeReturn')# 啟動回測
result = cerebro1.run()# 打印結果
def get_my_analyzer(result):analyzer = {}# 返回參數analyzer['period1'] = result.params.period1analyzer['period2'] = result.params.period2# 提取年化收益analyzer['年化收益率'] = result.analyzers._Returns.get_analysis()['rnorm']analyzer['年化收益率(%)'] = result.analyzers._Returns.get_analysis()['rnorm100']# 提取最大回撤(習慣用負的做大回撤,所以加了負號)analyzer['最大回撤(%)'] = result.analyzers._DrawDown.get_analysis()['max']['drawdown'] * (-1)# 提取夏普比率analyzer['年化夏普比率'] = result.analyzers._SharpeRatio_A.get_analysis()['sharperatio']return analyzerret = []
for i in result:ret.append(get_my_analyzer(i[0]))pd.DataFrame(ret)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449525.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449525.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449525.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Javascript DOM對屬性的操作

獲得屬性值 itnode . 屬性名稱          //只能操作w3c規定內容 itnode . getAttribute(屬性名稱)    //規定的 和 自定義的都可以獲取 設置屬性值 itnode . 屬性名稱 值        //只能操作w3c規定的屬性 itnode . setAttribute(名稱&#xff0c;值) …

172開頭的IP不一定是局域網的地址

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 A類 10.0.0.0-10.255.255.255 網絡數&#xff1a;1B類 172.16.0.0-172.31.255.255 網絡數&#xff1a;16C類 192.168.0.0-192.168.255.…

微信屏蔽百度紅包活動頁面,誰在焦慮?

1月29日消息&#xff0c;百度與中央電視臺合作的百度紅包鏈接分享頁面被微信屏蔽&#xff0c;打開相關頁面顯示&#xff1a;網頁包含誘導分享、關注等誘導行為內容&#xff0c;被多人投訴&#xff0c;為維護綠色上網環境&#xff0c;已經停止訪問該網頁。 雷鋒網了解到&#x…

Visual C++利用Intel C++ 編譯器提升多核性能與多媒體指令支持獲取更高的程序效率與縮小程序體積

Intel c編譯器有下列優點&#xff0c;建議VC項目開發采用intel c編譯器取代VS自帶c編譯器&#xff1a; 與 Microsoft Visual C 相兼容&#xff0c;可以嵌入 Microsoft Visual Studio 開發環境。 支持最新的多核處理器&#xff0c;并提供安全功能&#xff0c;可以通過執行堆棧…

Backtrader交易基礎

查看賬戶情況&#xff1a; class TestStrategy(bt.Strategy):def next(self):print(當前可用資金, self.broker.getcash())print(當前總資產, self.broker.getvalue())print(當前持倉量, self.broker.getposition(self.data).size)print(當前持倉成本, self.broker.getpositio…

IP地址分類/IP地址10開頭和172開頭和192開頭的區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 IP地址分類/IP地址10開頭和172開頭和192開頭的區別/判斷是否同一網段 簡單來說在公司或企業內部看到的就基本都是內網IP&#xff0c;AB…

Redis數據結構之簡單動態字符串SDS

Redis的底層數據結構非常多&#xff0c;其中包括SDS、ZipList、SkipList、LinkedList、HashTable、Intset等。如果你對Redis的理解還只停留在get、set的水平的話&#xff0c;是遠遠不足以應對面試提問的。本文簡單介紹了Redis底層最重要的數據結構 - 簡單動態字符串&#xff08…

Centos7 安裝OpenTSDB

Centos7 安裝OpenTSDB https://www.imzcy.cn/1697.html轉載于:https://www.cnblogs.com/RHadoop-Hive/p/10563385.html

職場潛規則冷思考:別讓老板“殺”了你

一位3年前共事過的同事走了&#xff0c;就在他以200多萬的房貸代價拿到大門鑰匙的時候&#xff0c;猝然倒在新房的樓梯上。另一個曾經在同一戰壕里沖鋒陷陣的同事被老板辭掉了&#xff0c;兢兢業業&#xff0c;起早貪黑&#xff0c;竟然沒有熬過35歲下崗這一關&#xff0c;這時…

Backtrader交易基礎2

成交價格確定&#xff1a; Order.Market 市價單&#xff0c;以當時市場價格成交的訂單&#xff0c;不需要自己設定價格。市價單能被快速達成交易&#xff0c;防止踏空&#xff0c;盡快止損/止盈&#xff1b; 按下一個 Bar &#xff08;即生成訂單的那個交易日的下一個交易日&…

windows 小技巧

2019獨角獸企業重金招聘Python工程師標準>>> 桌面圖標顯示不全、圖標呈現白色方塊 ie4uinit -show 關閉占用指定端口的進程 獲取進程: netstat -ano | findstr 端口號關閉進程&#xff1a;taskkill -f -pid 進程號文件被占用 打開任務管理器&#xff0c;切換到 性能…

進一步了解 apt-get 的幾個命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 用 apt-get 也很久了&#xff0c;沒多想它的實現&#xff0c;最近遇到 gstreamer 裝不上的問題&#xff0c;才多看看了它 apt-get 就是…

java學習筆記20(Arraylist復習,Collection接口方法,迭代器,增強型for循環)

集合&#xff1a;集合是Java提供的一種容器&#xff0c;可以用來存儲多個數據&#xff1b; 集合與數組的區別&#xff1a;集合的長度是可變的&#xff0c;數組的長度是固定的 集合中存儲的數據必須是引用類型數據&#xff1b; ArrayList回顧&#xff1a; public class Person {…

backtrader數據基礎

cerebro bt.Cerebro() cerebro.addstrategy(TestStrategy2) codes[600862.SH,300326.SZ,300394.SZ] #加載最近兩日交易數據 for code in codes:feed Addmoredata(dataname get_data(code,20200506),namecode)cerebro.adddata(feed) cerebro.run() 數據查看&#xff1a; cl…

談判學:三招了解對方底線

導讀&#xff1a;談判者都希望能了解對方的底線&#xff0c;最直接的一招就是將對手變成“朋友”&#xff0c;只是這種“內奸法”畢竟不是常規之法。大多數情況下&#xff0c;談判雙方也不可能像《無間道》一樣在對方陣營安放臥底&#xff0c;但是我們完全可以通過一些辦法來揣…

JSLint檢測Javascript語法規范

前端javascript代碼編寫中&#xff0c;有一個不錯的工具叫JSLint&#xff0c;可以檢查代碼規范化&#xff0c;壓縮JS&#xff0c;CSS等&#xff0c;但是他的語法規范檢查個人覺得太“苛刻”了&#xff0c;會提示各種各樣的問題修改建議&#xff0c;有時候提示的信息我們看的莫名…

Apt 命令解說(apt-get update、apt-cache search package、apt-get install package、apt-get remove )

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 高級打包工具&#xff08;英語&#xff1a;Advanced Packaging Tools&#xff0c;縮寫為APT&#xff09;是Debian及其派生發行版的軟件包…

SQL SERVER 2012 AlwaysOn - 維護篇 03

搭建 AlwaysOn 是件非常繁瑣的工作&#xff0c;需要從兩方面考慮&#xff0c;操作系統層面和數據庫層面&#xff0c;AlwaysOn 非常依賴于操作系統&#xff0c;域控&#xff0c;群集&#xff0c;節點等概念&#xff1b; DBA 不但要熟悉數據庫也要熟悉操作系統的一些概念&#xf…

指標研究與多周期

哪些地方會用到指標 &#xff1f; 回顧一下 Backtrader 的主要功能模塊和回測流程&#xff08;見&#xff1a;Backtrader 來了&#xff01;&#xff09;可以發現&#xff0c;只有在編寫策略Strategy 時才會涉及到指標的計算和使用&#xff0c;而且是 Strategy 中的 __init__()…

區塊鏈BAAS平臺:公共或私人區塊鏈編程以用于各種用途

2019獨角獸企業重金招聘Python工程師標準>>> 人們可以為公共或私人區塊鏈編程以用于各種用途。理論上&#xff0c;我認為犧牲權力下放的方面可以解決區塊鏈技術背后的許多當前問題。區塊鏈仍然可以包容&#xff0c;而不是分散。這如何解決當前的一些問題&#xff1f…